首页 > 解决方案 > 在 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 的工作原理。

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

现在,您的程序中的值是按照 Scala 定义的顺序创建的(并且或多或少与任何通用编程语言相同)。例如,io在之前定义constant1constant2因此将在计算任一常量之前创建 Chisel 对象io,但这对于您的问题而言并不重要。

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))
    //...
    //...
}

推荐阅读