chisel - 当我们应该在 chisel3 中使用 ":=" 而不是 "=" 时,相同的情况是 "when" 和 "if"
问题描述
最近我在学习chisel3,我有以下问题:我们应该何时使用“:=”而不是“=”相同的情况是“何时”和“如果”。或者您能否为这些情况提供一些一般规则?
另一个问题是关于“Wire”,当我们声明一个 val 时应该使用什么规则?
非常感谢!碧波
解决方案
这里的根本区别是某些操作是Scala 操作,某些操作是Chisel 操作。Scala 操作被静态评估以构建硬件生成器。Chisel 操作用于描述硬件组件如何连接和交互。对于您提供的两个示例:
- 斯卡拉操作
this = that
做 Scala 作业if (condition) { body }
是标准条件
- 凿子作业
this := that
将一种凿子类型连接到另一种凿子类型when (condition) { body }
是硬件条件
为了具体化这一点,请考虑以下Module
混合了 Scala 操作和 Chisel 操作的 Chisel。
import chisel3._
/* param is a Scala Boolean that will change the internals of Foo */
class Foo(param: Boolean) extends Module {
/* We do Scala assignment of a Chisel type (a Bundle) to value "io" */
val io = IO(new Bundle{})
/* We use a Scala conditional to change whether or not "x" will be
* a 1-bit wire or a 2-bit wire */
val x = if (param) { Wire(UInt(1.W)) }
else { Wire(UInt(2.W)) }
/* Finally, we do a Chisel assignment (hardware connection) of x
* to a literal 0 */
x := 0.U
}
在幕后,Chisel“操作”实际上是为使用看起来熟悉的名称的 Chisel 类型定义的方法,例如:=
Chisel connect 和===
Chisel 硬件相等。这些必须不同于它们底层的 Scala 操作,例如,=
是 Scala 分配和==
是 Scala 相等。
Wire
如果您想描述可以进行硬件操作的实际硬件,则需要A。对于一个Reg
. 一个裸凿类型,likeUInt
通常只用于描述 aBundle
或一些 io。要使用这种 Chisel 类型进行硬件连接/操作,您需要将其包装在 aReg()
或 aWire()
中。
推荐阅读
- c++ - 冲突时的哈希表链接。如何创建指向链表对象的哈希表指针数组?
- php - 从 foreach 循环中获取先前的迭代值
- passwords - 是否有一种编程方式来读取/打开/解密 Libreoffice ODS 文件(最好是 python / bash)
- laravel - 此路由不支持 GET 方法。支持的方法:POST / PATCH / DELETE
- swift - 如何清除具有相同 BundleIDdentifier 的应用程序
- android - 为什么即使不是公开的,我也能读、写firestore?
- firebase - 如何仅获取没有数据的文档ID?(移动的)
- java - 获取迷宫中的所有路径(仅限水平/垂直移动)
- kubernetes - Kubernetes 中没有 AWS 卷但“绑定”PVC
- javascript - 如何在javascript中的两个输入之间留一个空格?