可以按如下方式对矢量IO进行部分分配:
import chisel3._
class example_1 extends Module {
val io = IO(new Bundle {
val in1 = Input(Vec(4, Bool())
val out1 = Output(Vec(4, Bool())
})
for (I <- 0 to 3){
io.out1(I) := io.in1(I)
}
}
是否可以对矢量的多位片进行部分分配。以下代码不起作用
import chisel3._
class example_1 extends Module {
val io = IO(new Bundle {
val in1 = Input(Vec(4, Bool())
val out1 = Output(Vec(4, Bool())
})
for (I <- 0 to 1){
io.out1((I*2)+2-1, I*2) := io.in1((I*2)+2-1, I*2)
}
}
可以假设这应该可以使用切片,但是,切片适用于引用io.in1向量的切片
val in1_sl = io.in1.slice(0, 2)
无法在赋值的LHS上使用切片来创建io.out1的切片:
io.out1.slice(0, 2) := io.in1.slice(0, 2)
我在这里使用的例子仅用于演示目的。
答案 0 :(得分:1)
我认为目前在凿子方面没有办法做到这一点。在LHS上使用slice意味着splice返回的集合不支持connect方法。话虽如此,以下似乎有效,但我没有考虑到它的所有含义。
class Slicer extends Module {
implicit class SeqHelper(val seq: Seq[Bits]) {
/**
* Promotes a Seq of Bits to a class that supports the connect operator
*/
def := (other: Seq[Bits]): Unit = {
seq.zip(other).foreach { case (a, b) => a := b}
}
}
val io = IO(new Bundle {
val in1 = Input(Vec(4, Bool()))
val out1 = Output(Vec(4, Bool()))
})
io.out1.slice(0, 2) := io.in1.slice(0, 2)
}
您可以将SlicerHelper放在包对象中,使其通常可访问。不那么奇特的习语可能会被考虑。
io.out1.slice(0, 2).zip(io.in1.slice(0, 2)).foreach { case (a, b) => a:= b }
或
io.out1.zip(io.in1).slice(0, 2).foreach { case (a, b) => a:= b }