Chisel3:部分分配给Vector IO的多位片

时间:2017-07-28 12:44:53

标签: chisel

可以按如下方式对矢量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)

我在这里使用的例子仅用于演示目的。

1 个答案:

答案 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 }