FC2カウンター FPGAの部屋 ISim

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ISE14.7のISimの不具合?

現在、かなり大きな回路をISE14.7のISimでシミュレーションしています。その時にクロックが止まってしまうという現象が出てしまったので、ブログに書いておきます。

まずは、下記のいつもブログでも使っているクロック発生モジュールを使用してクロックを生成していました。

.............

    wire ACLK;
    wire hdmir_clk;

    // clk_gen (ACLK)
    clk_gen #(
        .CLK_PERIOD(50),    // 10nsec, 100MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) ACLKi (
        .clk_out(ACLK)
    );

    // clk_gen (hdmir_clk)
    clk_gen #(
        .CLK_PERIOD(68),    // 6.8nsec, 147.6MHz(HD 148.5MHz)
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) WRITE_CLKi (
        .clk_out(hdmir_clk)
    );

endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule


これでシミュレーションすると 1.5msec 過ぎでクロックが停止するという不可解な現象が出てしまいました。
ISim_4_131204.png

クロック発生ロジックがおかしいのかと、always 文を使用する方法に修正してやってみました。

.................

    reg ACLK = 1'b0;
    reg hdmir_clk = 1'b0;

    always #(50)
        ACLK = ~ACLK;

    always #(34)
        hdmir_clk = ~hdmir_clk;


こうしてもやはりクロックが止まってしまいました。しかも出たり、出なかったり。。。
ISim_5_131204.png

クロックが止まってはシミュレーションができません。困ってしまいました。。。
そこで、Questaがあったので、これでシミュレーションを行うことにしました。下にシミュレーション波形を示します。17msec まで問題なくシミュレーションすることができました。vsync も出ています。
ISim_6_131204.png

やはり、ISE14.7のISim に不具合があるようです。
それにQuestaの方が桁が違うくらい速いです。
  1. 2013年12月06日 04:26 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

AXI VDMAのシミュレーション12(ハードウェア協調シミュレーション)

前の記事は、”AXI VDMAのシミュレーション11(シミュレーション成功2)”だが、カテゴリを”ISim”に移動した。

前に書いた、ISimのハードウェア協調シミュレーションに関する記事を下に示す。

ISimハードウェア協調シミュレーション1(キャラクタ・ディスプレイ・コントローラ)
ISimハードウェア協調シミュレーション2(FFTのシミュレーション1)
ISimハードウェア協調シミュレーション3(FFTのシミュレーション2)


それと、見やすい”ISim ハードウェア協調シミュレーション 14.1 クイック リファレンス”を参考にした。

使用するISEのバージョンはISE14.5とした。

・Designウインドウで、system_top を選択してSourceメニューからSource Properties...を選択した。
VDMA_test_37_130818.png

・Category から Hardware Co-Simulation を選択し、Enable Hardware Co-Simulation をチェックして、Clock Portに aclk を指定した(一番早いクロック)。Target Board for Hardware Co-Simulation で ZC702(JTAG) を選択した。OKボタンをクリックした。
VDMA_test_38_130818.png

・uut - system_top のアイコンが変更された。
VDMA_test_39_130818.png

・system_top_tb.v を選択して、ProcessesウインドウからSimulate Behavioral Model をダブルクリックして、シミュレーションをスタートしたところエラーが出てしまった。
VDMA_test_40_130818.png

エラー内容を下に示す。

ERROR:HDLCompiler:104 - "C:/HDL/Xilinx/14.5/ISE_DS/EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/dynshreg_f.vhd" Line 328: Cannot find in library . Please ensure that the library was compiled, and that a library and a use clause are present in the VHDL file.
ERROR:HDLCompiler:854 - "C:/HDL/Xilinx/14.5/ISE_DS/EDK/hw/XilinxProcessorIPLib/pcores/proc_common_v3_00_a/hdl/vhdl/dynshreg_f.vhd" Line 158: Unit ignored due to previous errors.
--------------------------------------------------------------------------------
ERROR:HWCoSim - Program 'xst' returned with a non-zero exit code 6. Please refer to log file 'D:\HDL\FndtnISEWork\Zynq-7000\ZedBoard\test\VDMA_test2\isim\hwcosim_tmp\jtag\synth_model\xst_system_top.srp' for further details.
HDL wrapper and bitstream generation process failed.


いまのところ、エラーは解決していない。Co-Simulation しようと思ったのだが、残念だ。。。
ちなみに、論理合成、インプリメントは成功している。

次の記事は、”AXI VDMAのシミュレーション13(Questaでシミュレーション)
  1. 2013年08月18日 08:40 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

ISim で OVL Ver. 2.7 のOVLライブラリを使用したシミュレーション

ISim で OVL Ver. 2.7 のOVLライブラリのコンパイルと登録”で、OVL Ver. 2.7 のOVLライブラリをISimでコンパイルして登録した。

今回は、ISimを使って、OVL Ver. 2.7 のOVLライブラリを使用したシミュレーションを行う。AXI4 Slave インターフェースのメモリ・シミュレーション用 IPを使って、OVLのライブラリを使ったシミュレーションを行った。これについては、後で詳しくブログに書くつもりだ。

Project Navigator でプロジェクトを作製して、ISimでシミュレーションを行う。下に、Project Navigator のプロジェクトを示す。
std_ovl_v2p7_simlib_7_130628.png

次に、OVLのライブラリを使用するためのISimのプロパティを下に示す。
std_ovl_v2p7_simlib_8_130628.png

Other Compiler Options : -L accellera_ovl_vlog=C:\HDL\Xilinx\14.6\ISE_DS\ISE\verilog\hdp\nt64\accellera_ovl_vlog
Specify Search Directories for 'Include : D:\HDL\OVL\std_ovl_v2p7
Specify 'define Macro Name and Value : OVL_VERILOG,OVL_ASSERT_ON,OVL_FINISH_OFF


上に示すオプションを設定してある。

OVLのチェッカーは、”キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする8.4(OVLチェッカのVerilog コード)”にある。アサーションのエラーが出ているので、修正する可能性がある。もう、一部修正した。修正済みのコードは、後でブログに貼る。
シミュレーション波形を下に示す。
std_ovl_v2p7_simlib_9_130628.png
  1. 2013年06月28日 19:56 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

ISim で OVL Ver. 2.7 のOVLライブラリのコンパイルと登録

元ネタは、”ISimでOVLのVHDL, Verilog混在シミュレーション(OVLライブラリのコンパイルと登録)”だが、この時は、Windows XPだったが、Windows 7 64ビット版になって、HDDのアサインが変わってしまったのと、OVLもバージョン2.7になったので、もう一度、ブログに書いておくことにした。

現在のOVL Ver. 2.7 の入手先は、”License and Statement of Use of Accellera System Initiative's Open Verification Library”です。そのWebページの”Accept agreement and proceed to download OVL.”をクリックするとダウンロード出来ます。


現在の OVL_Verilog_Lib_Comp.bat と OVL_VHDL_Lib_Comp.bat を示す。これをコマンドプロンプトから実行するとISim の OVLライブラリが作成できる。
std_ovl_v2p7_simlib_1_130627.png

OVLライブラリ・コンパイル用バッチファイルは、OVLバージョン2.7用にしたことと、HDDのアサイン、それに、コマンドのパスがなくなったので、フルパスでコマンドを指定している。

最初に、Verilog HDLのライブラリをコンパイルする。

ISimでOVLのVerilog HDLライブラリをコンパイルするバッチファル、OVL_Verilog_Lib_Comp.bat の内容を下に示す。

C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_always.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_always_on_edge.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_arbiter.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_bits.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_change.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_code_distance.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_coverage.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_decrement.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_crc.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_cycle_sequence.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_delta.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_even_parity.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_fifo.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_fifo_index.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_frame.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_handshake.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_hold_value.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_implication.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_increment.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_memory_async.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_memory_sync.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_multiport_fifo.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_mutex.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_never.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_never_unknown.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_never_unknown_async.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_next.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_next_state.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_no_contention.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_no_overflow.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_no_transition.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_no_underflow.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_odd_parity.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_one_cold.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_one_hot.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_proposition.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_quiescent_state.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_range.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_reg_loaded.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_req_ack_unique.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_req_requires.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_stack.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_time.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_transition.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_unchange.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_valid_id.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_value.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_value_coverage.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_width.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_window.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_win_change.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_win_unchange.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_xproduct_bit_coverage.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_xproduct_value_coverage.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_zero_one_hot.v


OVL_Verilog_Lib_Comp.bat をコマンドプロンプトで実行した。
std_ovl_v2p7_simlib_2_130627.png

フォルダに、fuse.xmsgs というファイルと、isim フォルダが出来た。
std_ovl_v2p7_simlib_3_130627.png

isim\accellera_ovl_vlog フォルダに、Verilog HDL の OVLライブラリがコンパイルされていた。
std_ovl_v2p7_simlib_4_130627.png

次に、VHDLのOVLライブラリをコンパイルする。

ISimでOVLのVHDLライブラリをコンパイルするバッチファル、OVL_VHDL_Lib_Comp.bat の内容を下に示す。

C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\std_ovl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\std_ovl_procs.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\std_ovl_components_vlog.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\std_ovl_clock_gating.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\std_ovl_reset_gating.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_always.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_always_on_edge.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_change.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_cycle_sequence.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_decrement.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_delta.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_even_parity.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_fifo_index.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_frame.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_handshake.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_implication.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_increment.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_never.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_never_unknown.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_never_unknown_async.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_next.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_no_overflow.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_no_transition.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_no_underflow.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_odd_parity.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_one_cold.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_one_hot.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_proposition.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_quiescent_state.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_range.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_time.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_transition.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_unchange.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_width.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_win_change.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_win_unchange.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_window.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_zero_one_hot.vhd

C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_always_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_cycle_sequence_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_implication_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_never_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_never_unknown_async_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_never_unknown_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_next_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_one_hot_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_range_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_zero_one_hot_rtl.vhd


OVL_VHDL_Lib_Comp.bat をコマンドプロンプトで実行した。
std_ovl_v2p7_simlib_6_130627.png

そうすると、SimLib\isim\accellera_ovl_vhdl フォルダが作られて、VHDL の OVLライブラリが作られた。
std_ovl_v2p7_simlib_5_130627.png

コンパイルした2つのライブラリを登録する。

私のパソコンでは、C:\HDL\Xilinx\14.6\ISE_DS\ISE\vhdl\hdp\nt64 に accellera_ovl_vhdl フォルダを移動した。

C:\HDL\Xilinx\14.6\ISE_DS\ISE\verilog\hdp\nt64 に accellera_ovl_vlog フォルダを移動した。

C:\HDL\Xilinx\14.6\ISE_DS\ISE\vhdl\hdp\nt64\xilinxsim.ini ファイルに以下の項目を追加した。

accellera_ovl_vlog=$XILINX/verilog/hdp/nt64/accellera_ovl_vlog
accellera_ovl_vhdl=$XILINX/vhdl/hdp/nt64/accellera_ovl_vhdl


これで、OVLライブラリのコンパイルと登録は終了だ。
  1. 2013年06月27日 05:40 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

ISimの unexpected error

昨日、ISimでシミュレーションしていたのですが、unexpected error で落ちまくっていました。
ISim_unexpected_error_120420.png

Waveウインドウに信号をたくさん入れるとこうなりました。デフォルトの信号数のままだと1ms 程度シミュレーションできるのですが、たくさん入れるとシミュレーション開始してすぐにISimが落ちてしまいます。
ISEのバージョンはISE13.4、OSはWindows 7 professional 64ビット版です。
この現象で1日悩んでしまいました。MIGなどを含めた全体でシミュレーションしているのですが、部分的にシミュレーションしても、Wave波形をスライドさせた時に落ちてしまい、どうもおかしいようでした。

Google で検索すると、”Isim crashing Windows 7 VM”という記事が見つかりました。それによると、Xilinxの方がWin7 64ビット版でおかしい時は、Win XPの32/64ビット版かWin 7の32ビット版を使ってくれとのことでした。ちなみにISE13.4では直るとかいてあるようですが、直ってないです。

Win 7 32ビット版のパソコンがあったので、それにISE13.4 を入れてISimでシミュレーションしてみましたが問題ないようです。Win 7 64ビット版でISimが unexpected error で落ちる場合には、Win XPの32/64ビット版かWin 7の32ビット版を使ってみてください。

(追加です)
以前の同じような回路では大丈夫だったと思うのですが?なぜダメに成ったか不思議です。今回はVHDLでconstantによるパラメタライズな回路にしたので、2次元配列を多用しています。モジュール間も2次元配列で受け渡ししたりしています。そのような回路構成がダメなんでしょうかね?パラーメータを変えると回路規模が変化するので、簡単に推測できなかったのでしょうか?でも、Win7 32ビット版で動いてますから、そんなことはないはずですね?
  1. 2012年04月20日 09:28 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:2

ISimハードウェア協調シミュレーション3(FFTのシミュレーション2)

ISimハードウェア協調シミュレーション2(FFTのシミュレーション1)”の続き。

前回はFFTのIPを生成して、インプリメントのMAPの途中で中止した。
次は、シミュレーションを行う。まずは、ISimのソフトウェアでやってみた。
下に用意したテストベンチのfp_fft_core_top_tb.v を下に示す。

`timescale 1ns / 1ps

module fp_fft_core_top_tb;

    // Inputs
    reg clk;
    reg start;
    reg [15:0] xn_re;
    reg [15:0] xn_im;
    reg fwd_inv;
    reg fwd_inv_we;
    reg [13:0]    scale_sch;
    reg scale_sch_we;

    // Outputs
    wire rfd;
    wire [13:0] xn_index;
    wire busy;
    wire edone;
    wire done;
    wire dv;
    wire [13:0] xk_index;
    wire [15:0] xk_re;
    wire [15:0] xk_im;

    // Instantiate the Unit Under Test (UUT)
    fp_fft_core_top uut (
        .clk(clk), 
        .start(start), 
        .xn_re(xn_re), 
        .xn_im(xn_im), 
        .fwd_inv(fwd_inv), 
        .fwd_inv_we(fwd_inv_we), 
        .scale_sch(scale_sch), 
        .scale_sch_we(scale_sch_we), 
        .rfd(rfd), 
        .xn_index(xn_index), 
        .busy(busy), 
        .edone(edone), 
        .done(done), 
        .dv(dv), 
        .xk_index(xk_index), 
        .xk_re(xk_re), 
        .xk_im(xk_im)
    );

    parameter PERIOD = 10;
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;

    
    initial    // Clock process for clk
    begin
        clk = 1'b0;
        #OFFSET;
        forever begin
            clk = 1'b0;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) clk = 1'b1;
            #(PERIOD*DUTY_CYCLE);
        end
    end

    initial begin
        // Initialize Inputs
        start = 0;
        fwd_inv = 0;
        fwd_inv_we = 0;
        scale_sch = 0;
        scale_sch_we = 0;

        // Wait 100 ns for global reset to finish
        #100;
        
        // Add stimulus here
        start = 1;
    end
    
    initial begin
        xn_re = 0;
        #100;
        forever begin
            xn_re = 0;
            #500 xn_re = 16;
            #500;
        end
    end
      
    initial begin // 位相を45度遅らせる
        xn_im = 0;
        #125;
        forever begin
            xn_im = 0;
            #500 xn_im = 16;
            #500;
        end
    end
      
endmodule


View:をSimulation に変更し、ProcessesからSimulate Behavioral Modelをダブルクリックする。
ISim_Co_Sim_17_110715.png

コンパイルが行われてISimが立ち上がり、500usシミュレーションを行ったら、13分30秒かかった。
ISim_Co_Sim_18_110715.png

次に、Designウインドウで、fp_fft_core_topを選択してSourceメニューからSource Properties...を選択する。
Enable Hardware Co-Simulation をチェックして、Clock Portにclkを指定する。Target Board for Hardware Co-Simulation でSP605(JTAG) を選択し、今回はEnable Incremental Implementation をチェックする。
ISim_Co_Sim_19_110716.png

fp_fft_core_topのアイコンがハードウェア協調シミュレーション用に変化する。ProcessesウインドウからSimulate Behavioral Modelをダブルクリックして、シミュレーションを開始すると、コンパイルが開始される。コンパイルに30分くらいかかったかな?(途中で犬の散歩に行ってしまったので、正確な時間はわかりません)(注:37分くらいみたいです)
ISim_Co_Sim_20_110716.png

シミュレータが立ち上がって、500usシミュレーションするのに50秒で終了した。(ISimハードウェア協調シミュレーション)
ISim_Co_Sim_21_110716.png

ソフトウェアの時は13分30秒だったので、16.2倍速くなった。しかし、コンパイルに時間がかかる。これは、インプリメントしているからだ。ただしコンパイルしてあるので、もう一度シミュレーションするのは速い(50秒)。

この状態から、fp_fft_core_top_tbのxn_im のオフセット値だけ書き換えた。

    initial begin // 位相を45度遅らせる
        xn_im = 0;
        // #125;
        #130;
        forever begin
            xn_im = 0;
            #500 xn_im = 16;
            #500;
        end
    end



これで、ISimのRe-launch ボタンでリコンパイルして、エラボレートしたら数秒でコンパイルが終了した。シミュレーション時間はハードウェア協調シミュレーションの時間(50秒)だった。少なくともテストベンチを修正するときには、再度インプリメントも行われないので、コンパイル時間も短くて便利だと思う。オフセット値を計測してみたが、きちんと30nsになっていた。(変更されている)
ISim_Co_Sim_22_110716.png

そうか、テストベンチはソフトウェアなので、コンパイルが高速なんですね。こういう使い方は非常に良いと思います。
つまり、ISimハードウェア協調シミュレーションの使いどころは、今のところ、ロジック部が重くて、シミュレーションを頻繁に書き換えてシミュレーションしたい場合ということになると思います。

ちなみに、ISimのGUIを落としても、UUT(DUT)に変更がなければ、インプリメント抜きでISimが立ち上がります。

  1. 2011年07月16日 21:53 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

ISimハードウェア協調シミュレーション2(FFTのシミュレーション1)

このところISimハードウェア協調シミュレーションをしようとしていたが、いろいろな問題があって、いろいろ試行錯誤していた。
ハイブリッド デザイン向けのハードウェア協調シミュレーションをやりたいと思って、”ISim ハードウェア協調シミュレーション :Spartan-6 メモリ コントローラーおよびオンボード DDR2 メモリ”をやろうとしたが、SP601を持っていない。SP605でやろうとしたが、変換するのが難しかった。結局、ハイブリッド デザイン向けのハードウェア協調シミュレーションはそれ用のHDLを書かなくてはいけないし、内部信号も見えないので、あまり得をしないかな?という考えになった。
(2013/07/05:追記)現在は、SP601のISim ハードウェア協調シミュレーション のマニュアルは無くなって、ML505nadoのマニュアルがある。”ISim ハードウェア協調シミュレーション : Virtex-5エンベデッド イーサネット MAC を介したライブ イーサネット トラフィックの処理

それよりは、そのまま実行出来るロジック ベースのデザイン向けモデルの有効性を検証してみたい。
そこで、”ISim ハードウェア協調シミュレーション チュートリアル : 浮動小数点高速フーリエ変換のシミュレーション”をやってみることにした。
これも、 Virtex®-6 FPGA ML605 評価キットのチュートリアルだが、SP605に変換してやってみることにした。やってみると、FFTのIPの生成が遅かった。30分くらいかかっていたので、途中で自分から落としてしまうことが多かった。
それにSpartan-6では、浮動小数点数のFFTがだめなようだったので、固定小数点に変更してやってみることにした。(使用したISEは13.2)

1.最初にSP605用の新規プロジェクトを作成した。
ISim_Co_Sim_9_110713.png

2.Project メニューからNew Source...を選択する。

3.New Sourece Wizardが起動する。IP(CORE Generator & Architecture Wizard) を選択して、File name:にfft_core2 と入力した。
ISim_Co_Sim_10_110713.png

4.Select IPダイアログで、Detital Signal Processing -> Transforms -> FFTs -> Fast Fouier Trasform 7.1 を選択する。Next->ボタンをクリックする。
ISim_Co_Sim_11_110713.png

5.Summaryが表示される。Finishボタンをクリックする。
ISim_Co_Sim_12_110713.png

6.Fast Fouier Trasformのダイアログが開く。Transform Lengthを16384に、Implementation OptionsをPipelined, Streaming I/Oに設定する。
ISim_Co_Sim_13_110713.png

7.チュートリアルでは、Floationg Pointにしてあるが、ここでは、Fixed Pointのままとする。Output OrderingをNatural Orderに変更する。これは、バタフライを元に順番に戻すオプションかな?
ISim_Co_Sim_14_110713.png

8.Optimize Options -> Complex Multipliers -> Use 4-multiplier structure (performance optimization) のラジオボタンをチェックする。これでGenerateボタンをクリックする。
ISim_Co_Sim_15_110713.png

9.FFTのIPが生成される。30分くらいかかるのでほっといた。

10.fp_fft_core_top.v を作成した。Verilogコードを下に示す。

module fp_fft_core_top(
    clk,
    start,
    xn_re,
    xn_im,
    fwd_inv,
    fwd_inv_we,
    scale_sch,
    scale_sch_we,
    rfd,
    xn_index,
    busy,
    edone,
    done,
    dv,
    xk_index,
    xk_re,
    xk_im);


    input wire    clk;
    input wire    start;
    input wire    [15 : 0] xn_re;
    input wire    [15 : 0] xn_im;
    input wire    fwd_inv;
    input wire    fwd_inv_we;
    input wire    [13 : 0]    scale_sch;
    input wire    scale_sch_we;
    output wire    rfd;
    output wire    [13 : 0] xn_index;
    output wire    busy;
    output wire    edone;
    output wire    done;
    output wire    dv;
    output wire    [13 : 0] xk_index;
    output wire    [15 : 0] xk_re;
    output wire    [15 : 0] xk_im;

    fft_core2 fft_core2_inst (
        .clk(clk), // input clk
        .start(start), // input start
        .xn_re(xn_re), // input [15 : 0] xn_re
        .xn_im(xn_im), // input [15 : 0] xn_im
        .fwd_inv(fwd_inv), // input fwd_inv
        .fwd_inv_we(fwd_inv_we), // input fwd_inv_we
        .scale_sch(scale_sch), // input [9 : 0] scale_sch
        .scale_sch_we(scale_sch_we), // input scale_sch_we
        .rfd(rfd), // ouput rfd
        .xn_index(xn_index), // ouput [13 : 0] xn_index
        .busy(busy), // ouput busy
        .edone(edone), // ouput edone
        .done(done), // ouput done
        .dv(dv), // ouput dv
        .xk_index(xk_index), // ouput [13 : 0] xk_index
        .xk_re(xk_re), // ouput [15 : 0] xk_re
        .xk_im(xk_im) // ouput [15 : 0] xk_im
    );
endmodule


11.一度インプリメントしてみたが、MAPにすごく時間がかかるので、諦めた。(今回はシミュレーションがメインなので。。。)
ISim_Co_Sim_16_110715.png

12.MAPのレポートを下に示す。LUTsは11%だが、RAMB16BWERsを53%、DSP48A1sを41%使用している。

Release 13.2 Map O.61xd (nt)
Xilinx Mapping Report File for Design 'fp_fft_core_top'

Design Information
------------------
Command Line   : map -intstyle ise -p xc6slx45t-fgg484-3 -w -logic_opt off -ol
high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -ir off
-pr off -lc off -power off -o fp_fft_core_top_map.ncd fp_fft_core_top.ngd
fp_fft_core_top.pcf 
Target Device  : xc6slx45t
Target Package : fgg484
Target Speed   : -3
Mapper Version : spartan6 -- $Revision: 1.55 $
Mapped Date    : THU 14 JUL 18:58:14 2011

Interim Summary
---------------
Slice Logic Utilization:
  Number of Slice Registers:                 4,929 out of  54,576    9%
    Number used as Flip Flops:               4,929
    Number used as Latches:                      0
    Number used as Latch-thrus:                  0
    Number used as AND/OR logics:                0
  Number of Slice LUTs:                      3,211 out of  27,288   11%
    Number used as logic:                    2,408 out of  27,288    8%
      Number using O6 output only:           1,026
      Number using O5 output only:              20
      Number using O5 and O6:                1,362
      Number used as ROM:                        0
    Number used as Memory:                     795 out of   6,408   12%
      Number used as Dual Port RAM:              0
      Number used as Single Port RAM:           32
        Number using O6 output only:            32
        Number using O5 output only:             0
        Number using O5 and O6:                  0
      Number used as Shift Register:           763
        Number using O6 output only:           153
        Number using O5 output only:             0
        Number using O5 and O6:                610
    Number used exclusively as route-thrus:      8
      Number with same-slice register load:      0
      Number with same-slice carry load:         8
      Number with other load:                    0

Slice Logic Distribution:
  Number of LUT Flip Flop pairs used:        4,258
    Number with an unused Flip Flop:           296 out of   4,258    6%
    Number with an unused LUT:               1,047 out of   4,258   24%
    Number of fully used LUT-FF pairs:       2,915 out of   4,258   68%
    Number of unique control sets:              28
    Number of slice register sites lost
      to control set restrictions:              42 out of  54,576    1%

  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.

IO Utilization:
  Number of bonded IOBs:                        95 out of     296   32%

Specific Feature Utilization:
  Number of RAMB16BWERs:                        62 out of     116   53%
  Number of RAMB8BWERs:                          9 out of     232    3%
  Number of BUFIO2/BUFIO2_2CLKs:                 0 out of      32    0%
  Number of BUFIO2FB/BUFIO2FB_2CLKs:             0 out of      32    0%
  Number of BUFG/BUFGMUXs:                       1 out of      16    6%
    Number used as BUFGs:                        1
    Number used as BUFGMUX:                      0
  Number of DCM/DCM_CLKGENs:                     0 out of       8    0%
  Number of ILOGIC2/ISERDES2s:                   0 out of     376    0%
  Number of IODELAY2/IODRP2/IODRP2_MCBs:         0 out of     376    0%
  Number of OLOGIC2/OSERDES2s:                   0 out of     376    0%
  Number of BSCANs:                              0 out of       4    0%
  Number of BUFHs:                               0 out of     256    0%
  Number of BUFPLLs:                             0 out of       8    0%
  Number of BUFPLL_MCBs:                         0 out of       4    0%
  Number of DSP48A1s:                           24 out of      58   41%
  Number of GTPA1_DUALs:                         0 out of       2    0%
  Number of ICAPs:                               0 out of       1    0%
  Number of MCBs:                                0 out of       2    0%
  Number of PCIE_A1s:                            0 out of       1    0%
  Number of PCILOGICSEs:                         0 out of       2    0%
  Number of PLL_ADVs:                            0 out of       4    0%
  Number of PMVs:                                0 out of       1    0%
  Number of STARTUPs:                            0 out of       1    0%
  Number of SUSPEND_SYNCs:                       0 out of       1    0%



まだシミュレーションしていませんが、今回は終了です。次回に続く。
  1. 2011年07月15日 05:52 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0
»