生成Verilog代码时如何在凿子中保留所有变量名

时间:2019-03-28 15:34:52

标签: chisel

可以在verilog中明确找到凿子中的寄存器名称。 但电汇名称有时会在Verilog代码中省略号。

例如,我在verilog中找不到sjwr ,sjwaddr名称。

  val sjwr = Wire(Bool()) 
  val sjwaddr = Wire(UInt(jcnt.getWidth.W))
  sjwr    := jcnt_rdy 
  sjwaddr := jcnt
  when (sjwr) { sjBuf(sjwaddr) := sjxv }  

当我们生成Verilog代码时,如何将所有变量名保留在凿子中。
对于wave调试很重要。

1 个答案:

答案 0 :(得分:4)

谢谢您对凿子的兴趣!

名字可能消失的原因有很多。

恒定传播

由于许多原因,包括与现有CAD工具的互操作性,性能和Verilog调试能力,Chisel(实际上是Chisel下的FIRRTL编译器)将传播常数和直接导线连接。例如:

class MyModule extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(8.W))
    val out = Output(UInt(8.W))
  })
  val wire = Wire(UInt(8.W))
  wire := io.in
  io.out := wire
}

在上面的代码中,wire将被删除,因为它只是连接到io.in,Verilog只会显示:

assign io_out = io_in;

无法命名

凿子模块实现为Scala类。由于实现原因,默认情况下,Chisel只能在模块主体中命名“顶级” vals,例如:

class MyModule extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(8.W))
    val in2 = Input(UInt(8.W))
    val out = Output(UInt(8.W))
  })
  val sum = io.in + io.in2 // this is a top-level val, will be named

  // A method, we can call to help generate code:
  def inc(x: UInt): UInt = {
    val incremented = x + 1.U // We cannot name this, it's inside a method
    incremented
  }

  io.out := inc(sum)
}

suggestName

您可以通过在其上调用.suggestName("name")来手动命名任何信号,例如

  def inc(x: UInt): UInt = {
    val incremented = x + 1.U // We cannot name this, it's inside a method
    incremented.suggestName("incremented") // Now it is named!
  } 

输入@chiselName

我们可以使用称为@chiselName的实验性功能来解决上述问题,如下所示:

import chisel3.experimental.chiselName

@chiselName
class MyModule extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(8.W))
    val in2 = Input(UInt(8.W))
    val out = Output(UInt(8.W))
  })
  val sum = io.in + io.in2 // this is a top-level val, will be named

  // A method, we can call to help generate code:
  def inc(x: UInt): UInt = {
    val incremented = x + 1.U // We cannot name this, it's inside a method
    incremented
  }

  io.out := inc(sum)
}

@chiselName是一个注释,可在任何classobject定义上使用,并确保可以命名诸如incremented之类的值。 @chiselName有效地重写您的代码以将.suggestName放在各处。

我希望这会有所帮助!

编辑更多信息:

禁用优化

我认为它尚未发布(最近发布的是3.1.7,它将发布在3.2.0中),但是我们确实有一个选项可以禁用所有优化。您可以将使用的“编译器”从verilog更改为mverilog(对于“最小” Verilog,即无优化)。可以使用Chisel或FIRRTL中的命令行参数-X mverilog完成。

请勿触摸

您还可以使用chisel3.experimental.dontTouch将信号标记为不应删除的内容。这将阻止优化消除信号。例如:

import chisel3.experimental.dontTouch
class MyModule extends Module {
  val io = IO(new Bundle {
    val in = Input(UInt(8.W))
    val out = Output(UInt(8.W))
  })
  val wire = dontTouch(Wire(UInt(8.W)))
  wire := io.in
  io.out := wire