首页 > 解决方案 > 当我们应该在 chisel3 中使用 ":=" 而不是 "=" 时,相同的情况是 "when" 和 "if"

问题描述

最近我在学习chisel3,我有以下问题:我们应该何时使用“:=”而不是“=”相同的情况是“何时”和“如果”。或者您能否为这些情况提供一些一般规则?

另一个问题是关于“Wire”,当我们声明一个 val 时应该使用什么规则?

非常感谢!碧波

标签: chisel

解决方案


这里的根本区别是某些操作是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()中。


推荐阅读