• Rocket


    https://mp.weixin.qq.com/s/rgCRorjPYyyD6i7moIzbZg

     
    介绍LazyModule和Node构造方法的执行过程,即实例化过程。
     
     
    1. NullIntSource
     
    以NullIntSource为例,将其作为顶层的LazyModule考虑:
     
     
    2. LazyModule实例化过程
     
    1) 执行NullIntSource的构造方法,首先要逐层向上找到各个父类,然后逐层向下执行各个父类的构造方法;
     
    a. 最开始执行LazyModule类的构造方法:用于构造LazyModule层级结构的是:LazyModule.scope = Some(this)。之后再添加的LazyModule都会加入到这个scope中。
     
    b. 把本LazyModule加入到父LazyModule中:
    因为这里把NullIntSource作为顶层LazyModule,所以parent为None,不执行实际添加。
     
    c. 执行NullIntSource的构造方法,创建intnode节点;
     
    其中首先执行BaseNode的构造方法,把当前节点加入到LazyModule.scope中:
     
    d. 定义lazy val module:
     
    intnode是一个source节点,没有输入只有输出。module的实现中默认让intnode.out输出0。因为是lazy变量,所以定义时并不执行,而是在引用时执行。
     
    2) 从上可知,在NullIntSource实例化之后,构建了基于LazyModule的层次结构。每个LazyModule内部的LazyModule和Node也都填充完毕,但是彼此之间的还没有连接。
     
     
    3. LazyModuleImp实例化
     
    lazy val module是LazyModuleImp匿名子类的实例,引用这个module时会对其进行实例化。
     
    在引用的时候,会对这个匿名子类进行实例化。首先逐层向上找到其父类,然后逐层向下执行每个父类的构造方法。
     
    a. 首先执行LazyModuleImpLike和MultiIOMultiIOModule的构造方法;
    b. 然后执行LazyModuleImp的父类的构造方法:
    这里会调用instantiate()方法,把内部的所有LazyModule和Node成对的连接连在一起。
    c. 执行匿名子类的构造方法,实现NullIntSource的内部逻辑:
    主要是连接内部的LazyModule和Node,及赋初始值等。
     
     
    4. 总结
     
    a. LazyModule提供一个框架,以容纳内部LazyModule和节点,即实现模块层次结构(hierarchy);
    b. LazyModuleImp实现LazyModule的逻辑(其中为内部模块提供连接);
    c. Node为LazyModule提供参数协商支持,而后提供输入输出连接;不能嵌套,也没有内部逻辑;
     
     
    5. 附录
     
    NullIntSource.scala:
    // See LICENSE.SiFive for license details.
     
    package freechips.rocketchip.interrupts
     
    import Chisel._
    import freechips.rocketchip.config.Parameters
    import freechips.rocketchip.diplomacy._
     
    /** Useful for stubbing out parts of an interrupt interface where certain devices might be missing */
    class NullIntSource(num: Int = 1, ports: Int = 1, sources: Int = 1)(implicit p: Parameters) extends LazyModule
    {
    val intnode = IntSourceNode(IntSourcePortSimple(num, ports, sources))
     
    lazy val module = new LazyModuleImp(this) {
    intnode.out.foreach { case (o, _) => o.foreach { _ := false.B } }
    }
    }
     
    object NullIntSource {
    def apply(num: Int = 1, ports: Int = 1, sources: Int = 1)(implicit p: Parameters): IntNode = {
    val null_int_source = LazyModule(new NullIntSource(num, ports, sources))
    null_int_source.intnode
    }
    }
  • 相关阅读:
    Linux Shell中管道的原理及C实现框架
    标准文件描述符与标准文件句柄
    Makefile:如何写目标依赖
    CODING 携手优普丰,道器合璧打造敏捷最佳实践
    CODING 邀您参与品牌认知度调查 赢得机会领取猴子抱枕好礼
    敏捷,持续集成/持续交付, DevOps 三者的区别
    从 IT 到 DevOps 实践
    腾讯云大学 x CODING | 远程协作办公新模式
    共同战“疫”,CODING 帮助研发团队高效协同
    研发团队远程办公——如何应用硬核工具无间协作?
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10504419.html
Copyright © 2020-2023  润新知