今月の作業日誌

2004/05/01   シミュレーション
昨日からの続きで遊んでいますが、どうも意図した動作になっていません。 やむなく(いや、この考え方は間違っていますね)、シミュレーションで何が起こっているか確認することにしました。
ざっと調べてみると、階層化したそれぞれについてシミュレーション可能な模様。 例えば、こんなのがあって、
---
entity SW_INPUT is
    Port ( CLK : in std_logic;
           RST : in std_logic;
           INPUT_CHECK : in std_logic;
           SW_IN : in std_logic;
           SW_OUT : out std_logic);
end SW_INPUT;
---
シミュレーションに使うテストベンチのひな形を自動生成して、外部から与える信号を次のように指定しました。 で、シミュレーションを実行してみると、誤りを発見しました。 ただ、この信号の与え方は問題があるようなのですが。
---
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY sw_input_sw_input_tb_vhd_tb IS
END sw_input_sw_input_tb_vhd_tb;

ARCHITECTURE behavior OF sw_input_sw_input_tb_vhd_tb IS 
        COMPONENT sw_input
        PORT(
                CLK : IN std_logic;
                RST : IN std_logic;
                INPUT_CHECK : IN std_logic;
                SW_IN : IN std_logic;          
                SW_OUT : OUT std_logic
                );
        END COMPONENT;

        SIGNAL CLK :  std_logic;
        SIGNAL RST :  std_logic;
        SIGNAL INPUT_CHECK :  std_logic;
        SIGNAL SW_IN :  std_logic;
        SIGNAL SW_OUT :  std_logic;
BEGIN
        uut: sw_input PORT MAP(
                CLK => CLK,
                RST => RST,
                INPUT_CHECK => INPUT_CHECK,
                SW_IN => SW_IN,
                SW_OUT => SW_OUT
        );

   tb : PROCESS
   BEGIN
        CLK <= '1';
        wait for 14 ns;
        CLK <= '0';
        wait for 14 ns;
   END PROCESS;

        process
        begin
                RST <= '1';
                wait for 2 ns;
                RST <= '0';
                wait for 28 ns;
                RST <= '1';
                wait;
        end process;

        process
        begin
                INPUT_CHECK <= '0';
                wait for 56 ns;
                INPUT_CHECK <= '1';
                wait for 28 ns;
        end process;

        process
        begin
                SW_IN <= '1';
                wait for 200 ns;
                SW_IN <= '0';
                wait for 200 ns;
        end process;
END;
---
ソフトのデバッガのように内部を自由に観測できるのではなくて、外部とのインタフェースで観測できる ものでした。ブラックボックステストでは非常に重要な機能ですが、ホワイトボックステストを行いたい 場合にどうすればいいのかは、またの課題ということで。

2004/05/04   シミュレーション その2
前回のシミュレーションの続き
今まで[1]を見てやってきましたが、ふと[2]を見ると、前回わからなかった内部の信号を見る方法が 書いてありました。ModelSimのstructureで見たいレイヤを選ぶとsignalsにそのレイヤの信号名が 一覧表示されるので、見たい信号をwaveウィンドウにドラッグすればOKでした。 これはいいなあ。
以前のトラ技にModelSimの使い方の付録がありました。また読んでみましょう。

参考文献
  1. 堀 桂太郎, 図解VHDL実習, 森北出版, 2004
  2. EDX-001ユーザーズマニュアル 第2版R2, ヒューマンデータ, 2003

2004/05/05   シミュレーション その3

引き続き[1]を見ていると(いや、あの、このEDX-001を使っている訳ではないのですが・・・)、 シミュレーションのためのテストベンチ波形を作成する機能があるようです。 どんなものか、簡単な4ビットレジスタを作って試してみました。

VHDLファイルを作っておいて、メニューの[New File]で[Test Bench Waveform]を選ぶと、 HDL Bencherが起動するので、これで波形を描きます。といっても、ほとんどクリックするだけなので 楽ちんです、クロックも自動生成してくれますし。

で、これを保存してシミュレーションを実行すると、次のような結果になりました。 これはいいですね。

この入力波形のソースコードのうち、クロックを見てみると、次のようになっていました。なるほどです。 HDL Bencherを起動してすぐ入力するパラメータは、このように反映されるのですね。

---
PROCESS -- clock process for CLK,
BEGIN
        CLOCK_LOOP : LOOP
        CLK <= transport '0';
        WAIT FOR 10 ns;
        CLK <= transport '1';
        WAIT FOR 10 ns;
        WAIT FOR 40 ns;
        CLK <= transport '0';
        WAIT FOR 40 ns;
        END LOOP CLOCK_LOOP;
END PROCESS;
---

ところで、このtransportって何でしょ?transport '0' after 5 nsとかなら伝播遅延の 書き方のようなのですが、after xxxがなくtransportだけの場合は、特別な意味が あるのかどうか不明です。いつか、わかる日が来るでしょうか?


参考文献
  1. EDX-001ユーザーズマニュアル 第2版R2, ヒューマンデータ, 2003

2004/05/13   MITOUJTAG
IPAXで、なひたふさんがMITOUJTAGを発表されていたので、聞きに行きました。 (いや、その後の、SoftEtherを聞きに行ったという話も・・・)
やはり実際に動作している物を見せるというのは、迫力が違いますね。 さっそく感化されて、うちのボードで試してみましたが・・・途中までは進むものの、 結局うまくいかず、原因もよくわかりません。経験値が足りませんね。 JTAGの本でも読んで、勉強しよう。

2004/05/29   業務連絡
動作確認できました。

ホーム 特殊工作室 作業日誌