スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Virtual Interfaceとは

SystemVerilog記述のVirtualで考えさせられたので書いときます。
きっかけは、UVMを書いていたときに信号(Interface)部分の接続でハマりました。RTLのようになんとなく書いていた記述ではダメなので、注意が必要ではないかと。

UVM Phaseでは
build⇒connet⇒end_of_elaboration⇒...
とあります。
その際に、build or connet phaseにてdutとテストベンチの接続を直接的に記述するような関数を設けるとします。
○connet phaseで接続
function void connect();
// Assign interface for env_tb
env_tb.func_assign(tb_top.dutif);
endfunction : connect
○下位クラスでの接続関数とrun phase
function void func_assign(virtual interface dut_if vif);
this.vif = vif;
endfunction : func_assign

// run phase
virtual task run();
@(posedge vif.xrst);
forever begin
@(posedge vif.clk);
: // 処理
end
endtask
これで、virtualがない場合どうなるかというとrun() phaseにて、vif.xrstのposedgeを待っている無限状態になります。
なぜかというと、virtualが無い場合
"connet()がコールされた際の「tb_top.dutif」の値をthis.vifに保持するからです。"
では、virtualがある場合というのは何を渡しているか?なんですが
私は勝手にポインタ(tb_top.dutifの先頭アドレス)を渡していると理解しました。ということで、まとめると以下のような勝手な認識。
○virtualがある場合
 run phase()時に見ている vif = tb_top.dutif

○virtualがない場合
 run phase()時に見ている vif = connect時の tb_top.dutif の値

P.S.
 こんな接続関数はいらない記述が「UVM1.0p1に書き直したよ(その5)」で記述しているやり方になります。UVM(SystemVerilog)を理解するには、色々と覚える必要がありそうです!
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。