スポンサーサイト

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

UVMを書いてみた(uvm_sequence)

続いて、umv_sequenceについてです。

uvm_sequenceにて、前に定義したuvm_sequence_itemを利用します。
※ここではUVM1.0EAの記述を記載しています。

○Write側のSequnce(一例)
class wr_seq extends uvm_sequence #(wr_transfer);

function new(string name="wr_seq");
super.new(name);
endfunction

`uvm_sequence_utils(wr_seq, wr_sequencer) //--- Sequencerに関連付け

wr_transfer wr;

//--- bodyへの登録
virtual task body();

wr = wr_transfer::type_id::create("wr"); //--- New

repeat(20) begin
assert(wr.randomize()); //--- ランダム生成

`uvm_do_with(
req,
{ req.address == wr.address;
req.data == wr.data;
req.data_enable == wr.data_enable;
req.enable == wr.enable;
})
end

`uvm_do_with(
req,
{ req.address == 0;
req.data == 0;
req.data_enable == 0;
req.enable == 1; // 0:Active
})

endtask

endclass : wr_seq


○Read側のSequnce(一例)
class rd_seq extends uvm_sequence #(rd_transfer);

function new(string name="rd_seq");
super.new(name);
endfunction

`uvm_sequence_utils(rd_seq, rd_sequencer)

rd_transfer rd;

virtual task body();

rd = rd_transfer::type_id::create("rd");

repeat(20) begin
assert(rd.randomize());
`uvm_do_with(
req,
{ req.address == rd.address;
req.enable == rd.enable;
})
if(rd.enable == 0) begin
get_response(rsp); //--- rsp取得
p_sequencer.uvm_report_info(get_type_name(),
$psprintf("%s read : addrress = `x%0h, data = `x%0h",
get_sequence_path(), rsp.address, rsp.data),
UVM_HIGH);
end
end

`uvm_do_with(
req,
{ req.address == 0;
req.enable == 1; // 0:Active
})

endtask

endclass : rd_seq


rd_seqに使われてる「rsp」、「p_sequencer」は予約語的に記述してますが
ルールがあります。特に「p_sequencer」使う際には正式UVM1.0では
あるマクロを使用する必要があります。これは、おいおいということで。
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

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

カレンダー
09 | 2017/10 | 11
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 31 - - - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。