由于使用不同大小的Vecs,我不断收到错误。有没有一种方法可以让b、c和d都从a中获取它们各自的Vec元素。
val a = Reg(Vec(10, Valid(Vec(32, UInt(8.W)))))
val b = Reg(Vec(10, Valid(Vec(16, UInt(8.W)))))
val c = Reg(Vec(8, Valid(Vec(24, UInt(8.W)))))
val d = Reg(Vec(7, Valid(Vec(32, UInt(8.W)))))
for (i <- 0 to 10) {
b(i).bits := a(i).bits
}
for (i <- 0 to 8) {
c(i).bits := a(i).bits
}
for (i <- 0 to 7) {
d(i).bits := a(i).bits
}这是我收到的错误消息。
Connection between sink (UInt<8>[16](Reg in file)) and source (UInt<8>[32](Reg in file)) failed @: Sink and Source are different length Vecs.发布于 2021-02-10 07:49:41
您可以使用slice方法获取任何Scala Seq的一部分(Chisel的Vec扩展Seq):
val a = Reg(Vec(10, Valid(Vec(32, UInt(8.W)))))
val b = Reg(Vec(10, Valid(Vec(16, UInt(8.W)))))
for (i <- 0 until 10) {
b(i).bits := a(i).bits.slice(0, 16)
}这一切都是非常繁重的索引,依赖于知道你的Seqs的大小,我们可以使用Seq方法zip,它允许你在两个Vecs中迭代相应的元素。如果其中一个比另一个长,它就会截断为较短的那个。下面的代码在功能上与使用slice的for循环相同
for ((bb, aa) <- b zip a) { // I'm using infix notation: b zip a == b.zip(a)
for ((x, y) <- bb.bits zip aa.bits) {
x := y
}
}注意没有任何索引,无论大小如何,它都可以工作,所以我们可以在一个可重用的函数中使用它:
def nestedConnect(x: Vec[Valid[Vec[UInt]]], y: Vec[Valid[Vec[UInt]]]): Unit = {
for ((xx, yy) <- x zip y) {
for ((l, r) <- xx.bits zip yy.bits) {
l := r
}
}
}然后,我们可以使用此函数进行所有连接:
nestedConnect(b, a)
nestedConnect(c, a)
nestedConnect(d, a)说明此方法有效的可执行示例:https://scastie.scala-lang.org/SFh1PratTCWhxHc55VGeHg
https://stackoverflow.com/questions/66127663
复制相似问题