首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效Vec的注册表(Vec

有效Vec的注册表(Vec
EN

Stack Overflow用户
提问于 2021-02-10 05:46:50
回答 1查看 45关注 0票数 2

由于使用不同大小的Vecs,我不断收到错误。有没有一种方法可以让bcd都从a中获取它们各自的Vec元素。

代码语言:javascript
复制
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
}

这是我收到的错误消息。

代码语言:javascript
复制
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.
EN

回答 1

Stack Overflow用户

发布于 2021-02-10 07:49:41

您可以使用slice方法获取任何Scala Seq的一部分(Chisel的Vec扩展Seq):

代码语言:javascript
复制
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中迭代相应的元素。如果其中一个比另一个长,它就会截断为较短的那个。下面的代码在功能上与使用slicefor循环相同

代码语言:javascript
复制
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
  }
}

注意没有任何索引,无论大小如何,它都可以工作,所以我们可以在一个可重用的函数中使用它:

代码语言:javascript
复制
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
    }
  }
}

然后,我们可以使用此函数进行所有连接:

代码语言:javascript
复制
nestedConnect(b, a)
nestedConnect(c, a)
nestedConnect(d, a)

说明此方法有效的可执行示例:https://scastie.scala-lang.org/SFh1PratTCWhxHc55VGeHg

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66127663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档