UVM入门系列(四)----通过uvm_gen脚本快速搭建一般验证平台(下)
目录
前言
本篇博文继续之前博文的内容对验证平台进行补全,之前博文内容链接:
UVM入门系列(一)----通过uvm_gen脚本快速搭建一般验证平台(上)
UVM入门系列(三)----通过uvm_gen脚本快速搭建一般验证平台(中)
1、reference model
声明transaction,i_seq_item接受自i_monitor,o_seq_item发送至scoreboard进行比较。
i_seq_item req;
o_seq_item m_trans;
声明port,analysis_port用于向scoreboard发送o_seq_item,blocking_get_port用于从i_monitor接受i_seq_item。
uvm_blocking_get_port#(i_seq_item) get_port;
uvm_analysis_port#(o_seq_item) analysis_port;
function add_refm::new(string name, uvm_component parent);
super.new(name, parent);
get_port=new("get_port",this);
analysis_port=new("analysis_port",this);
req=i_seq_item::type_id::create("req",this);
endfunction : new
main_phase:reference model从fifo中取出数据,进行计算处理后,通过analysis_port的write函数发送给scoreboard。
fork
forever begin
m_trans=o_seq_item::type_id::create("m_trans",this);
get_port.get(req);
do_ref(req);
analysis_port.write(m_trans);
`uvm_info("REFM",m_trans.sprint,UVM_MEDIUM)
end
join_none
task add_refm::do_ref(i_seq_item req);
bit [8:0] tmp;
tmp=req.a+req.b+req.cin;
m_trans.sum=tmp[7:0];
m_trans.cout=tmp[8];
endtask
2、scoreboard
声明transaction,req是来自o_monitor监测的DUT的输出,ref_req是来自reference model的标准输出;
o_seq_item req;
o_seq_item ref_req;
声明port
uvm_blocking_get_port#(o_seq_item) get_o_port;
uvm_blocking_get_port#(o_seq_item) get_ref_port;
function add_scb::new(string name, uvm_component parent);
super.new(name, parent);
get_o_port=new("get_o_port",this);
get_ref_port=new("get_ref_port",this);
req=o_seq_item::type_id::create("req",this);
ref_req=o_seq_item::type_id::create("ref_req",this);
endfunction : new
main_phase:分别接收从来自i_monitor的DUT输出和来自reference model的标准输出,进行对比,对比失败则产生uvm_error
fork
forever begin
get_o_port.get(req);
get_ref_port.get(ref_req);
do_scb(req,ref_req);
end
join_none
task add_scb::do_scb(o_seq_item req0,o_seq_item req1);
bit right;
right=req0.compare(req1);
if(!right)
`uvm_error("FAILED","COMPARED FAILED")
else
`uvm_info("SUCCESS","COMPARED SUCCESS",UVM_LOW)
endtask
3、function coverage
由于DUT功能很简单,功能覆盖率只进行输入接口的采样。
声明接口
virtual interface i_agent_if vif;
virtual interface cr_if cvif;
定义覆盖组
covergroup input_cov;
coverpoint vif.cin;
coverpoint vif.a;
coverpoint vif.b;
endgroup
run_phase:进行信号采样
task add_coverage::run_phase(uvm_phase phase);
do_sample();
endtask
task add_coverage::do_sample();
forever begin
@(posedge cvif.sysclock);
input_cov.sample();
end
endtask
report_phase:打印覆盖率信息。
function void add_coverage::report_phase(uvm_phase phase);
string s;
super.report_phase(phase);
s="\n--------------------------------------------------\n";
s={s,"COVERAGE SUMMARY \n"};
s={s,$sformatf("total coverage:%1.f \n",$get_coverage())};
s={s,$sformatf("input coverage:%1.f \n",this.input_cov.get_coverage())};
s={s,"\n-------------------------------------------------\n"};
`uvm_info(get_type_name(),s,UVM_LOW)
endfunction
4、 env
连接reference和scoreboard之间的数据通道:
uvm_tlm_analysis_fifo#(o_seq_item) ref_scb_fifo;
m_refm.analysis_port.connect(ref_scb_fifo.analysis_export);
m_scb.get_ref_port.connect(ref_scb_fifo.blocking_get_export);
例化coverage:
add_coverage m_cov;
m_cov = add_coverage::type_id::create("m_cov",this);
5、仿真结果:
总结
至此,本次验证平台的搭建已经基本结束,新手入门,欢迎大佬指正。