FC2カウンター FPGAの部屋 OVL(Open Verification Library)を試してみる4(OVL_range)
FC2ブログ

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

FPGAの部屋

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

OVL(Open Verification Library)を試してみる4(OVL_range)

今回は、今までのassert_range をOVL V2のovl_range に書き換えてみようと思う。なお、std_ovl/docs/pdfdocs/ovl_lrm.pdf (Accellera Standard OVL V2 Library Reference Manual) を参考にしている。
まずは、OVL V1のassert_rangeは今までやってきた通り。

   assert_range #(
                  /*severity_level*/`OVL_FATAL, 
                  /*width*/ 4, 
                  /*min  */ 0, 
                  /*max  */ 9, 
                  /*property_type */`OVL_ASSERT, 
                  /*msg*/ "The counter arrived at invalid range.", 
                  /*coverage_level*/`OVL_COVER_CORNER)
     counter_checker_inst (
                           .clk(ICLK), 
                           .reset_n(~IRST), 
                           .test_expr(OCOUT));


次に、OVL V2のovl_range で書き換えた例を示す。なお、このovl_range は論理合成可能だそうだ。

   ovl_range #(
                `OVL_FATAL,         // severity_level
                4,                     // width
                0,                     // min
                9,                     // max
                `OVL_ASSERT,         // property_type
                "The counter arrived at invalid range.", 
                `OVL_COVER_CORNER,    // coverage_level
                `OVL_POSEDGE,        // clock edge
                `OVL_ACTIVE_HIGH,    // reset_polarity
                `OVL_GATE_CLOCK)    // gating type
     counter_checker_inst (
                .clock(ICLK), 
                .reset(IRST), 
                .enable(1'b1),
                .test_expr(OCOUT),
                .fire(fire)
    );


パラメータでは、clock edge、reset_polarity、gating typeが増えている。ポートではenableとfire が増えている。
fire の定義は、 wire [`OVL_FIRE_WIDTH-1:0] fire; で、OVL_FIRE_WIDTHは3だ。fire[0] は、アサーションの失敗した時に1になる。fire[1] はX/Zチェックが失敗した時に1になる(X/ZチェックはXやZになったときだろうか?)。fire[2] はカバー・イベントがあった時に1になるそうだ。つまり今は、OVL_COVER_CORNERにしているので、コーナーの時、つまりOCONTが0と9の時に1になるのだと思われる。
この修正後にシミュレーションをしてみた結果を下に示す。
OVL_sample_7_100312.png

コーナーの値0と9の次のクロックでfire[2]が1となるのがわかる。
次に、coverage_levelをOVL_COVER_BASICとしてコーナーの値でカバーを出さないようにして、max値を8として、わざとアサーションを失敗させてみよう。これでシミュレーションしてみたのが下の図。
OVL_sample_8_100312.png

235ステップ目でOCOUTが9となって、アサーションを失敗して、OVL_FATALになったので、335ステップ目でfinish している。ここで、severity_levelをOVL_ERRORにして再度シミュレーションを行うと、OCOUTが9になったときにfire[0] が1となる。
OVL_sample_9_100312.png

severity_levelがOVL_FATALの時に、アサーションが失敗した時からシミュレーションが終了するまでの時間は、グローバルのマクロ、OVL_RUNTIME_AFTER_FATALで設定することができる。デフォルト値は100だ。
  1. 2010年03月13日 13:16 |
  2. アサーション事始め
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/1404-c2503d48
この記事にトラックバックする(FC2ブログユーザー)