scala Chisel IO包,适用于给定Chisel硬件类型的任何宽度

eni9jsuy  于 2023-10-18  发布在  Scala
关注(0)|答案(1)|浏览(109)

在chisch中,你可以有一个像下面这样的硬件生成函数:

def hw_func(x: Vec[UInt]) : Vec[UInt] = x  // useless I know

其中形式参数和返回值没有指定向量的宽度,这意味着以下内容有效:

val x4 = Wire(Vec(6, UInt()))
val y4 = Wire(Vec(6, UInt()))

y4 := hw_func(y32)

val x32 = Wire(Vec(32, UInt()))
val y32 = Wire(Vec(32, UInt()))

y32 := hw_func(x32)

然而,假设我有一个Module类而不是一个函数:

class hw_module(widthX: Int, widthY: Int) extends Module {
  val io = IO( new Bundle {
    val x = Input(Vec(widthX, UInt))
    val y = Input(Vec(widthY, UInt))
  })
  y := x
}

我必须使用泛型来参数化输入和输出,这意味着当我示例化模块类时,我必须显式地传入宽度参数,而不是像函数那样让编译器推断宽度,如下所示:

val x4 = Wire(Vec(6, UInt()))
val y4 = Wire(Vec(6, UInt()))
val inst4 = hw_module(4, 4)

inst4.io.x := x4
y4 := inst4.io.y

val x32 = Wire(Vec(32, UInt()))
val y32 = Wire(Vec(32, UInt()))
val inst4 = hw_module(32, 32)

inst32.io.x := x32
y4 := inst32.io.y

这是相当多的冗长(特别是如果说,我有很多的i/o,他们都可能有不同的宽度!).
有没有一种方法可以实现在带有Module类的函数hw生成器中看到的io宽度的推断?

nx7onnlm

nx7onnlm1#

您可以使用type parameterchisel-doc)创建更通用的模块或包

class Foo[T <: Data](gen: T) extends Module {
  val io = IO(new Bundle {
    val x = Input(gen)
    val y = Output(gen)
  })

  io.x <> io.y
}

class Bar extends Module {
  val io = IO(new Bundle {
    val x1 = Input(Vec(6, UInt(32.W)))
    val x2 = Input(UInt(16.W))
    val x3 = Input(Bool())
    val y1 = Output(Vec(6, UInt(32.W)))
    val y2 = Output(UInt(16.W))
    val y3 = Output(Bool())
  })

  val foo1 = Module(new Foo(io.x1.cloneType))
  val foo2 = Module(new Foo(io.x2.cloneType))
  val foo3 = Module(new Foo(io.x3.cloneType))

  io.x1 <> foo1.io.x
  io.x2 <> foo2.io.x
  io.x3 <> foo3.io.x
  
  io.y1 <> foo1.io.y
  io.y2 <> foo2.io.y
  io.y3 <> foo3.io.y 
}

相关问题