最近,我在学习chisel3,我有以下问题:
什么时候应该使用“:=”而不是“ =”
“ when”和“ if”相同。
或者,您能为这些情况提供一些一般规则吗?
另一个问题是关于“ Wire”的,在声明一个val时应使用或不遵循什么规则?
非常感谢!
碧波
最佳答案
这里的根本区别是某些操作是Scala操作,某些操作是Chisel操作。对Scala操作进行静态评估以构建硬件生成器。凿子操作用于描述硬件组件如何连接和交互。对于您提供的两个示例:
Scala操作this = that
执行Scala分配if (condition) { body }
是标准条件
凿子作业this := that
将一种凿子类型连接到另一种凿子类型when (condition) { body }
是硬件条件
为了具体化,请考虑以下结合Scala操作和Chisel操作的Chisel Module
。
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
。与Reg
相同。像UInt
这样的裸凿子类型通常仅用于描述Bundle
或某些形式。要使用此凿子类型进行硬件连接/操作,您需要将其包装在Reg()
或Wire()
中。