FC2カウンター FPGAの部屋 ISimハードウェア協調シミュレーション3(FFTのシミュレーション2)
fc2ブログ

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

FPGAの部屋

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

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

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/1853-874228ca
この記事にトラックバックする(FC2ブログユーザー)