首页 > 解决方案 > Chisel 变量声明语法含义 rvs: Bool*

问题描述

查看对象 DecoupledHelper 和类 DecoupledHelper 代码,我看到以下内容。

object DecoupledHelper {
 def apply(rvs: Bool*) = new DecoupledHelper(rvs)
}

class DecoupledHelper(val rvs: Seq[Bool]) {
 def fire(exclude: Bool, includes: Bool*) = {

   (rvs.filter(_ ne exclude) ++ includes).reduce(_ && _)
 }
}

我不明白 apply 方法中的参数声明语法。( rvs: Bool*)。类型Bool*的末尾是什么意思。查看 DecoupledHelper 类的构造函数参数,它期望 ( )rvs: Seq[Bool]

这是否意味着 typeBool*会自动转换为 type Seq[Bool]

在此期间,任何人都可以解释 rvs.filter 方法在做什么吗?

标签: chisel

解决方案


正如 Kamyar 所说,Type*是可变数量参数(也称为“varags”)的 Scala 语法。它让您像这样调用该DecoupledHelper apply方法:

val helper = DecoupledHelper(a, b, c) // calling apply on the companion object
// instead of
val helper2 = new DecoupledHelper(Seq(a, b, c)) // calling constructor of the class

对于 Chisel 和 Scala 的新手,请注意这apply是一个特殊的函数 Scala,当您将括号“应用”到对象或实例时会调用它。因此DecoupledHelper(a, b, c)等价于DecoupledHelper.apply(a, b, c)

在此期间,任何人都可以解释 rvs.filter 方法在做什么吗?

它利用了我不建议这样做的 Chisel 的实施。ne是不引用相等的Scala函数。它可以让您检查两个对象是否不是内存中的同一个对象。

在这种情况下,它可以让您执行以下操作:

val helper = DecoupledHelper(a, b, c)
helper.fire()   // a && b && c
helper.fire(b)  // a && c

现在因为这是危险地使用引用相等而不是实际的硬件相等(并且存在激发这种情况的实现的限制),所以应该起作用的东西不起作用:

val helper = DecoupledHelper(a, b, c)
val d = b           // Same reference
val e = WireInit(b) // Equivalent Wire but different reference
helper.fire(d)  // a && c
helper.fire(e)  // a && b && c

d指向堆上与 相同的对象,但尽管从硬件角度来看它是等效的b,但它并不指向。e

更多信息请参见相关的错误报告和讨论:https ://github.com/chipsalliance/rocket-chip/issues/1616


推荐阅读