将子模块的寄存器添加到对其进行新/实例化的模块的regmap()中

时间:2019-07-16 09:55:10

标签: chisel

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

那没有编译。如何添加子模块的寄存器? 当我需要在外围设备的第一个甚至某些本地寄存器之后添加更多子模块时,该怎么办?

1 个答案:

答案 0 :(得分:2)

您可以尝试以下方法吗?我认为您需要先将两个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)
          ):_*
        )
    }