ご挨拶 †我が社(有限会社赤葉ロジック→以下"RLL"と表示)の活動内容をご理解いただくために、ある程度の技術内容を継続的に技術メモとして公開して行きます。ただし技術メモの公開条件は、apache2ライセンスです。 /----------------------------------------------------------------------------/ / Copyright 2008 有限会社赤葉ロジック / /Apache License Version 2.0(「本ライセンス」)に基づいてライセンスされます。/ /あなたがこのファイルを使用するためには、本ライセンスに従わなければ / /なりません。本ライセンスのコピーは下記の場所から入手できます。 / / http://www.apache.org/licenses/LICENSE-2.0 / /適用される法律または書面での同意によって命じられない限り、本ライセンスに / /基づいて頒布されるソフトウェアは、明示黙示を問わず、いかなる保証も / /条件もなしに「現状のまま」頒布されます。本ライセンスでの権利と制限を / /規定した文言については、本ライセンスを参照してください。 / /----------------------------------------------------------------------------/ 検証 †主にVMMとsystemVerilogを中心に検証の技術メモを公開します。 目次 systemVerilog †randomize()の威力をグラフにしてみる †randomaize()てそんなに便利??と思ったので数値化しグラフにしてみた。 回路はお手軽にcase文で作成、順番による調停回路20bit(ラウンドロビン)ただしクロック毎に調停する RTLは下記参照 カバレッジ値の変化を見たいだけなのでアサーションはovlのassert_zero_one_hotのみ付けといた。 結果は冒頭のグラフにあるとおりrandomパターンを80個生成でカバレッジ100%達成。結構収束が速い。。回路の性格で?? randomize()を使用した回路検証の雰囲気が何となくつかめた。 VMM †VMMとは †米Synopsys(シノプシス)社提唱する機能検証手法「Verification Methodology Manual(VMM) for SystemVerilog」です。 2008 5/末頃 apache2ライセンスの元、ソースコード&説明書が公開された。
デジタルシステムを開発する時の機能検証の手法と、その時に使用するライブラリをまとめた物。
動作サンプルcvc_counter&VMMをmodelsim PEで動かしてみる。 †cvc_counter&VMMがmodelsimPEで動作しない要因は、
の3点だ。 上記のどの項目も致命的であるが、動作サンプルを動かしてみる→不完全でもVMMとは何かが分かる或いは、実務で使用してみようかなと思える動作状態を目指す。 方針は、
とする。 cvc_counterとは †cvc info TechのBagath氏がQuestaに対応するVMMコードと例題(cvc_counter)をフォーラムされました。この中の例題がcvc_counterでchannelを使用した本格的な例題となっている。
http://www.vmmcentral.org/forums/viewtopic.php?f=2&t=28
http://blogs.yahoo.co.jp/verification_engineer/41968097.html program文をmodule文に置き換える。 †機能的には、
つまりprogram文で記述できることはmodule文でも記述できる。 program文で不都合な点はスケジューリングにありmodule文より必ず 後ろに来るようスケジューリングされる(同時刻の場合だよ!!)。 と言うことで、module文に置き換えは、気をつけていれば問題なく動作する。
program counter.... .... endprogram → module counter... .... endmodule randomize()の紛い物randomize_ptm()を作成する。 †
注)randomize_ptm()→名前は任意だ。_ptmは”ぱっちもん”を縮めた。
function int randomize_ptm() ; .... return 1 ; endfunction 注)呼び出し側で戻り値を期待しているのでfunctionにして return 1 を入れておく。 例を1個示しておく。要はrandomizeにして欲しい事をプログラムする。 counter_atomic_gen.svならこれ。 function int randomize_ptm() ; logic [31:0] rand_val ; begin : rand_loop while (1) begin rand_val = $random() ; if((rand_val[7:4] < 10) && (rand_val[7:4] > 0)) disable rand_loop ; end end : rand_loop no_of_xactions = {28'h0000000, rand_val[7:4]} ; return 1 ; endfunction class Test_cfg; を見ると制約で1〜9間での乱数を生成している。 似たような物を作ればOK → if文で0, 10以上を捨てている。。。。 とりあえずmodelsimPEを使用してみる。 †実はQuestaでもverで動作するしないがあり、6.3xでOK、 6.4だめとの事。 modelsimPEはQuestaから機能をかなり削除した物なので基本的な所は同じ。
これでコンパイル(vlog)は通る。 以上で波形が出るようになる。 |