介绍构建硬件模型的Builder。
1. DynamicContext
动态上下文,供构建硬件模型时,存放上下文状态信息。
2. Builder
Builder使用DynamicContext存储数据。供其他类获取和存储信息使用。
3. ClockAndReset
这里以clock和reset为例。
1) DynamicContext中,定义了currentClockAndReset:
var currentClockAndReset: Option[ClockAndReset] = None
Builder中为:
可以用这些进行获取和设置。
2) 在模块实例化的时候赋值
3) 临时更换clock或reset
在MultiClock.scala中,定义了如下方法:
a. 临时更换clock, withClock:
b. 临时更换reset, withReset:
c. 临时更换clock和reset, withClockAndReset:
更换clock和reset之后,再执行block所代表的代码块。
4) 使用Builder中的clock和reset
a. 创建寄存器Reg():
构建硬件模型时,DefReg中包含了从Builder中获取的clock。
b. 创建带初始值的RegInit():
这里构建这个寄存器的命令DefRegInit里,包含了从Builder中获取的clock和reset。
所以3)中,临时更换Builder.clockAndReset然后在执行block时,如果有创建寄存器,则其使用的clock/reset即为临时更改后的。
4. 附录
private[chisel3] class DynamicContext() {
val idGen = new IdGen
val globalNamespace = Namespace.empty
val components = ArrayBuffer[Component]()
val annotations = ArrayBuffer[ChiselAnnotation]()
var currentModule: Option[BaseModule] = None
// Set by object Module.apply before calling class Module constructor
// Used to distinguish between no Module() wrapping, multiple wrappings, and rewrapping
var readyForModuleConstr: Boolean = false
var whenDepth: Int = 0 // Depth of when nesting
var currentClockAndReset: Option[ClockAndReset] = None
val errors = new ErrorLog
val namingStack = new internal.naming.NamingStack
// Record the Bundle instance, class name, method name, and reverse stack trace position of open Bundles
val bundleStack: ArrayBuffer[(Bundle, String, String, Int)] = ArrayBuffer()
}