7

iverilog を使用したシミュレーションは適切な方法ではないことがわかりました。合成しないデザインをシミュレートできます。逆に、合成するだけでなく、物理ハードウェアで意図したとおりに機能するデザインをシミュレートするために iverilog を使用して合成しません。

私が理想としているのは、yosys の出力 (blif ファイル) を取得して、より信頼できるシミュレーション波形 (vcd) を作成することです。

4

1 に答える 1

12

したがって、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
于 2016-03-11T11:36:46.360 に答える