是否可以从 yosys 输出创建模拟波形
Is it possible to create a simulation waveform from yosys output
我发现使用 iverilog 进行仿真是一种不太合适的方法,我可以仿真无法综合的设计,反之,不仅可以综合而且可以在物理硬件上按预期工作但无法综合的设计使用 iverilog 进行模拟。
我最理想的做法是获取 yosys(一个 blif 文件)的输出并创建一个我可以更有信心的模拟波形 (vcd)。
所以你要运行 post-iCE40 BLIF网表的综合仿真
考虑以下简单示例设计 (test.v
):
module test(input clk, resetn, output reg [3:0] y);
always @(posedge clk)
y <= resetn ? y + 1 : 0;
endmodule
及其测试台(test_tb.v
):
module testbench;
reg clk = 1, resetn = 0;
wire [3:0] y;
always #5 clk = ~clk;
initial begin
repeat (10) @(posedge clk);
resetn <= 1;
repeat (20) @(posedge clk);
$finish;
end
always @(posedge clk) begin
$display("%b", y);
end
test uut (
.clk(clk),
.resetn(resetn),
`ifdef POST_SYNTHESIS
. \y[0] (y[0]),
. \y[1] (y[1]),
. \y[2] (y[2]),
. \y[3] (y[3])
`else
.y(y)
`endif
);
endmodule
运行预综合仿真当然简单:
$ iverilog -o test_pre test.v test_tb.v
$ ./test_pre
对于post-合成模拟我们必须先运行合成:
$ yosys -p 'synth_ice40 -top test -blif test.blif' test.v
然后我们必须将 BLIF 网表转换为 Verilog 网表,以便它可以被 Icarus Verilog 读取:
$ yosys -o test_syn.v test.blif
现在我们可以从测试平台、综合设计和 iCE40 仿真模型构建仿真二进制文件,运行 它:
$ iverilog -o test_post -D POST_SYNTHESIS test_tb.v test_syn.v \
`yosys-config --datdir/ice40/cells_sim.v`
$ ./test_post
[..] won't synthesize with iverilog for simulation.
这很可能是因为 Yosys 在执行 Verilog 标准方面不如 iverilog 严格。例如,在许多情况下,根据 Verilog 标准,Yosys 会将缺少 reg
关键字的 Verilog 文件从需要 reg
关键字的电线中排除。例如,yosys 将接受以下输入,即使它不是有效的 Verilog 代码:
module test(input a, output y);
always @* y = !a;
endmodule
对于 Icarus Verilog,您必须添加缺少的 reg
:
module test(input a, output reg y);
always @* y = !a;
endmodule
我发现使用 iverilog 进行仿真是一种不太合适的方法,我可以仿真无法综合的设计,反之,不仅可以综合而且可以在物理硬件上按预期工作但无法综合的设计使用 iverilog 进行模拟。
我最理想的做法是获取 yosys(一个 blif 文件)的输出并创建一个我可以更有信心的模拟波形 (vcd)。
所以你要运行 post-iCE40 BLIF网表的综合仿真
考虑以下简单示例设计 (test.v
):
module test(input clk, resetn, output reg [3:0] y);
always @(posedge clk)
y <= resetn ? y + 1 : 0;
endmodule
及其测试台(test_tb.v
):
module testbench;
reg clk = 1, resetn = 0;
wire [3:0] y;
always #5 clk = ~clk;
initial begin
repeat (10) @(posedge clk);
resetn <= 1;
repeat (20) @(posedge clk);
$finish;
end
always @(posedge clk) begin
$display("%b", y);
end
test uut (
.clk(clk),
.resetn(resetn),
`ifdef POST_SYNTHESIS
. \y[0] (y[0]),
. \y[1] (y[1]),
. \y[2] (y[2]),
. \y[3] (y[3])
`else
.y(y)
`endif
);
endmodule
运行预综合仿真当然简单:
$ iverilog -o test_pre test.v test_tb.v
$ ./test_pre
对于post-合成模拟我们必须先运行合成:
$ yosys -p 'synth_ice40 -top test -blif test.blif' test.v
然后我们必须将 BLIF 网表转换为 Verilog 网表,以便它可以被 Icarus Verilog 读取:
$ yosys -o test_syn.v test.blif
现在我们可以从测试平台、综合设计和 iCE40 仿真模型构建仿真二进制文件,运行 它:
$ iverilog -o test_post -D POST_SYNTHESIS test_tb.v test_syn.v \
`yosys-config --datdir/ice40/cells_sim.v`
$ ./test_post
[..] won't synthesize with iverilog for simulation.
这很可能是因为 Yosys 在执行 Verilog 标准方面不如 iverilog 严格。例如,在许多情况下,根据 Verilog 标准,Yosys 会将缺少 reg
关键字的 Verilog 文件从需要 reg
关键字的电线中排除。例如,yosys 将接受以下输入,即使它不是有效的 Verilog 代码:
module test(input a, output y);
always @* y = !a;
endmodule
对于 Icarus Verilog,您必须添加缺少的 reg
:
module test(input a, output reg y);
always @* y = !a;
endmodule