chisel - 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 方法在做什么吗?
解决方案
正如 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
推荐阅读
- python - 用randrange生成n位字符串的最佳方法?
- r - 根据第二列中的唯一值返回一列的子集向量
- css - 固定表头 React-Bootstrap-Table-Next
- bash - 如何在命令之前创建一个在环境变量前面加上前缀的 bash 环境变量?
- r - 在 R 中返回具有三个连续双字母的单词(例如 bookkeeper)
- python - 如何编写 pyhton 代码来打印文件中不包含每个字母的单词数?
- perl - Perl:需要遍历文件夹中的 ts 文件,如果 regx 匹配则删除特定行
- flutter - MaterialPageRoute 错误
- python - python中的3级json计数
- python - 自动化 jupyter notebook 可视化