UVM Component之Subscriber

class uvm_ip_subscriber extends uvm_subscriber;
//這裡使用FIFO通信而不是IMP,大大降低了工作量
uvm_tlm_analysis_fifo#(dma_trans) dma_monitor_to_sub_fifo[1];

extern function new(string name, uvm_component parent);
extern virtual function write(T t);
extern virtual task get_dma_trans();

extern virtual task run_phase(uvm_phase phase);

//coverage group
covergroup ostd_cfg_group;
option.per_instance = 1;
ostd: coverpoint(reg_cfg_trans.reg_wr_ostd[7:0]){
bins udb_0 = {0};
bins udb_1 = {[1:8]};
bins udb_2 = {[9:16]};
bins udb_3 = {[17:254]};
bins udb_4 = {255};
}
endgroup

endclass: uvm_ip_subscriber

function uvm_ip_subscriber::new(string name, uvm_component parent);
super.new();
dma_monitor_to_sub_fifo[0] = new("dma_monitor_to_sub_fifo_0", this);
//創建covergroup
ostd_cfg_group = new();
endfunction: new

//必須得重寫write這個純虛函數
function uvm_ip_subscriber::write(T t);
endfunction: write

task uvm_ip_subscriber::get_dma_trans();
dma_monitor_to_sub_fifo[0].get(tr);
$cast(tr_clone, tr);
reg_cfg_tr_q[0].push_back(tr_clone);

if(reg_cfg_tr_q[0].size() > 0) begin
reg_cfg_trans = reg_cfg_tr_q[0].pop_front();
//採樣
ostd_cfg_group.sample();
end

endtask: get_dma_trans

猜你喜欢

转载自www.cnblogs.com/camellia3371----/p/11389014.html