LazyModule 和 LazyModuleImp 的区别

问题描述

LazyModule 和 LazyModuleImp 有什么区别? 就像 Rocket-chip/doc 下的外交演示说:The desired hardware for the module must be written inside LazyModuleImp. 但考虑以下代码

class A(implicit p: Parameters) extends LazyModule {
  val b = LazyModule(new Leaf)
  val c = LazyModule(new Leaf)

  val input = b.input
  val output = c.output

  val bOutput = b.output.makeSink
  val cInput = BundleBridgeSource[Bool](() => Bool())
  c.input := cInput
  lazy val module = new LazyModuleImp(this) {
    cInput.bundle := bOutput.bundle
  }
}

:= 是硬件操作,它出现在 LazyModuleImp 的内部和外部,那么哪些代码应该放在 LazyModuleImp 中?

解决方法

考虑 LazyModule 的最佳方式 (IMO) 是 LazyModule 本质上有两个部分

  1. 非硬件实现(LazyModuleImp 之外的所有内容)这是我们定义 Nodes、解析参数、做任何人们认为是“软件”的事情
  2. 硬件实现(LazyModuleImp 中的所有内容) 这是我们创建实际硬件的地方。我们通常使用我们在外部解析的参数来构建一些硬件。

就外交而言,:= 实际上是一个 Node 连接。您在其中连接两个外交节点。执行此连接时,您实际上是在“绘制”从一个节点到另一个节点的路径。在外交演示的情况下,您会将 AdderDriverNode 连接到 AdderNode。这是在LazyModuleImp外部执行的,因为我们需要在构建硬件之前定义这个节点图。

例如,如果您查看 AdderTestHarness,您可以在 LazyModuleImp 之外看到以下内容

  // create edges via binding operators between nodes in order to define a complete graph
  drivers.foreach{ driver => adder.node := driver.node }

  drivers.zip(monitor.nodeSeq).foreach { case (driver,monitorNode) => monitorNode := driver.node }
  monitor.nodeSum := adder.node

在这里,我们将驱动程序连接到加法器,将驱动程序连接到显示器,然后将加法器连接到显示器。这些连接基于为每个节点定义的 Bundle 生成创建硬件。

所以我倾向于将 LazyModules 和一般的外交视为创建硬件的两遍方法。第一遍是定义硬件拓扑。这是在 LazyModuleImp 之外完成的。我将描述每个部分是如何连接的,并解析宽度、地址等参数。第二遍是实际的硬件生成。在这里,我的所有参数都应该被解析,我定义的硬件现在已经创建。

外交令人印象深刻,但也很难掌握。特别是如果来自严格的硬件背景或严格的软件背景。它需要对某些软件范式的工作原理有深刻的了解,才能掌握参数/边缘分辨率的架构,然后才能使用它来实际创建一些真正的硬件。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...