https://mp.weixin.qq.com/s/rgCRorjPYyyD6i7moIzbZg
介绍LazyModule和Node构造方法的执行过程,即实例化过程。
1. NullIntSource
以NullIntSource为例,将其作为顶层的LazyModule考虑:
2. LazyModule实例化过程
1) 执行NullIntSource的构造方法,首先要逐层向上找到各个父类,然后逐层向下执行各个父类的构造方法;
。之后再添加的LazyModule都会加入到这个scope中。
b. 把本LazyModule加入到父LazyModule中:
因为这里把NullIntSource作为顶层LazyModule,所以parent为None,不执行实际添加。
节点;
其中首先执行BaseNode的构造方法,把当前节点加入到LazyModule.scope中:
d. 定义lazy val module:
intnode是一个source节点,没有输入只有输出。module的实现中默认让intnode.out输出0。因为是lazy变量,所以定义时并不执行,而是在引用时执行。
NullIntSource实例化之后,构建了基于LazyModule的层次结构。每个LazyModule内部的LazyModule和Node也都填充完毕,但是彼此之间的还没有连接。
3. LazyModuleImp实例化
lazy val module是LazyModuleImp匿名子类的实例,引用这个module时会对其进行实例化。
在引用的时候,会对这个匿名子类进行实例化。首先逐层向上找到其父类,然后逐层向下执行每个父类的构造方法。
LazyModuleImpLike和MultiIOMultiIOModule的构造方法;
然后执行LazyModuleImp的父类的构造方法:
这里会调用instantiate()方法,把内部的所有LazyModule和Node成对的连接连在一起。
c. 执行匿名子类的构造方法,实现NullIntSource的内部逻辑:
主要是连接内部的LazyModule和Node,及赋初始值等。
4. 总结
a. LazyModule提供一个框架,以容纳内部LazyModule和节点,即实现模块层次结构(hierarchy);
为内部模块提供连接);
c. Node为LazyModule提供参数协商支持,而后提供输入输出连接;不能嵌套,也没有内部逻辑;
5. 附录
NullIntSource.scala:
// See LICENSE.SiFive for license details.
freechips.rocketchip.interrupts
Chisel._
freechips.rocketchip.config.Parameters
freechips.rocketchip.diplomacy._
/** Useful for stubbing out parts of an interrupt interface where certain devices might be missing */
LazyModule
{
(num, ports, sources))
) {
.B } }
}
}
NullIntSource {
= {
NullIntSource(num, ports, sources))
intnode
}
}