chisel - 在 Chisel 开始设计硬件之前,我可以在软件中计算常数吗?
问题描述
我是 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
因此将在计算任一常量之前创建 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))
//...
//...
}
推荐阅读
- python - 什么时候应该使用 python flask 条件和 jinja2 html 模板条件?
- php - 日期字段不想显示
- javascript - 无法循环遍历我构建的 URL 数组以转到子页面以使用 puppeteer 进行抓取
- python-3.x - 使用 .pack 的状态栏没有超出我的 .grid 框架
- javascript - 如何根据时间自动更改 CSS 类?
- ios - 'NSApp' 在 Mac 的 UIKit 中不可用:如何在 macOS 上的 iOS 应用程序中嵌入仅 Mac 框架?
- python - 无法从“a class”的beautifulsoup 中获取href
- rest - 使用 Flask 创建端点参数的约定?
- javascript - 当我为视频元素指定 css 类名时,为什么我的 html 会被覆盖?
- javascript - javascript中的嵌套MongoDB查询