スポンサーサイト

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

UVMを書いてみた(uvm_agent)

本日は、今まで書いて記述してきたuvm_sequencer,uvm_driver,uvm_monitorを
まとめるuvm_agentです。

ここでのポイントは、is_activeというローカル変数かと思います。
本信号により、uvm_monitorだけを実装することにより、
別のagentに制御を切り替えるような仕組みを作ることができます。

○Write側
class wr_agent extends uvm_agent;

protected uvm_active_passive_enum is_active = UVM_ACTIVE;

wr_driver driver;
wr_sequencer sequencer;
wr_monitor monitor;

// Provide implementations of virtual methods such as get_type_name and create
`uvm_component_utils_begin(wr_agent)
`uvm_field_enum(uvm_active_passive_enum, is_active, UVM_ALL_ON)
`uvm_component_utils_end

// new - constructor
function new (string name, uvm_component parent);
super.new(name, parent);
endfunction : new

// build
function void build();
super.build();
monitor = wr_monitor::type_id::create("monitor", this);
if(is_active == UVM_ACTIVE) begin
driver = wr_driver::type_id::create("driver", this);
sequencer = wr_sequencer::type_id::create("sequencer", this);
end
endfunction : build

// connect
function void connect();
if(is_active == UVM_ACTIVE) begin
driver.seq_item_port.connect(sequencer.seq_item_export);
end
endfunction : connect

// assign the virtual interfaces of the agent's children
function void assign_vi(virtual interface wr_if vif);
monitor.assign_vi(vif);
if (is_active == UVM_ACTIVE) begin
driver.assign_vi(vif);
end
endfunction : assign_vi

endclass : wr_agent


○Read側
Read側はuvm_monitorを個人的都合により実装していません。
ただ単に面倒くさかったからです。
class rd_agent extends uvm_agent;

protected uvm_active_passive_enum is_active = UVM_ACTIVE;

rd_driver driver;
rd_sequencer sequencer;

// Provide implementations of virtual methods such as get_type_name and create
`uvm_component_utils_begin(rd_agent)
`uvm_field_enum(uvm_active_passive_enum, is_active, UVM_ALL_ON)
`uvm_component_utils_end

// new - constructor
function new (string name, uvm_component parent);
super.new(name, parent);
endfunction : new

// build
function void build();
super.build();
if(is_active == UVM_ACTIVE) begin
driver = rd_driver::type_id::create("driver", this);
sequencer = rd_sequencer::type_id::create("sequencer", this);
end
endfunction : build

// connect
function void connect();
if(is_active == UVM_ACTIVE) begin
driver.seq_item_port.connect(sequencer.seq_item_export);
end
endfunction : connect

// assign the virtual interfaces of the agent's children
function void assign_vi(virtual interface rd_if vif);
if (is_active == UVM_ACTIVE) begin
driver.assign_vi(vif);
end
endfunction : assign_vi

endclass : rd_agent
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

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

カレンダー
07 | 2017/08 | 09
- - 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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。