所以,我有一个关于凿子代码转换的理论问题。我已经知道凿子代码被编译为Java字节码,然后运行在JVM中,它发出等效的Verilog和C++源代码(用于旧版本的凿子)。凿子代码翻译成Verilog/C++
但是我在理解这个过程中遇到了很多麻烦。 例如,在凿子源代码中,我可以看到有一个Reg类,例如,创建一个寄存器的定义。然后我可以在硬件设计中导入和使用这个类。但我无法理解Reg类本身的描述与它的实际用法之间的区别在哪里。这很混乱。
例如,假设我正在开发一个使用Reg对象的项目,其中有一个名为whatever.scala的源代码,并且在此源代码中有Reg对象。据我了解,寄存器本身(Reg.scala)和使用它的源代码(whatever.scala)的描述都是同时编译的,这正是a不能得到的。
为了简短起见,在我看来,描述一个库和实际在构建它之后使用这个库是分开的。您必须先编译库,然后将其导入到项目中并使用它。但在凿子中,这两个步骤似乎同时发生。
在JVM代码发射和创建凿子AST之间是否存在任何中间过程?
我明白你的观点。但是还是有一些让我困惑的东西,我给你举一个例子:假设在使用凿子的硬件描述中,有一个注册对象的声明,比方说,output_register = Reg(...)。作为后端,将会有一个C++或Verilog寄存器,其变量名称大致相同。所以,就像凿子在从凿子变成另一种语言时,它可以检查自己的变量名称,这似乎是反思。 Chisel在变换时如何知道它是自己的变量名称? – Rafael
凿子确实使用反射。在创建模块时,在运行时检查变量以及引用凿子类型实例的变量。名称来自变量名称,由模块层次结构决定。 –