【问题标题】:How to iterate through similar registers definition in Chisel (regmap)如何在 Chisel (regmap) 中遍历类似的寄存器定义
【发布时间】:2018-12-13 06:22:58
【问题描述】:

我有一些类似的寄存器定义,我想写在 regmap 构造下。 我的代码目前如下所示:

val regs = RegInit(Vec(Seq.fill(5)(0.U(32.W))))

regmap (
...
0x30 -> Seq(RegField(32,regs(0),RegFieldDesc("reg0",""),
0x34 -> Seq(RegField(32,regs(1),RegFieldDesc("reg1",""),
0x38 -> Seq(RegField(32,regs(2),RegFieldDesc("reg2",""),
0x3C -> Seq(RegField(32,regs(3),RegFieldDesc("reg3",""),
0x40 -> Seq(RegField(32,regs(4),RegFieldDesc("reg4",""),
...

) 

我的问题是,有没有办法使用 Scala 迭代器以更简洁的方式编写上述内容? 我的另一个要求是我仍然需要能够在此迭代器之前和之后添加寄存器(3 点线)。

我相信,使用迭代器可以很好地防止复制/粘贴错误并且看起来更好。
提前感谢您的帮助。

【问题讨论】:

    标签: chisel rocket-chip


    【解决方案1】:

    我认为这种模式可能类似于

    val regs = RegInit(Vec(Seq.fill(5)(0.U(32.W))))
    
    val tuples = regs.zipWithIndex.map { case (reg, i) =>
      (0x30 + (i * 4)) -> Seq(RegField(32,regs,RegFieldDesc(s"reg$i","")))
    }
    regmap(tuples :_*)
    

    唯一的魔力是 :_* 它将一个序列转换为一个参数列表。你也不需要我使用的多个步骤,我只是想让它更容易看到发生了什么.

    【讨论】:

    • 感谢@Chick Markley 的回答,我对 :_* 有点困惑。你能详细说明一下,或者指向一个网络资源来了解它吗?
    • 结帐stackoverflow.com/questions/6051302/…。基本上 in 将 Seq/Collection 转换为可以使用 varargs 签名填写函数参数的形式,例如 f(varArgs: Int*)。这很酷,但不会经常出现
    • 逗号@Chick Markley 怎么样,我需要将它们添加到创建循环体的元组中吗?
    • 我也得到了下一个错误,当我尝试这样做时:“这里不允许使用 `: *' 注释 [错误](这种注释只允许在 *-parameters 的参数中使用)[错误] iqRegs :*"
    • 你能提供一个代码sn-p吗,我不确定你指的是什么逗号,或者是哪一行给出了注释错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多