uvm_reg_adapterの「provides_responses」

UVMのRegister Layter Classを使用した際にハマったこと。
UVMを書いてみた(uvm_driver)」での記述は、seq_itemに対して、request, responseの2つを使っていました。
  seq_item_port.get_next_item(req);
$cast(rsp, req.clone());
:
seq_item_port.item_done(rsp);
このdriverに対して、Register Layter Classを使用した場合に"rsp"の値は返ってきません。それはなぜかというと、uvm_reg_adapterのモードが異なるからです。

uvm_reg_map.svh( uvm_reg_map::do_bus_write/read)内の記述にて
 if (adapter.provides_responses) begin
uvm_sequence_item bus_rsp;
uvm_access_e op;
// TODO: need to test for right trans type, if not put back in q
rw.parent.get_base_response(bus_rsp);
adapter.bus2reg(bus_rsp,rw_access);
end
else begin
adapter.bus2reg(bus_req,rw_access);
end
となっており、「provides_responses」により動作が異なります。
「provides_responses」の値はdefault = 0です。

○ uvm_driverを変更しない場合
class regif_adapter extends uvm_reg_adapter;

`uvm_object_utils(regif_adapter)

// new - constructor
function new(string name = "regif_adapter");
super.new(name);
provides_responses = 1;
endfunction
:
○ uvm_driver変更する場合
  seq_item_port.get_next_item(req);
//$cast(rsp, req.clone());
$cast(rsp, req); // or req に値を更新する
:
//seq_item_port.item_done(rsp);
seq_item_port.item_done();
となります。

provides_responses = 1の場合は、uvm_reg_map.svhの通り「write/read」両方でresponseを取得しているので必ず driver から値を返す必要があります。
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

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

カレンダー
10 | 2017/11 | 12
- - - 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
アクセス人数