为状态机创建字符串调试 Vec

Creating string debug Vec for state machine

在 Verilog 中设计状态机时,我通常会使用 localparam 来定义状态名称。大多数模拟器将能够推断出这一点,并且在调试期间,您可以按名称而不是数字来查看状态信号。对于不能自动解决这个问题的模拟器(Icarus),我通常会做如下事情:

`ifdef SIMULATION
reg [8*40:1] state_name;
always @(*) begin
  case(state)
    WAIT_SDS    : state_name = "WAIT_SDS";
    IDLE        : state_name = "IDLE";
    HEADER_DI   : state_name = "HEADER_DI";
    HEADER_WC0  : state_name = "HEADER_WC0";
    HEADER_WC1  : state_name = "HEADER_WC1";
    HEADER_ECC  : state_name = "HEADER_ECC";
    LONG_DATA   : state_name = "LONG_DATA";
    CRC0        : state_name = "CRC0";
    CRC1        : state_name = "CRC1";
    IDL_SYM_ST  : state_name = "IDL_SYM_ST";
  endcase
end
`endif

允许我用 ASCII 绘制此信号。

我一直在努力寻找一种在 Chisel 中执行此操作的合适方法,但我没有真正的运气。我目前使用 ChiselEnum,虽然我知道 Github 上有一个问题试图让它打印 localparam,但它尚未实现。所以我想将其添加到 Chisel 生成的内容中。

有没有办法实现这个,或者与当前的 Chisel API 类似的东西?

一个问题是我需要创建一些东西并在其周围放置一个 dontTouch。如果我不能包含在 SYNTHESIS ifdefs 中,那么它可能会创建一些我不想要的逻辑。

另一种方法是为波形查看器自动生成翻译文件。

这是一个针对 gtkwave 的 FIRRTL 转换。它为所有 ChiselEnums 定义创建翻译过滤器文件,并创建一个包含所有端口和子模块的“gtkw”保存文件。

https://gist.github.com/kammoh/b3c85db9f2646a664f8dc84825f1bd1d

您可以像这样将它与 chiseltest (chisel-testers2) 一起使用:

class MySpec extends FlatSpec with ChiselScalatestTester{

  val annos = Seq(
    WriteVcdAnnotation,
    GtkwaveColoredFiltersAnnotation,
  )

  test(new MyModule).withAnnotations(annos) { dut =>
    // test logic
  }
}

它仍在进行中,如果有兴趣,我可以建议将其添加到 chiseltest 的 PR。