水曜日, 1月 23, 2008

アサーションを使いましょう

と言いつつ、私も実際の業務で積極的に使っているわけではないので自分にも向けて。

アサーションとは、デザインが実行されている間、常に成立すると期待されている条件や動作を宣言することです。

たとえば、

このデザインでは仕様上、入力よりも出力のほうがスループットが高いので
デザイン中のFIFOのFullフラグが立つことは決して無い。


という場合は、「Fullフラグは常に偽である」と宣言します。
これがアサーション。

もちろん、コード中にこのコメントを挿入しても何の効力もないので
(コードを読んだ人間が設計者の意図を読み取れるというメリットはあるが)
何かしら効力のある方法でアサーションを使わなければなりません。

アサーションを記述する方法としては、PSLやSVA(SystemVerilog Assertion)などがあると思いますが、シンプルなアサーションであれば普通のVerilog HDLでも記述できます。

先の例だと、コード中にこんな具合に記述してやるだけです。

`ifdef SIMULATION

always @(posedge CLK) begin
if (FIFO_FULL!=0)
$display("Assertion failed! FIFO full flag should be always 0.");
end

`endif


それほど手間ではないでしょう?

一度記述しておけば、シミュレーションを行うたびにいつもアサーションがデザインを監視してくれるのです。

また、アサーションはデザインの内部で監視しているので、デザインの外で出力をチェックするよりも、バグの原因に近い場所で問題を発見できます。

さらにアサーションの後段の部分に対しては、アサーションでチェックされている部分については常に保障されていることになります。
アサーションを用いず、出力をチェックする場合は、問題が発生した時にデザイン全てを疑わなければならないかもしれませんが、アサーションを記述しておくことで、少なくともそのアサーション周辺やそれらに関連する部分は正しく動作しているということがわかります。

少しの手間が必要ですが、アサーションがあなたのデザインを守ってくれるんです。

シミュレーションだけでなく、アサーションはフォーマル検証にも使用されます。
この場合、フォーマル検証が使えるEDAが必要ですが
テストベンチを書かずにバグを発見することができます。
数学的な手法を用いて、あるデザインにおいて宣言したアサーションが常に成立するかどうかを検証するのです。
あまり大きなデザインには不向きかもしれませんが、動的な検証手法では見つけにくいバグを発見することができるようです。

いきなりOVLなどの検証ライブラリを使用したり、高価なEDAを購入することは難しいという方は、まずは簡単なVerilog HDLでの記述からはじめてはいかがでしょうか?

0 件のコメント: