スポンサーサイト

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

UVMを書いてみた(uvm_driver)

今日はuvm_driverです。

uvm_driverはトランザクションを信号(ポート)レベルにする役割を持っています。
また、信号からのフィードバックをsequncenceに返します。

○Write側
class wr_driver extends uvm_driver #(wr_transfer);

// The virtual interface used to drive and view HDL signals.
protected virtual wr_if vif;

`uvm_component_utils(wr_driver)

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

wr_transfer wrtr;

// run_phase
virtual task run();
fork
get_and_drive();
reset_signals();
join
endtask

// get_and_drive
virtual protected task get_and_drive();
@(posedge vif.reset);
forever begin
@(posedge vif.clock);
//seq_item_port.get(wrtr);
seq_item_port.get_next_item(req);
$cast(rsp, req.clone());
rsp.set_id_info(req);

vif.address <= req.address;
vif.data <= req.data;
vif.data_enable <= req.data_enable;
vif.enable <= req.enable;

seq_item_port.item_done();

end
endtask : get_and_drive

// reset_signals
virtual protected task reset_signals();
forever begin
@(negedge vif.sig_reset);
vif.address <= 0;
vif.data <= 0;
vif.data_enable <= 0;
vif.enable <= 0;
end
endtask : reset_signals

// assign interface
function void assign_if(virtual interface wr_if vif);
this.vif = vif;
endfunction : assign_if

endclass : wr_driver


○Read側
class rd_driver extends uvm_driver #(rd_transfer);

// The virtual interface used to drive and view HDL signals.
protected virtual rd_if vif;

`uvm_component_utils(rd_driver)

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

// run_phase
virtual task run();
fork
get_and_drive();
reset_signals();
join
endtask

// get_and_drive
virtual protected task get_and_drive();
@(posedge vif.reset);
forever begin
@(posedge vif.clock);

seq_item_port.get_next_item(req);
$cast(rsp, req.clone());
rsp.set_id_info(req);

vif.address <= req.address;
vif.enable <= req.enable;
rsp.data = vif.data; // Read Data Get

if(req.enable == 1) seq_item_port.item_done(rsp);
else seq_item_port.item_done();

end
endtask : get_and_drive

// reset_signals
virtual protected task reset_signals();
forever begin
@(negedge vif.reset);
vif.address <= 0;
vif.enable <= 1;
end
endtask : reset_signals

// assign interface
function void assign_if(virtual interface rd_if vif);
this.vif = vif;
endfunction : assign_if

endclass : rd_driver

関連記事

コメントの投稿

非公開コメント

プロフィール

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