如何在chisel中自由给vec类型变量赋值?
How to freely assign values to vec type variables in chisel?
我定义了一些 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, 3, 2, 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, 3, 2, 1)
模块将正确编译。我怀疑这就是你想要的。如果你真的需要 r_parameters 是一个动态索引,你需要重构你的代码。可以添加
test0 := DontCare
在你的循环前面,但在这种情况下我不推荐它。
希望这对您有所帮助,开凿愉快!
我定义了一些 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, 3, 2, 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)
}
}
如果使用
转储发出的 firrtlprintln((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, 3, 2, 1)
模块将正确编译。我怀疑这就是你想要的。如果你真的需要 r_parameters 是一个动态索引,你需要重构你的代码。可以添加
test0 := DontCare
在你的循环前面,但在这种情况下我不推荐它。 希望这对您有所帮助,开凿愉快!