凿码转换为Verilog / C ++

时间:2017-08-07 11:51:42

标签: chisel

所以,我有一个关于Chisel代码转换的理论问题。

我已经知道Chisel代码被编译为Java字节码,然后在JVM中运行,它会发出等效的Verilog和C ++源代码(对于旧版本的Chisel)。

但是我在理解这个过程时遇到了很多麻烦。 例如,在Chisel源代码中,我可以看到有一个Reg类,例如,它创建了一个寄存器的定义。然后我可以在硬件设计中导入和使用这个类。但我无法理解Reg类本身的描述与它的实际用法之间的分离所在。这太令人困惑了。

例如,假设我正在开发一个使用Reg对象的项目,其中有一个名为whatever.scala的源代码,在此源代码中有Reg对象。据我了解,寄存器本身的描述(Reg.scala)和使用它的源代码(whatever.scala)都是同时编译的,而这正是a无法获得的。

简而言之,在我看来,描述一个库,并在构建它之后实际使用它之间存在分离。您必须先编译库,然后将其导入项目并使用它。但在Chisel中,这两个步骤似乎同时发生。

在JVM代码发射和Chisel AST的创建之间是否有任何中间过程?

2 个答案:

答案 0 :(得分:3)

Chisel是一种高级参数化嵌入式DSL,用于生成硬件设计。 凿子程序通常包含几个步骤:

  • chisel3 程序首先构造理想化电路的内部表示作为抽象语法树(AST)。在生成结束时,AST被序列化为FIRRTL(中间表示)表示。请参阅:chisel3
  • firrtl转换引擎处理通过一些转换过程产生的高级FIRRTL。这些过程可以优化代码,进行宽度推断,最后发出verilog或low firrtl。请参阅:firrtl
  • 通常在开发期间,对电路进行单元测试。有两种简单的方法可以做到这一点。
    • 发出的verilog可以通过verilator和c ++编译器转换为可执行的模拟。可以使用验证电路的测试线束执行模拟。请参阅:chisel-testers
    • 或者,使用firrtl-interpreter轻量级scala程序可以模拟发射的firrtl,它能够运行与凿子测试仪相同的单元测试。请参阅:firrtl-interpreter

这些步骤可以一起运行,使用凿子测试仪可以自动执行上述所有步骤。或者单独完成,每个步骤都可以为用户生成输出文件,以添加自定义集成或针对FPGA或芯片输出的verilog。

JVM只是用于运行scala程序的执行环境,并且不需要理解或交互以便使用Chisel构建电路。

答案 1 :(得分:3)

解决Chisel与您的项目问题:

Chisel是一个编译为JVM字节码的Scala库。 使用 Chisel的项目是一个链接Chisel的Scala程序。该项目也编译为JVM字节码,但包括对单独编译的Chisel库*的调用。然后执行使用Chisel的项目,在JVM上运行。该程序的执行构造了一个最终作为Verilog发出的硬件AST。

*许多项目(如rocket-chip)确实包含Chisel源代码作为子项目。凿子通常先编译然后链接。但是,如果一次编译它就没有区别 - 它只是其他Scala代码调用的Scala代码。