凿子代码转换

时间:2017-06-14 14:54:26

标签: chisel

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

我知道Chisel实际上是一组Scala定义,因此它被编译为Java字节码,而Java字节码又在JVM中运行,就像魔术一样,它会为旧版本的版本吐出Verilog等效描述甚至C ++描述。凿。

关键是我无法弄清楚这种“神奇”是如何起作用的。我的猜测是从Chisel到Verilog / C ++的代码转换都是基于Scala反射。但我不确定,因为我找不到任何与此主题相关的内容。

那么,它是关于反思吗?如果是这样,我们的运行时反射是编译时间吗? 有人可以给我一个线索吗?

非常感谢。

3 个答案:

答案 0 :(得分:4)

从根本上说,编写Chisel正在编写一个Scala程序来生成电路。你所描述的听起来有点像高级综合,它与Chisel完全不同。 Chisel不是将Scala(或Java)原语映射到硬件,而是执行Scala代码来构造hardware AST,然后将其编译为Verilog。

我试着通过一个带注释的例子来说明这一点。

// The body of a Scala class is the default constructor
// MyModule's default constructor has a single Int argument
// Superclass Module is a chisel3 Class that begins construction of a hardware module
// Implicit clock and reset inputs are added by the Module constructor
class MyModule(width: Int) extends Module {
  // io is a required field for subclasses of Module
  // new Bundle creates an instance of an anonymous subclass of Chisel's Bundle (like a struct)
  // When executing the function IO(...), Chisel adds ports to the Module based on the Bundle object
  val io = IO(new Bundle {
    val in = Input(UInt(width.W)) // Input port with width defined by parameter
    val out = Output(UInt()) // Output port with width inferred by Chisel
  }) 

  // A Scala println that will print at elaboration time each time this Module is instantiated
  // This does NOT create a node in the Module AST
  println(s"Constructing MyModule with width $width")

  // Adds a register declaration node to the Module AST
  // This counter register resets to the value of input port io.in
  // The implicit clock and reset inputs feed into this node
  val counter = RegInit(io.in)

  // Adds an addition node to the hardware AST with operands counter and 1
  val inc = counter + 1.U // + is overloaded, this is actually a Chisel function call

  // Connects the output of the addition node to the "next" value of counter
  counter := inc

  // Adds a printf node to the Module AST that will print at simulation time
  // The value of counter feeds into this node
  printf("counter = %d\n", counter) 
}

答案 1 :(得分:0)

这也是我感兴趣的问题。我认为"构建硬件AST"编程并编译为* .class。生成类时,以及生成类。执行这些类后,生成rtl,感觉就像嵌入的工具链。但我不知道如何。希望任何人更多地了解。

答案 2 :(得分:0)

凿子与“代码转换”或“代码反射”无关。凿子本身是 RTL 。 Verilog,vhdl和firrtl是描述RTL的不同类型的语言。 RTL表示注册传输级别。任何直接描述寄存器操作的语言都可以归类为RTL。

在Chisel中,将regisgters定义为Reg,将wires定义为Wires,程序员可以像在verilog中一样直接操作这些寄存器和连线。因此,难怪为什么凿子可以直接解释为verilog rtl。

凿子比verilog更好的是外交模式设计,这意味着凿子可以自动推断,而不是声明电路的每个细节(例如位宽或寄存器延迟),而是自动进行推断接口连接,从而“生成”所需的电路。