问题描述
我是 Chisel 的新手,我想知道在 Chisel 开始设计任何电路之前是否可以在软件中计算常数。例如,我有一个带有一个参数 myParameter
的模块,但是我想从这个参数派生出更多变量(constant1
和 constant2
),这些变量稍后将用于初始化寄存器。
class MyModule(myParameter: Int) extends Module {
val io = IO(new Bundle{
val in = Input(SInt(8.W))
val out = Output(SInt(8.W))
})
val constant1 = 2 * myParameter
val constant2 = 17 * myParameter
val register1 = RegInit((constant1).U(8.W))
val register2 = RegInit((constant2).U(8.W))
//...
//...
}
有没有办法配置 Chisel 的功能,以便 MyModule(2)
的实例将首先评估软件中的所有 Scala val:constant1 = 2 * 2 = 4
和 constant2 = 17 * 2 = 34
。然后继续实例化和初始化寄存器 register1 = RegInit(4.U(8.W))
和 register2 = RegInit(34.U(8.W))
?
解决方法
我想知道在 Chisel 开始设计任何电路之前是否可以在软件中计算常数
除非我误解了你的问题,否则这就是 Chisel 的工作原理。
从根本上说,Chisel 是一个 Scala 库,其中执行您编译的 Scala 代码会创建硬件。这意味着您的 Chisel 中的任何纯 Scala 代码仅存在于精化时间,即在执行此 Scala 程序(我们称之为 生成器)期间。 >
现在,程序中的值按照 Scala 定义的顺序创建(与任何通用编程语言或多或少相同)。例如,io
是在 constant1
和 constant2
之前定义的,因此 io
的 Chisel 对象将在计算任一常量之前创建,但这对于你的问题的目的。
Chisel 中的一个常见做法是创建自定义类以在您拥有大量参数时保存参数。在这种情况下,您可以执行类似的操作:
// Note this doesn't extend anything,it's just a Scala class
// Also note myParameter is a val now,this makes it accessible outside the class
class MyParameters(val myParameter: Int) {
val constant1 = 2 * myParameter
val constant2 = 17 * myParameter
}
class MyModule(params: MyParameters) extends Module {
val io = IO(new Bundle{
val in = Input(SInt(8.W))
val out = Output(SInt(8.W))
})
val register1 = RegInit((params.constant1).U(8.W))
val register2 = RegInit((params.constant2).U(8.W))
//...
//...
}