我对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值:constant1 = 2 * 2 = 4和constant2 = 17 * 2 = 34。然后继续实例化和初始化寄存器register1 = RegInit(4.U(8.W))和register2 = RegInit(34.U(8.W))
发布于 2021-03-16 00:28:27
我在想,在
开始设计任何电路之前,是否有可能在软件中计算常数
除非我误解了你的问题,事实上,这是切塞尔的工作方式。
从根本上说,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))
//...
//...
}https://stackoverflow.com/questions/66647412
复制相似问题