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. 带"反悔"的贪心-超市

    题面:https://www.acwing.com/problem/content/description/147/ 超市里有N件商品,每个商品都有利润pi和过期时间di,每天只能卖一件商品,过期商品 ...

  2. Web概念

    目录 Web概念概述 Web概念概述 JavaWeb 使用 Java 语言开发基于互联网的项目 软件架构 C / S:Client / Server 客户端 / 服务器端 在用户本地有一个客户端程序, ...

  3. 74LS 系列 名称解释

    摘自:http://blog.sina.com.cn/s/blog_502ffce50100j9db.html -------------------------------------------- ...

  4. 导出jar包和api文档

    导出jar包过程 右击项目名称->export 选择java->JAR file next->选择路径 导出成功 生成api文档 选择doc->右键export java-&g ...

  5. JDBC01 mysql和navicat的安装

    navicat的安装 从网上下载的,详细过程,略 mysql8.0.11(win10,64)安装 1.下载 MySQL8.0 For Windows zip包下载地址:https://dev.mysq ...

  6. [csu1605]数独(精确覆盖问题)

    题意 :给定数独的某些初始值,规定每个格子的得分,求得分最大的数独的解. 思路:这是某年的noip的原题,高中时就写过,位运算也就是那个时候学会的--.这题明显是暴搜,但是需要注意两点,一是需要加一些 ...

  7. HDU 2017 (水)

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

  8. html中require.config 缓存问题

    在html中,require的官方基本用法如下: <!DOCTYPE html> <html> <head> <title>My Sample Proj ...

  9. 相机测试camera报告的问题

    AE问题 整体偏亮 整体偏暗 高光过爆 暗处过暗 对比度低/高 亮度: 关注暗处过暗 高光过爆   对比度: 关注头发,衣服 对比度低照片会有好像一层薄薄的,发蒙 关注植物,会有灰色的 AWB问题 偏 ...

  10. [tgpl]go匿名函数

    [tgpl]go匿名函数 0. 定义 匿名函数顾名思义是没有名字的函数, Named functions can be declared only at the package level, but ...