iverilog を使用したシミュレーションは適切な方法ではないことがわかりました。合成しないデザインをシミュレートできます。逆に、合成するだけでなく、物理ハードウェアで意図したとおりに機能するデザインをシミュレートするために iverilog を使用して合成しません。
私が理想としているのは、yosys の出力 (blif ファイル) を取得して、より信頼できるシミュレーション波形 (vcd) を作成することです。
iverilog を使用したシミュレーションは適切な方法ではないことがわかりました。合成しないデザインをシミュレートできます。逆に、合成するだけでなく、物理ハードウェアで意図したとおりに機能するデザインをシミュレートするために iverilog を使用して合成しません。
私が理想としているのは、yosys の出力 (blif ファイル) を取得して、より信頼できるシミュレーション波形 (vcd) を作成することです。
したがって、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
合成後のシミュレーションでは、最初に合成を実行する必要があります。
$ yosys -p 'synth_ice40 -top test -blif test.blif' test.v
次に、Icarus Verilog で読み取れるように、BLIF ネットリストを 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
[..] シミュレーション用の iverilog で合成されません。
これはおそらく、Verilog 標準の適用に関して Yosys が iverilog ほど厳密ではないためです。たとえば、多くの場合、Yosys は、Verilog 標準に従ってキーワードreg
を必要とする配線からキーワードが欠落している Verilog ファイルを除外します。reg
たとえば、有効な Verilog コードではありませんが、yosys は次の入力を受け入れます。
module test(input a, output y);
always @* y = !a;
endmodule
Icarus Verilog の場合、不足している を追加する必要がありますreg
:
module test(input a, output reg y);
always @* y = !a;
endmodule