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
}
}

Rocket - diplomacy - LazyModule的实例化(补)的更多相关文章

  1. Rocket - diplomacy - LazyModule的实例化

    https://mp.weixin.qq.com/s/9PsBt4_4qHx4i6C5XtuiUw   介绍LazyModule和Node构造方法的执行过程,即实例化过程.     1. NullIn ...

  2. Rocket - diplomacy - LazyModule的组织方式

    https://mp.weixin.qq.com/s/vaDUekxkFkOJLmzg5jCngw 简单介绍LazyModule/LazyModuleImp的组织方式. 1. LazyModule L ...

  3. Rocket - diplomacy - LazyModule

    https://mp.weixin.qq.com/s/FBU8fE4u9-UK6mRGQOlvbQ   介绍LazyModule的实现.     ​​   1. children   LazyModu ...

  4. Rocket - diplomacy - LazyModule实例:Buffer

    https://mp.weixin.qq.com/s/j1M9ZOTtqvc1Fv9T6dy9kg   以tilelink下的Buffer为例,介绍LazyModule如何组织内部的节点和模块.   ...

  5. Rocket - diplomacy - LazyModuleImpLike

    https://mp.weixin.qq.com/s/gDbUto1qd7uWbpnxovr5pg   介绍LazyModuleImpLike类的实现.     1. wrapper   LazyMo ...

  6. Rocket - diplomacy - ValName

    https://mp.weixin.qq.com/s/so-2x5KLfYF0IMCCqNThwQ   简单调试ValName实现:   1. 使用     ​​   Desugar之后如下: ​​ ...

  7. Rocket - diplomacy - BaseNode

    https://mp.weixin.qq.com/s/eOgNLi_MJ8HJOpepGaaW8Q   简单介绍BaseNode的实现.   ​​   1. You cannot create a n ...

  8. Rocket - diplomacy - AddressAdjuster

    https://mp.weixin.qq.com/s/X0s5CWN84GEiwpNR7tiRgA 基于AddressAdjuster介绍LazyModule的实现.   参考链接:https://g ...

  9. Rocket - diplomacy - MixedNode

    https://mp.weixin.qq.com/s/zgeAI2n-2cHJi7-Ra5rYZA   介绍MixedNode的实现.     1. 类定义   ​​ ​​   2. inner/ou ...

随机推荐

  1. JSP+Servlet+JDBC+C3P0实现的人力资源管理系统

    项目简介 项目来源于:https://github.com/ruou/hr 本系统基于JSP+Servlet+C3P0+Mysql.涉及技术少,易于理解,适合JavaWeb初学者学习使用. 难度等级: ...

  2. Spring Cloud学习 之 Spring Cloud Hystrix(使用详解)

    文章目录 创建请求命令: 定义服务降级: 异常处理: 异常传播: 异常获取: 命令名称,分组以及线程池划分: 创建请求命令: ​ Hystrix命令就是我们之前说的HystrixCommand,它用来 ...

  3. Spring Batch 读 10 万条记录,写到 MongoDB

    实践内容 从 MariaDB 一张表内读 10 万条记录,经处理后写到 MongoDB . 具体实现 1.新建 Spring Boot 应用,依赖如下: <!-- Web 应用 --> & ...

  4. 【漫画】JAVA并发编程 J.U.C Lock包之ReentrantLock互斥锁

    在如何解决原子性问题的最后,我们卖了个关子,互斥锁不仅仅只有synchronized关键字,还可以用什么来实现呢? J.U.C包中还提供了一个叫做Locks的包,我好歹英语过了四级,听名字我就能马上大 ...

  5. Altium Designer PCB封装bug,元件焊盘位置偏移解决方法

    1.问题描述:在拖动几个电阻位置时,意外发现Altium designer20版本软件的一个bug——0805的电阻两焊盘位置发生了偏移,如下图所示. 2.解决办法: ①选中焊盘偏移的封装,右键剪切掉 ...

  6. 谈谈DDD

    从战略到战术,领域驱动设计(Domain Driven Design,DDD)给出了诸多关于软件架构.设计.建模与编码的方法和模式,以用于应对业务复杂度.然而,许多开发人员对于 DDD 的价值仍然心存 ...

  7. HDU 2017 (水)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2017 题目大意:给你段字符串,求出字符串中含有数字字符的个数 解题思路: 字符串输入输出的基本应用:h ...

  8. 五一以来,国产手机受到cmtwg, nkvhu, qhsz等几款恶意软件肆虐。

    受影响手机包括魅族,中国移动等国产手机. 5月12日开始有人在百度知道提问cmtwg,5月13日mx吧也有人在发贴. 我接到有问题的手机时间更早,大约就是五一之后. 出现问题的几个牌子的国产手机,似乎 ...

  9. C++语言字符串处理函数

    C++语言提供了比C语言更丰富的字符串处理功能.它可以在字符串上经行输入,输出,合并,修改,比较,转换,复制,搜索等操作.使用这些现成的功能可以大大减少我们的编程的负担. 输入和输出的字符串函数,如p ...

  10. webpack指南(二)code spliting+懒加载

    code spliting 把代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件. 代码分离可以用于获取更小的 bundle,以及控制资源加载优先级,如果使用合理,会极大缩减加载时 ...