#freeze
#norelated
* ご挨拶 [#r8c36bac]

我が社(有限会社赤葉ロジック→以下"RLL"と表示)の活動内容をご理解いただくために、ある程度の技術内容を継続的に技術メモとして公開して行きます。
我が社(有限会社赤葉ロジック→以下"RLL"と表示)の活動内容をご理解いただくために、ある程度の技術内容を継続的に技術メモとして公開して行きます。ただし技術メモの公開条件は、apache2ライセンスです。
 /----------------------------------------------------------------------------/
 /  Copyright 2008 有限会社赤葉ロジック                                       /
 /Apache License Version 2.0(「本ライセンス」)に基づいてライセンスされます。/
 /あなたがこのファイルを使用するためには、本ライセンスに従わなければ          /
 /なりません。本ライセンスのコピーは下記の場所から入手できます。              / 
 /     http://www.apache.org/licenses/LICENSE-2.0                             /
 /適用される法律または書面での同意によって命じられない限り、本ライセンスに    /
 /基づいて頒布されるソフトウェアは、明示黙示を問わず、いかなる保証も          /
 /条件もなしに「現状のまま」頒布されます。本ライセンスでの権利と制限を        /
 /規定した文言については、本ライセンスを参照してください。                    / 
 /----------------------------------------------------------------------------/

* 検証 [#jff39267]

** systemVerilog [#r29a71fb]
*** 簡単な説明 [#a8b53a32]
*** 技術メモ [#tf957229]
- [[randomize()の威力をグラフにしてみる]] 
主にVMMとsystemVerilogを中心に検証の技術メモを公開します。


&size(20){''目次''};
#contents

* systemVerilog [#w7e28c48]
** randomize()の威力をグラフにしてみる [#n3ce2598]
  randomaize()てそんなに便利??と思ったので数値化しグラフにしてみた。
回路はお手軽にcase文で作成、順番による調停回路20bit(ラウンドロビン)ただしクロック毎に調停する RTLは下記参照

カバレッジ値の変化を見たいだけなのでアサーションはovlのassert_zero_one_hotのみ付けといた。

 結果は冒頭のグラフにあるとおりrandomパターンを80個生成でカバレッジ100%達成。結構収束が速い。。回路の性格で??
 randomize()を使用した回路検証の雰囲気が何となくつかめた。

#ref(arbitr_cov.jpg)

- [[InterWikiSandBox]] -- [[InterWiki]]を試してみてください
* VMM [#qb647616]
** VMMとは [#q21c0f58]
米Synopsys(シノプシス)社提唱する機能検証手法「Verification Methodology Manual(VMM) for SystemVerilog」です。

** vmm [#qb647616]
- [[動作サンプル-cvc_counter]]
2008 5/末頃 apache2ライセンスの元、ソースコード&説明書が公開された。

> /// unixの世界でVMM(仮想マシンマネージャ)が有りますが関連は有りません。 ///
-VMM Centralと言う公式HPが立ち上がっている。
http://www.vmmcentral.org/home.html

デジタルシステムを開発する時の機能検証の手法と、その時に使用するライブラリをまとめた物。
- 近年、システムの開発過程において検証の比重が高くなっている。大規模システムでは50%超と
なっていると言われている。
- VMMは検証と検証を行うプログラムの開発期間短縮を目的としている。
- VMMとsystemVerilogを使用することを前提としており、ライブラリはclassライブラリとして作られている。
- 検証プログラム&手法の標準を目指している。
** 動作サンプルcvc_counter&VMMをmodelsim PEで動かしてみる。 [#l0828d4c]

cvc_counter&VMMがmodelsimPEで動作しない要因は、
- program文をmodelsimPEがサポートしていない。
- randomize()機能をmodelsimPEがサポートしていない。
- そもそのVMMを使用できるのはQuestaのみとメンターグラフィックスは言っている。

** PukiWikiについて [#j2ac6ac7]
の3点だ。

- [[PukiWiki]] -- PukiWikiのご紹介
上記のどの項目も致命的であるが、動作サンプルを動かしてみる→不完全でもVMMとは何かが分かる或いは、実務で使用してみようかなと思える動作状態を目指す。

*** ドキュメント [#d1a1117a]
- [[ヘルプ>Help]] -- PukiWikiで編集するには?
- [[テキスト整形のルール(詳細版)>FormattingRules]]
- [[プラグインマニュアル>PukiWiki/1.4/Manual/Plugin]]
方針は、
-program文をmodule文に置き換える。
-randomize()の紛い物を作成する。
-とりあえずmodelsimPEを使用してみる。

とする。

*** cvc_counterとは [#tdf9f5ce]
cvc info TechのBagath氏がQuestaに対応するVMMコードと例題(cvc_counter)をフォーラムされました。この中の例題がcvc_counterでchannelを使用した本格的な例題となっている。
- cvc info Tech

http://www.noveldv.com/

- cvc_counter sorce

http://www.vmmcentral.org/forums/viewtopic.php?f=2&t=28

- Verification Engineerの戯言氏のブログを参考にした。

http://blogs.yahoo.co.jp/verification_engineer/41968097.html

*** program文をmodule文に置き換える。 [#h6bf3772]

機能的には、

>   program文 |=> module文

つまりprogram文で記述できることはmodule文でも記述できる。
program文で不都合な点はスケジューリングにありmodule文より必ず
後ろに来るようスケジューリングされる(同時刻の場合だよ!!)。

と言うことで、module文に置き換えは、気をつけていれば問題なく動作する。

- 変更場所は

>  counter_pgm.sv

 program counter....
 ....
 endprogram 



 module counter...
 ....
 endmodule


*** randomize()の紛い物randomize_ptm()を作成する。 [#pbc176cf]


- randomize() をvmm & cvc のソースより検索する。数カ所出てくる。

- rand型の設定をcvcソースより検索する。counter_atomic_gen.sv, counter_xactn.sv の2ファイルにある。

- ソースファイルのrandomize()をrandomize_ptm()に書き換える。

      注)randomize_ptm()→名前は任意だ。_ptmは”ぱっちもん”を縮めた。

- counter_atomic_gen.sv, counter_xactn.sv内にあるrand型設定の入っているclassへfunctionを追加

 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を使用してみる。 [#a407af7d]

実はQuestaでもverで動作するしないがあり、6.3xでOK、 6.4だめとの事。
modelsimPEはQuestaから機能をかなり削除した物なので基本的な所は同じ。

> modelSimPE 6.3gを使用する。

これでコンパイル(vlog)は通る。

  
 以上で波形が出るようになる。


CENTER:[[FrontPage]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS