为状态机创建字符串调试 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。
在 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。