如何解决如何在凿子中自由分配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 举报,一经查实,本站将立刻删除。