凿子中的高级参数化手册

时间:2018-09-17 21:12:46

标签: chisel

这是凿子库中

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

}

我不了解参数中的=登录。它代表什么?

2 个答案:

答案 0 :(得分:2)

=中的(implicit _p: Option[Parameters] = None)正在将默认值None分配给参数_p。这意味着除非另有说明,否则没有Parameter实例被分配给_p

如果您要询问=>中的(c: =>T),则=>意味着第一个参数c是对返回实例的函数的引用的T,其中TModule的子类。

这里使用了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