当我们应该在 chisel3 中使用不"=" ":="时,同样的情况是"when"和"if"

  • 本文关键字:情况 if when chisel3 我们 chisel
  • 更新时间 :
  • 英文 :


最近我在学习chion3,我有以下问题:何时应该使用":="而不是"="when"one_answers"if"的情况相同。或者你能为这些情况提供一些一般规则吗?

另一个问题是关于"Wire",当我们声明一个val时,应该使用或不使用它的规则是什么?

非常感谢!Bibo

这里的基本区别是某些操作是Scala操作,而某些操作是Chisel操作。Scala操作是静态评估的,以构建硬件生成器。Chisel操作用于描述硬件组件是如何连接和交互的。对于您提供的两个示例:

  • Scala操作
    • this = that执行Scala赋值
    • if (condition) { body }是一个标准条件
  • 凿石作业
    • this := that将一个Chisel类型连接到另一个Chicel类型
    • when (condition) { body }是硬件条件

要具体化这一点,请考虑以下混合了Scala操作和Chisel操作的ChiselModule

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连接,===是Chisel硬件相等。这些必须与它们的底层Scala操作不同,例如,=是Scala赋值,==是Scala相等。


如果您想描述可以在其上执行硬件操作的实际硬件,则需要WireReg也是如此。像UInt这样的裸Chisel类型通常只用于描述Bundle或某些io。要使用此Chisel类型进行硬件连接/操作,您需要将其封装在Reg()Wire()中。

相关内容

最新更新