SystemVerilog
ハードウェア検証言語におけるカバレッジとは、シミュレーション内のイベントをサンプリングして統計情報を収集することを指します。カバレッジを利用して評価対象デバイス(DUT)が正しく機能しているかどうかをある程度正確に判定できる。これは、ソフトウェアテストでコードが実行された割合の尺度であるコード網羅率(code coverage)とは異なる概念であることに注意されたい。機能カバレッジでは、必要とする設計上の隅々まで検証していることを保証する。
SystemVerilog のカバレッジグループは関連する変数の値の度数分布のデータベースを生成する。クロスカバレッジを定義することもでき、複数の変数の値の組合せ(直積集合)の度数分布を生成する。
サンプリングイベントはサンプルを採取するタイミングを制御する。サンプリングイベントは Verilog のイベントでもよいし、ブロックの出入り口でも、カバレッジグループの sample メソッド呼び出しでもよい。ただし、意味があるデータだけをサンプル採取するよう注意しなければならない。
例:
この例では、検証者はブロードキャストのフレームとユニキャストのフレームに注目し、特に size/type フィールドとペイロードサイズに注目している。ペイロードサイズの coverpoint には注目している限界値群を反映していて、最大フレームと最小フレームを含んでいる。
gnt に続いて req が High になるということを正確に表現するには属性表明が必要となる:
この例では含意演算子 |=> を使っている。含意の左辺は antecedent(先行事項)と呼ばれ、右辺は consequent(結果事項)と呼ぶ。含意の評価は、まず先行事項を繰り返し評価することから開始する。先行事項が成功すると、結果事項を評価する。表明全体として成功するかどうかは結果事項の評価結果に依存する。この例では結果事項は req が High になるまで評価せず、gnt がその1クロック後にHighにならない場合にこの属性表明に失敗する。
表明のほかに、SystemVerilog は属性の「仮定; assumptions」と「カバレッジ; coverage」に対応している。仮定とは、形式論理証明ツールで必ず真となる条件を記述するものである。表明は真であることが証明されなければならない属性を指定する。シミュレーションでは、表明と仮定は並行して検査する。属性のカバレッジは、表明が正確に設計を監視しているかどうかを検証するためのものである。
Verilog の always ブロックに加え、SystemVerilog では設計構造をより意識した手続きブロックを新たに提供している。これによってEDAツールはどういう動作が求められているのかを正確に把握できるようになる。
always_comb ブロックは組合せ論理を生成する。シミュレータはブロック内の文からセンシティビティ・リストを推定する:
always_ff ブロックは順序論理(FF回路)を推定する:
always_latch ブロックはラッチを推定する。この場合もセンシティビティ・リストはコードから推定できる:
入れ子になった if や case 文において、unique属性を指定することで必ず1つの分岐(case)だけが実行されることを指示できる(どれも実行できない場合はエラーとなる)。つまり、各ケースは並行して実行可能である。if や case 文での priority属性は条件を順次評価していくことを示す。これまでアノテーションで synopsys full_case parallel_case を使って指示していたことを正式にキーワードとして指示できるようになったのである。