我可以在 Chisel 开始设计硬件之前在软件中计算常量吗?

Can I compute constants in software before Chisel begins designing hardware?

我是 Chisel 的新手,我想知道是否可以在 Chisel 开始设计任何电路之前在软件中计算常量。例如,我有一个带有一个参数 myParameter 的模块,但是我想从这个参数中导出更多变量(constant1constant2),这些变量稍后将用于初始化注册。

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 = 4constant2 = 17 * 2 = 34。然后继续实例化和初始化寄存器 register1 = RegInit(4.U(8.W))register2 = RegInit(34.U(8.W))?

I was wondering if it's possible to calculate constants in software before Chisel begins designing any circuitry

除非我误解了你的问题,否则 Chisel 实际上就是这样工作的。

从根本上说,Chisel 是一个 Scala 库,执行 已编译的 Scala 代码会创建硬件。这意味着您的 Chisel 中的任何纯 Scala 代码仅存在于 elaboration 时间,即在执行此 Scala 程序期间(我们称之为 generator).

现在,程序中的值是按 Scala 定义的顺序创建的(与任何通用编程语言大致相同)。例如,io 定义在 constant1constant2 之前,因此 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))
    //...
    //...
}