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

jij*_*ing 1 chisel

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

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

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

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

Jac*_*nig 5

感谢您对凿子的关注!

名字消失的原因有很多。

持续传播

由于许多原因,包括与现有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
}
Run Code Online (Sandbox Code Playgroud)

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

assign io_out = io_in;
Run Code Online (Sandbox Code Playgroud)

无法命名

凿子模块实现为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)
}
Run Code Online (Sandbox Code Playgroud)

proposalName

您可以通过调用任意信号来手动命名.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!
  } 
Run Code Online (Sandbox Code Playgroud)

输入@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)
}
Run Code Online (Sandbox Code Playgroud)

@chiselName是可以在任何或定义上使用的注释,它将确保可以命名类似val 。有效地重写您的代码以放置到各处。classobjectincremented@chiselName.suggestName

我希望这有帮助!

编辑更多信息:

禁用优化

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

别碰

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

import chisel3.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
Run Code Online (Sandbox Code Playgroud)

编辑2:我已针对Chisel 3.2进行了更新,dontTouch将其从软件包chisel3.experimental移至常规chisel3软件包