UVM入门系列(四)----通过uvm_gen脚本快速搭建一般验证平台(下)

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、仿真结果:

总结

至此,本次验证平台的搭建已经基本结束,新手入门,欢迎大佬指正。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值