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

问题描述

我是 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))?

解决方法

我想知道在 Chisel 开始设计任何电路之前是否可以在软件中计算常数

除非我误解了你的问题,否则这就是 Chisel 的工作原理。

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

现在,程序中的值按照 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))
    //...
    //...
}