VHDLのセンシティビティリストの重要性

出典: Wikimura

(合成可能な)プロセス文はひと固まりの論理回路を意味すると考えてOK。 センシティビティリストは、「プロセス文の意味する論理回路」の入力信号を列挙したものでなくてはならない。


書籍やWeb上の情報では、センシティビティリストにクロックしか書かないというものがある。 論理合成ツールは自動的に必要な信号を検出し、回路を作ってくれるのでそれで問題ない場合が多い。 (XilinxがIPIF(OPBやPLBに自作IPをつなぐときに作るもの)のテンプレートを生成するときがそう)


しかし、ModelSimなどのシミュレーションツールを使う場合はセンシティビティリストは非常に重要な役割を担う。記述が不十分だと、シミュレーション結果が意図したとおりにならない。

シミュレータはプロセス文のセンシティビティリストの信号を監視し、それが変化しない限りプロセス文を動かさないらしい。

完全な記述ではないが、以下のような書き方をすると、下のプロセス文をシミュレータがうまく取り扱えないはず。 シミュレータは下のプロセス文を起動するタイミングが分からないため、cmpはずっと未初期化状態になるはず。

process( clk, rst)
begin
    if( clk'event and clk = '1') then
       if( rst = '1') then
           cnt <= 0;
       else
           cnt <= cnt + 1;
       end if;
    end if;
end process;

process( )
begin
    if( cnt < 10) then
        cmp <= '1';
    else
        cmp <= '0';
    end if;
end process;


センシティビティリストの中の信号が変化すると「処理が始まる」というイメージだが...実際はプロセス文は1つの回路を表すもの。 入力信号が変化したら、「プロセス文に書かれた命令が実行されたかのように」出力信号が変化するということ。実際には入力信号の変化が即出力に反映される。


センシティビティリストが「プロセス文が表す回路」の入力だとすると、プロセス文内の信号代入文は出力を意味する。 信号代入文が「代入しても値がすぐには反映されない」イメージがあるのも、プロセス文が論理回路を表すということからわかる。そもそも電気信号なのだから。