所以,我有一个关于Chisel代码转换的理论问题。
我已经知道Chisel代码被编译为Java字节码,然后在JVM中运行,它会发出等效的Verilog和C ++源代码(对于旧版本的Chisel)。
但是我在理解这个过程时遇到了很多麻烦。 例如,在Chisel源代码中,我可以看到有一个Reg类,例如,它创建了一个寄存器的定义。然后我可以在硬件设计中导入和使用这个类。但我无法理解Reg类本身的描述与它的实际用法之间的分离所在。这太令人困惑了。
例如,假设我正在开发一个使用Reg对象的项目,其中有一个名为whatever.scala的源代码,在此源代码中有Reg对象。据我了解,寄存器本身的描述(Reg.scala)和使用它的源代码(whatever.scala)都是同时编译的,而这正是a无法获得的。
简而言之,在我看来,描述一个库,并在构建它之后实际使用它之间存在分离。您必须先编译库,然后将其导入项目并使用它。但在Chisel中,这两个步骤似乎同时发生。
在JVM代码发射和Chisel AST的创建之间是否有任何中间过程?
答案 0 :(得分:3)
Chisel是一种高级参数化嵌入式DSL,用于生成硬件设计。 凿子程序通常包含几个步骤:
这些步骤可以一起运行,使用凿子测试仪可以自动执行上述所有步骤。或者单独完成,每个步骤都可以为用户生成输出文件,以添加自定义集成或针对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代码。