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. Linux内核驱动学习(四)Platform设备驱动模型

    Linux platform设备驱动模型 文章目录 Linux platform设备驱动模型 前言 框架 设备与驱动的分离 设备(device) 驱动(driver) 匹配(match) 参考 前言 ...

  2. HMM-前向后向算法

    基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,...\) \(\lambda(A,B,\pi)\) 状态转移概率 \(A = \{a ...

  3. .net core 3.1 在iis上的发布(踩坑)

    写这篇文章的目的是希望像我一样喜欢.net 的人在发布 core到 iis上时少走点弯路 网上找了些资料,其实实际操作比较简单,就是有几个坑很恶心 首先是你的服务器需要有core 的运行环境,安装前先 ...

  4. 我的linux学习日记day1

    红帽考试 1.RHCSA ------>RHCE 210/300分 2015 RHEL7 2020 RHCE8 8月1改每个月25号 所以我如果想要在6月份考试,就要在 5月25前预约一个考场可 ...

  5. 一个排查了大半天儿的问题,差点又让 MyBatis 背锅

    我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...

  6. 这道LeetCode题究竟有什么坑点,让它的反对是点赞的9倍?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第38篇文章,我们一起来看看第65题,Valid Number. 曾经我们聊到过算法当中的一个类别--模拟题.所 ...

  7. 微信小程序var和let以及const有什么区别

    微信小程序var和let以及const的区别: 在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循 ...

  8. 5.8 Go 单元测试

    5.8 Go 单元测试 如果你不想后半生的美好时光都在寻找BUG中度过,那么必须写些程序用来检测产品代码的结果和预期的一样. Go语言的测试依赖于go test测试命令和一组按约定方式编写的测试函数, ...

  9. linux常用命令---网络端口信息与进程管理

    进程管理 进程管理

  10. 你想了解的python基础数据类型这里都有

    目录 python基础数据总结 数字型数据类型 数字型数据基本知识 算术运算符 进制 二进制运算符 字符串数据类型 字符串基础知识 字符串数据操作方法(增 查 改) 集合数据类型 集合基础知识 集合元 ...