1. はじめに
    このページでは,Verilog で記述したHDLのコードをXilinx社製ISim(HDL用シミュレータ)でシミュレーションする方法について説明します.
  2. 実行環境
    ・開発環境:ISE WebPACK 14.7
    ・シミュレータ:ISim 14.7
  3. Verilogのコード
    このページでシミュレーションをするにあたり,全加算器と全減算器が含まれるプロジェクトに対して行います.こちらに圧縮しておいておきます.ここにあるコードの内容は,SW1~SW3が全加算器と全減算器の入力,そしてその出力をSW4で切り替えてLD1とLD2に出力する回路となっています.下図にてブロック図を示します.

    00

  4.  プロジェクトファイルのオープンとテストベンチの追加
    まずはコードが入っているプロジェクトを開きます.プロジェクトファイルであるFAFS.xiseファイルをダブルクリックすると下のようにISE WebPACKが起動します.

    01

    次にテストベンチを追加します.テストベンチの追加には,メニュー[Project]内にある[New Source...]を選択します.

    02

    新しいソースとして,テストベンチを追加します.下図のように[Verilog Test Fixture]を選択し,さらにテストベンチ名をFile nameに記入します.テストベンチ名は何でもいいですが,この後にシミュレーションを行うFAFSモジュールに合わせ,ここではt_FAFSとしました.

    03

    次にシミュレーションを行うモジュールを選択します.ここではFAFSに対してシミュレーションを行いたいので下図のようにそれを選択します.

    04

    最後に,ここまでで行ったテストベンチの概要が示されます.下図のように[Finish]を選択してください.

    05

  5. テストベンチの記述
    作成しましたt_FAFSにテストベンチを記述していきます.ここでは,SW1~SW3について,0と1を繰り返すようにし,SW4を0のままにするようなテストベンチを行います.SW4をそのままということなので,この場合には全加算器の動作が見られるはずです.下に作成したテストベンチを示します.網掛けしてある箇所が追記した箇所となっています.
    module t_FAFS;
    
    	// Inputs
    	reg SW1;
    	reg SW2;
    	reg SW3;
    	reg SW4;
    
    	// Outputs
    	wire LD1;
    	wire LD2;
    
    	// Instantiate the Unit Under Test (UUT)
    	FAFS uut (
    		.SW1(SW1), 
    		.SW2(SW2), 
    		.SW3(SW3), 
    		.SW4(SW4), 
    		.LD1(LD1), 
    		.LD2(LD2)
    	);
    
    	integer i,j,k;
    
    	initial begin
    		// Initialize Inputs
    		SW1 = 0;
    		SW2 = 0;
    		SW3 = 0;
    		SW4 = 0;
    
    		// Wait 100 ns for global reset to finish
    		#100;
    
    		// Add stimulus here
    		for(i=0; i<2; i=i+1)
    		begin
    			for(j=0; j<2; j=j+1)
    			begin
    				for(k=0; k<2; k=k+1)
    				begin
    					#10 SW1 = SW1 + 1'b1;
    				end
    				SW2 = SW2 + 1'b1;
    			end
    			SW3 = SW3 + 1'b1;
    		end
    	end
          
    endmodule
  6. ISimの起動
    では,作成したテストベンチを動かしてみましょう.下図のように[Simulation]ラジオボタンを選択,テストベンチを選択,そして[Simulate Behavioral Model]を選択します.

    06

  7. シミュレーションの実行
    ISimが立ち上がると下の図のようになります.このうち,シミュレーションの実行を行うためのアイコンは上側に集中しています.

    07

    実行に関するアイコンを拡大したものを下に示し,左から順番に説明していきます.

    08

    ・Restart:シミュレーションを最初からやり直す前に押されます.
    ・Run All:止められるまでずっと実行します.
    ・Run for the time:このアイコンの右側にある時間だけ実行されます.
    ・Step:テストベンチを一行ずつ実行されます.
    ・Break:Run Allで実行するとずっと実行し続けますが,それをいったんやめられます.上記の図ではRun Allをしていないのでインアクティブになっています.

    ここの例では1[us]実行させてみます.従って,まずは[Restart]を押して,そののちに[Run for the time]を押してください.その結果,下の図のようになるはずです.

    09

    さて,これでは見たい100[ns]~200[ns]あたりが見えません.見たいところを中心に見るには下図に示すアイコンを使います.これらは画面上部にあります.

    10

    左から順番に説明していきます.
    ・Zoom In:拡大します.
    ・Zoom Out:縮小します.
    ・Zoom to Full View:全体を見られるようにします.
    ・Zoom to Cursor:カーソルで選択した箇所を拡大します.

    ここでは,Zoom to Full Viewを押したのち,Zoom to Cursorを使って100~200[ns]付近を選択します.SW1~SW3が変化するに従い,LD1(全加算器のS)とLD2(全加算器のCo)が変化している様子が分かります.

    11

  8. 内包しているモジュールにある信号の追加
    最後に,内容しているモジュールの信号を見る方法について説明します.デバック中に内包しているモジュールの挙動を確認したいときがあります.そのようなときに使えるテクニックです.ここでは全加算器のSの信号を見ようと思います.下図のように,左側ウィンドウ内にある[t_FAFS]の左側の三角アイコンを押すと,t_FAFSの階層構造が見られます.さらに[uut]の左側三角アイコンを押し,その中にある[U1]をクリックするとU1に含まれる信号が見えます.ここでは[S]を見たいのでこれをタイミングチャートの方へドラッグアンドドロップしてください.その結果が下の図です.

    12

    このままではSの信号が現れません.先ほど説明した手順に従い,シミュレーションを再度実行してください.そうすると,Sの信号が見られるはずです.
    以上のようにシミュレーションをし,より簡単にデバックしていきましょう.