我正在尝试将子模块的寄存器添加到实例化的模块中。我的用例是火箭芯片中的外围设备,其中包含一些硬件引擎,例如带有sha1引擎的加密外围设备。我已经将sha1实现为具有自己的一组控制寄存器的子模块
class sha1 extends Module {
....
def sha1RegMap(offset: Int): Seq[(Int, Seq[RegField])] = {
val regs = Seq(
(offset) -> Seq(Regfield(32,reg1,RegFileDesc("r1",""))),
(offset + 4) -> Seq(Regfield(32,reg2,RegFileDesc("r2",""))),
(offset + 8) -> Seq(Regfield(32,reg3,RegFileDesc("r3",""))),
)
regs
}
....
}
然后我尝试将其添加到包含外围模块中:
lazy val module = new LazyModuleImp(this) {
...
val sha1_engine = Module(new sha1)
...
regmap(
0x0 -> Seq(Regfield(32,creg1,RegFileDesc("cr1",""))),
0x4 -> Seq(Regfield(32,creg2,RegFileDesc("cr2",""))),
0x8 -> Seq(Regfield(32,creg3,RegFileDesc("cr3",""))),
++ sha1_engine.sha1RegMap(0xC):_*
)
}
那没有编译。如何添加子模块的寄存器?另外,当我需要在第一个子模块甚至外围设备本身的一些本地寄存器之后添加更多子模块时呢?
你能试试以下方法吗?我认为您需要先将两个Seq
加在一起将它们转换为带有 :_* 运算符的参数列表。我可能有比必要的更多的括号。
lazy val module = new LazyModuleImp(this) {
...
val sha1_engine = Module(new sha1)
...
regmap(
(
Seq(
0x0 -> Seq(Regfield(32,creg1,RegFileDesc("cr1",""))),
0x4 -> Seq(Regfield(32,creg2,RegFileDesc("cr2",""))),
0x8 -> Seq(Regfield(32,creg3,RegFileDesc("cr3","")))
)
++ sha1_engine.sha1RegMap(0xC)
):_*
)
}