当我们在chisel3中使用“:=”而不是“ =”时,相同的情况是“ when”和“ if”

时间:2018-08-02 02:55:23

标签: chisel

最近我正在倾斜chisel3,并且我有以下问题:    什么时候应该使用“:=”而不是“ =”    “ when”和“ if”相同。    还是可以为这些情况提供一些一般规则?

另一个问题是关于“电线”的,在声明一个val时应使用或不使用什么规则?

非常感谢! Bibo

1 个答案:

答案 0 :(得分:4)

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

在后台,凿子“操作”实际上是为使用看起来很熟悉的名称的凿子类型定义的方法,例如:=是凿子连接,===是凿子硬件相等性。这些必须与它们的基础Scala操作不同,例如=是Scala分配,而==是Scala相等。


如果要描述可以对其执行硬件操作的实际硬件,则需要Wire。与Reg相同。像UInt这样的裸Chisel类型通常仅用于描述Bundle或其他方式。要使用这种凿子类型进行硬件连接/操作,您需要将其包装在Reg()Wire()中。