这是凿子库中
object Module {
// returns a new Module of type T, initialized with a Parameters instance if _p !=None.
def apply[T<:Module](c: =>T)(implicit _p: Option[Parameters] = None):T
}
我不了解参数中的=
登录。它代表什么?
答案 0 :(得分:2)
=
中的(implicit _p: Option[Parameters] = None)
正在将默认值None
分配给参数_p
。这意味着除非另有说明,否则没有Parameter
实例被分配给_p
。
如果您要询问=>
中的(c: =>T)
,则=>
意味着第一个参数c
是对返回实例的函数的引用的T
,其中T
是Module
的子类。
这里使用了Scala的许多惯用功能:函数咖喱,隐式参数,作为语言的一等公民的函数。花一些时间来学习这些东西的语法是值得的。请参阅Chisel的generator-bootcamp tutorial,特别是3.2和3.3节,了解Chisel利用Scala语法的某些方式
答案 1 :(得分:1)
此示例有两个=
符号。第一个对应于By-name参数:https://docs.scala-lang.org/tour/by-name-parameters.html。
前者很重要,因为Chisel中的模块在构造时必须包装在Module(...)
中。通常,我们使用呼叫按名称完成:
class MyModule extends Module {
...
}
// This works!
def func(mod: => MyModule) = {
val instance = Module(mod) // The module is constructed inside Module(...)
}
func(new MyModule)
// This doesn't work!
def func(mod: MyModule) = {
val instance = Module(mod)
}
func(new MyModule) // The module is constructed too early, here!
第二个是默认参数:https://docs.scala-lang.org/tour/default-parameter-values.html。主要是为了方便:
def func(x: Int = 3) = { println(x) }
func(5) // prints 5
func() // prints 3