Chisel3 - model - UserModule commands

 
介绍UserModule类中,如何管理构建硬件模型所需的命令。
 
 
1. _commands
 
private val _commands = ArrayBuffer[Command]()
 
_commands中存放了构建模块所需的全部命令。
 
 
1) 添加命令:addCommand
 
a. 需要没有close:_closed意为模块构建所需已经齐备,不能再向其中添加内部数据和逻辑定义;
b. 把c添加到_commands中;
 
2) 获取所有命令:getCommands
 
 
a. 需要已经close,意为模块构建所需已经齐备;
b. 返回全部命令:_commands.toSeq
 
2. Builder.pushCommand()
 
 
addCommand()通过pushCommand()调用,将命令c添加到正在构建的模块(forcedUserModule)之中。
 
3. _closed
 
 
_closed定义与BaseModule类中,为该类数据成员,protected表明子类可以直接读写访问。
 
_closed是一个标志:标志着模块定义是否已经完成,即所需的各个内部数据变量、内部逻辑是否已经全部添加到模块中。亦即构建模块的硬件模型所需的所有命令已经齐备,可以开始构建了。
 
总结并简而言之,即过程分为两个阶段:定义、构建。而_closed标志着模块定义阶段的结束。也可以用来表明可以开始构建阶段了。
 
 
4. forcedUserModule
 
pushCommand()调用forcedUserModule.addCommand(c)把命令c加入到forcedUserModule中。
 
forcedUserModule定义如下:
可知,其为Option包裹着的UserModule,即currentModule拆包而来;
 
currentModule定义如下:
currentModule基于动态上下文(dynamicContext)中定义的变量currentModule。其赋值可以直接使用“currentModule = xxx”的形式。
 
currentModule定义与Builder类中,其赋值的地方为:
 
直接定义在BaseModule的类体中,每一个BaseModule类的子类实例化时,都要执行这个代码。所以Builder.currentModule的值即为当前实例化的模块。
 
如下代码中FullAdder即为Module的子类,亦即BaseModule的子类:
 
所以new FullAdder()时,会执行到Builder.currentModule = Some(this)这行代码,而把currentModule设置为正在创建(new)的这个FullAdder模块。
 
所以后续pushCommand()时,都是添加到这个FullAdder模块中。
 
 
 
posted @ 2019-01-02 11:35  wjcdx  阅读(337)  评论(0编辑  收藏  举报