FC2カウンター FPGAの部屋 2009年07月10日

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

FPGAの部屋

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

Veritak(Basic)Ver. 3.71CでVHDLファイルの変更点を表示

VHDLのプロジェクトをVHDLファイルを修正している際に、修正前と修正後でシミュレーションの波形にどんな違いがあるかを知りたいと思っている。それはModelSim単体でも出来るが、Veritak(Basic)Ver. 3.71を使うともっと分かりやすく表示することができる。
まずは、キャラクタ・ディスプレイ・コントローラのこのブログでは非公開のVHDL版をModelSimでシミュレーションしてみる。ModelSimを立ち上げ、すべてのファイルをコンパイルする。それの状態が下の図。
VHDL_VHDL_comp_1_090709.png

SimulateメニューからStart Simulation...でシミュレーションをスタートする。いつものダイアログが出る。この辺の詳しいやり方は”DDR SDRAMコントローラのシミュレーション2(シミュレーションスクリプト)”を参照のこと。ちなみにResolutionはpsとした。
VHDL_VHDL_comp_2_090709.png

これからVCDのコマンドでModelSimにVCDファイルを生成させる。”ModelSimでVHDLのプロジェクトからVCDファイルを出力する方法(覚書)”を参照。
今回はVSYNCが1個出力されるまでシミュレーション (20ms) する予定なので、全体のVCDファイルを作成すると500MBを超えてしまう。従って、disp_timing.vhdのVCDファイルを作成して比較することにする。
一番下のtranscriptウインドウにvcdのファイル名を指定するコマンドを書く。

vcd file disp_timing1.vcd


VHDL_VHDL_comp_3_090709.png

続いて、vcdのコマンドを投入する。

vcd add -r /chardispctrlertest_tb/uut/chardispctrler_inst/disp_timing_inst/*
run -all
quit -f


quit -f を実行するとModelSimが終了する。その前の状態が下の図。
VHDL_VHDL_comp_4_090709.png

これで、disp_timing1.vcd という28.1MBのVCDファイルができた。ちなみにrun -all して、20msでシミュレーションが停止するのは、そのようにテストベンチが書いてあるからだ。下参照。

    process begin
        reset <= '1';
        
        wait for 100 ns;
        reset <= '0';
        
        wait for 20 ms;
        assert (false) report "Simulation End!" severity failure;
    end process;


次に、少しdisp_timing.vhd を変更して、VCDファイルを出力してみる。disp_timing.vhdは水平同期信号や垂直同期信号、表示のタイミングなどを出力している。表示タイミングの定義はdisp_timing_pack.vhd のconstantで定義されている。下がそのVHDLファイルの内容。

-- 表示タイミングの定義

library ieee;
use ieee.std_logic_1164.all;

package disp_timing_pack is
    constant H_ACTIVE_VIDEO : integer := 640;
    constant H_FRONT_PORCH : integer := 16;
    constant H_SYNC_PULSE : integer := 96;
    constant H_BACK_PORCH : integer := 48;
    constant H_SUM : integer := H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;

    constant V_ACTIVE_VIDEO : integer := 480;
    constant V_FRONT_PORCH : integer := 11;
    constant V_SYNC_PULSE : integer := 2;
    constant V_BACK_PORCH : integer := 31;
    constant V_SUM : integer := V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

    constant H_DISPLAY_SIZE : integer := H_ACTIVE_VIDEO/8; -- 横80桁
    constant V_DISPLAY_SIZE : integer := V_ACTIVE_VIDEO/8; -- 縦60行
    
    constant RED_DOT_POS : integer := 9; -- 9ビット目がRED
    constant GREEN_DOT_POS : integer := 8; -- 8ビット目がGREEN
    constant BLUE_DOT_POS : integer := 7; -- 7ビット目がBLUE
end disp_timing_pack;


これらの中のV_SYNC_PULSE(垂直同期信号幅)を2から3に変更する。

--    constant V_SYNC_PULSE : integer := 2;
    constant V_SYNC_PULSE : integer := 3;


もう一度ModelSimを起動して、コンパイルを行ってから、同様にdisp_timing2.vcd を作成する。

これで2つのdisp_timingのVCDファイルがそろったので、Veritakを立ち上げてVCDファイルを比較してみよう。
Verilogプロジェクトメニューから新しいプロジェクトの作成を選択する。Veritakの使い方は、”Veritakでのシミュレーション方法1(SuzakuV DDR2 SDRAMテスト回路を使用)”、”Veritakでのシミュレーション方法2(SuzakuV DDR2 SDRAMテスト回路を使用)”、”Veritakでのシミュレーション方法3(SuzakuV DDR2 SDRAMテスト回路を使用)”を参照のこと。

Veritak(Basic)Ver. 3.71Cを起動して、disp_timing_comp.vtakprj という名前のプロジェクトを作成する。そのプロジェクトにdisp_timing1.vcdとdisp_timing2.vcdを追加する。
VHDL_VHDL_comp_5_090709.png

これで、Save Projectボタンをクリックして、プロジェクトをセーブする。Exitボタンをクリックしてダイアログを消す。
VeritakプロジェクトからLoad Verilogプロジェクトを選択して、disp_timing_comp.vtakprj プロジェクトをロードする。
Scope Tree Viewerを前面にのアイコンをクリックして、Scope Tree Viewer とWaveform Viewer を表示する。
VHDL_VHDL_comp_6_090709.png

Scope Tree Viewの最初の項目を展開してdisp_timing_inst をクリックする。VCD Structure に信号名が表示される。その信号をすべて選択して右クリックする。すると、右クリックメニューが表示されるので、そこから”選択されたVCD信号をバス化して追加”を選択する。
VHDL_VHDL_comp_7_090709.png

すると、Waveform Viewer にバス化された信号が挿入される。
VHDL_VHDL_comp_8_090709.png

次にもう1つのタイミングを変更したdisp_timingの信号を間に挿入しよう。
Scope Tree View の下のdisp_timing_instを選択して、右クリックする。右クリックメニューの中から”信号をWaveform Viewerに追加する”を選択し、サブのメニューから”波形比較用の信号をこの階層以下から自動選択し追加する”を選択する。
VHDL_VHDL_comp_9_090709.png

Waveform Viewer を見ると、同じ信号名が2つずつ入った。次にユーティリティメニューから”VCD波形の表示スタート時刻を変更する”を選択する。
VHDL_VHDL_comp_10_090709.png

VCD Timestart Shift Dialog が開く。Check by Read Marker のチェックボックスをチェックする。さらに、Waveform Viewer の一番左はじのアイコンをクリックし、波形全体を表示する。
VHDL_VHDL_comp_11_090709.png

波形を見ていくとv_addr などに赤い部分が見られる。(上下の信号を比較して違っている部分を赤く表示する)
VHDL_VHDL_comp_12_090709.png

ここを拡大してみると、上のv_addrは20aまでカウントして000に戻っているが、下のv_addrは20bまでカウントとして000に戻っているのが分かる。( disp_timing1.vcd と disp_timing2.vcd )
VHDL_VHDL_comp_13_090709.png

ここで、VCD Timestart Shift Dialog のSet Time Offset に32000 を入れて、Setボタンをクリックする。
VHDL_VHDL_comp_14_090709.png

同じ信号名が上下に並んだWaveform Viewer の信号のうち、上だけがずれて、下の信号が20bまでカウントする以外は上の信号に同じということが分かる。つまり、上の信号の20aの位置と下の信号の20bの位置を合わせたわけだ。
これで、VHDLファイルでもModelSimでVCDファイルを吐かせることによって、Veritakで検証することができた。この機能は少し回路を変更したけれど、他に副作用が及ばないかどうかを検証することができると思う。
まだ確かめてはいないのだが、動作周波数が足りない場合にロジックの間にFFを挿入してパイプライン化する場合があるが、その場合にパイプライン化する前の以前の波形と、現在の波形をlこの機能で比較しすることができると思う。Time Offset 0で比較した後、1クロックずらしたTime Offset で比較し、その他のモジュールからの信号がパイプライン化に与える影響を少しは見ることができるのでないか?と思っている。

最後に注意なのだが、この比較機能はWaveform Viewer に最初に表示された信号と次の信号を比較しているようなのだ。従って、Waveform Viewer の1番目の信号と2番目の信号の信号名が違っている場合は、かなり赤くなってもあわてずに、Waveform Viewer の1番目の信号と2番目の信号名をそろえるようにした方が良いようだ。
VHDL_VHDL_comp_15_090709.png

  1. 2009年07月10日 04:56 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0