将子模块的寄存器添加到 new/instantiate 它的模块的 regmap()

Add registers of sub-module to the regmap() of a module that new/instantiate it

我正在尝试将子模块的寄存器添加到正在实例化的模块中。我的用例是火箭芯片中的外围设备,其中包含一些硬件引擎,例如带有 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)
          ):_*
        )
    }