uvm白皮书练习_ch2_ch223_加入objection机制

news/2024/5/19 19:13:51 标签: UVM, systemverilog

UVM中通过objection机制来控制验证平台的关闭。
在每个phase中,UVM会检查是否有objection被提起(raise_ objection),如果有,那么等待这个objection被撤销(drop_objection)后停止仿真;如果没有,则马上结束当前phase。

目前将drop_objection语句当成是finish函数的替代者,只是在drop_objection语句之前必须先调用raise_objection语句,raise_objection和drop_ objection总是成对出现。

raise_objection语句必须在main_phase中第一个消耗仿真时间(所谓仿真时间,是指$time函数打印出的时间。与之相对的还有实际仿真中所消耗的CPU时间,通常说一个测试用例的运行时间即指CPU时间

如$display语句是不消耗仿真时间的,这些语句可以放在raise_objection之前,但是类似@(posedge top.clk)等语句是要消耗仿真时间的。

dut.sv

module dut (
    clk,
    rst_n,
    rxd,
    rx_dv,
    txd,
    tx_en
);
    input clk    ;   
    input rst_n  ;   
    input [7:0]rxd    ; 
    input rx_dv  ;   
    output txd   ;  
    output tx_en ; 

reg [7:0]   txd;
reg         tx_en;  

always @(posedge clk) begin
    if(!rst_n)begin
        txd     <=  8'h00;
        tx_en   <=  1'b0;
    end
    else begin
        txd     <=  rxd;
        tx_en   <=  rx_dv;
    end
end
endmodule

TB

my_driver.sv

`ifndef MY_DRIVER_SV
`define MY_DRIVER_SV

class my_driver  extends uvm_driver;
    `uvm_component_utils(my_driver)  //加入factory机制
    function new(string name="my_driver",uvm_component parent =null);
        super.new(name,parent);
    endfunction //new()
    extern  virtual task main_phase(uvm_phase phase);//调用附近的代码
endclass //my_driver  extends uvm_driver

task my_driver::main_phase(uvm_phase phase);
    phase.raise_objection(this);//ch223加入objection机制
    top_tb.rxd      <= 8'b0;//初始值复位
    top_tb.rx_dv    <= 1'b0;
    while (!top_tb.rst_n) 
        @(posedge top_tb.clk);//等个时钟
  
    for(int i =0;i<25;i++)begin
        @(posedge top_tb.clk);//等个时钟
        top_tb.rxd <= i[7:0];
        // top_tb.rxd <= $urand_range(0.255);
        top_tb.rx_dv    <= 1'b1;
        `uvm_info("my_driver","data is driver",UVM_LOW);
    end
    @(posedge top_tb.clk);
    top_tb.rx_dv    <=  1'b0;
    phase.drop_objection(this);//ch223加入objection机制

endtask //my_driver::main_phase
`endif

top_tb.sv

`timescale 1ns/1ns
`include "uvm_macros.svh"

import uvm_pkg::*;
`include "my_driver.sv"

module top_tb ;
reg         clk     ;    //时钟
reg         rst_n   ;   //复位
reg [7:0]   rxd     ;   //接受数据
reg         rx_dv   ;   //接受数据
reg [7:0]   txd     ;   //发送数据
reg         tx_en   ;   //发送数据

dut my_dut(
.clk   (clk  ),
.rst_n (rst_n),
.rxd   (rxd  ),
.rx_dv (rx_dv),
.txd   (txd  ),
.tx_en (tx_en)
);

// initial begin
//     my_driver drv;
//     drv = new("drv",null);//传入数据
//     drv.main_phase(null);
//     $finish;
// end
initial begin
    run_test("my_driver");
end
/*时钟模块*/
initial begin
    clk = 0;
    forever begin
        #100ns clk = ~clk;
    end
end
/*复位模块*/
initial begin
    rst_n = 1'b0;
    #1000;
    rst_n = 1'b1;
end

/*fsdb*/
//initial begin
//    $fsdbDumpfile("verilog.fsdb");
//    $fsdbDumpvars(0);
//    $display("fsdbDumpfilrs is start at %d",$time);
//    // #1e7;
//    // $finish;
//end
endmodule

仿真结果

将发送激励改成了25次

fsdbDumpfilrs is start at                    0
UVM_INFO my_driver.sv(24) @ 13000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 15000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 17000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 19000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 21000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 23000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 25000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 27000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 29000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 31000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 33000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 35000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 37000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 39000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 41000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 43000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 45000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 47000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 49000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 51000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 53000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 55000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 57000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 59000: uvm_test_top [my_driver] data is driver
UVM_INFO my_driver.sv(24) @ 61000: uvm_test_top [my_driver] data is driver

--- UVM Report Summary ---

** Report counts by severity
UVM_INFO :   26
UVM_WARNING :    0
UVM_ERROR :    0
UVM_FATAL :    0
** Report counts by id
[RNTST]     1
[my_driver]    25

http://www.niftyadmin.cn/n/5050777.html

相关文章

蓝桥等考Python组别一级002

第一部分:选择题 1、Python L1 (15分) Python程序文件的扩展名是( )。 txtpycppdoc正确答案:B 2、Python L1 (15分) 下面哪个不是计算机编程语言?( ) PythonPowerPointScratchC++正确答案:B 3、Python L1(20分)

【Spring MVC】Spring MVC如何处理跨域请求(CORS)

文章目录 1. Spring MVC如何处理跨域请求呢2. Spring MVC处理CORS的几个组件2.1. CorsFilter2.2. CrossOrigin 前言&#xff1a;请了解什么是CORS&#xff08;跨域&#xff09; 参考&#xff1a;https://gitee.com/firefish985/article-list/tree/master/Spring/Spring Web MVC…

WebGL绘制圆形的点

目录 前言 如何实现圆形的点&#xff1f; 片元着色器内置变量&#xff08;gl_FragCoord、gl_PointCoord&#xff09; gl_PointCoord的含义 示例程序&#xff08;RoundedPoint.js&#xff09; 代码详解 前言 本文将讨论示例程序RoundedPoint&#xff0c;该程序绘制了圆…

Nginx WEB访问与Linux授权约束

看到所有文件的权限都是没有的&#xff0c;即便所有的权限都没有即使nginx做了配置&#xff0c;这些都是正确的。那么在浏览器真正去访问的时候是不能访问的。 [rootjenkins html]# ls -l total 4 drwxr-xr-x 2 root root 23 Sep 16 17:43 dist ---------- 1 root root 33 Sep …

如何选择一款高性价比的便携式明渠流量计

如何选择一款精度高、测量准确、易操作的便携式明渠流量计 如何选择一款精度高、测量准确、易操作的便携式明渠流量计 便携式明渠流量计&#xff1a;是一款对现有在线水监测系统中流量监测的对比装置。该便携式明渠流量计实现了比对在线系统的液位误差及流量误差。引导式的操作…

AI智能文案写作工具,迅速生成高质量的文案

大家好&#xff0c;欢迎来到这篇文章。在信息时代&#xff0c;文字的力量愈发重要&#xff0c;无论是用于广告、文章还是社交媒体&#xff0c;优质的文案都能够吸引更多的注意力。但是&#xff0c;对于许多人来说&#xff0c;创作文案可能是一项繁琐且耗时的任务。 147GPT批量文…

Linux基本命令总结练习(过命令关)

1.新建网卡配置文件的软连接NIC1 [rootserver ~]# ln /etc/NetworkManager/system-connections/ens160.nmconnection NIC1 [rootserver ~]# stat /etc/NetworkManager/system-connections/ens160.nmconnection [rootserver ~]# stat NIC1 2.使用普通账户新建如下结构的2个目录&…

vue安装依赖报错install i 报错提示npm audit fix --force,or `npm audit` for details

vue项目执行npm install初始化后报错 run npm audit fix to fix them, or npm audit for details 出现这类提醒&#xff0c;按照如下操作进行 1、首先安装模块依赖&#xff1a; npm install &#xff08;npm audit fix 含义&#xff1a; 检测项目依赖中的漏洞并自动安装需要…