微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在凿子中自由分配vec型变量的值?

如何解决如何在凿子中自由分配vec型变量的值?

我定义了一些vec变量。

val r_parameters = Wire(Vec(RANK,UInt(log2Ceil(RANK).W)))
val test0  = Wire(Vec(RANK,UInt(width.W)))
val test1  = Wire(Vec(RANK,UInt(width.W)))

我尝试使用for循环进行分配。

for (i <- 0 to RANK-1)
{
    test0(r_parameters(i)) := test1(i)
}

变量“ r_parameters”来自rom或ram。如果参数“ RANK”为4,则r_parameters的形式为“ 0 3 2 1”或“ 0 1 2 3”。因此,所有test0都被分配了。但是firrtl编译器报告test0尚未完全初始化。

解决方法

我认为问题在于firrtl编译器无法确定test0的每个元素都已初始化为某种东西。我已经填写了您的示例,提供了值并对此进行了一些样式上的更改。

class Wires extends MultiIOModule {
  val RANK = 4
  val bits = 8

  // set to 0,3,2,1
  val r_parameters = VecInit(Seq(0,1).map(_.U) )

  val test0  = Wire(Vec(RANK,UInt(bits.W)))

  // Give values to test1
  val test1  = VecInit(Seq.tabulate(RANK) { i => i.U } )

  // Wire test1 into test using the map provided by r_parameters
  for (i <- test0.indices) {
    test0(r_parameters(i)) := test1(i)
  }
}

如果您使用以下命令转储发出的firrtl

println((new ChiselStage).emitFirrtl(new Wires))

您将看到

test0[r_parameters[0]] <= test1[0] @[MemBank.scala 56:28]
test0[r_parameters[1]] <= test1[1] @[MemBank.scala 56:28]
test0[r_parameters[2]] <= test1[2] @[MemBank.scala 56:28]
test0[r_parameters[3]] <= test1[3] @[MemBank.scala 56:28]

Firrtl无法确认r_parameters是否已彻底连接test0。

一个重要的问题是,您是否需要将r_parameters用作Vec而不是Seq。如果您将上面的r_parameters更改为

val r_parameters = Seq(0,1)

该模块将正确编译。我怀疑这就是您想要的。如果确实需要r_parameters作为动态索引,则需要重构代码。可以添加

test0 := DontCare

在您的循环前面,但在这种情况下,我不建议您这样做。 希望这会有所帮助,祝大家凿凿愉快!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。