uvm白皮书练习_ch2_ch223_加入objection机制
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) beginif(!rst_n)begintxd <= 8'h00;tx_en <= 1'b0;endelse begintxd <= rxd;tx_en <= rx_dv;end
end
endmodule
TB
my_driver.sv
`ifndef MY_DRIVER_SV
`define MY_DRIVER_SVclass 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_drivertask 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 beginrun_test("my_driver");
end
/*时钟模块*/
initial beginclk = 0;forever begin#100ns clk = ~clk;end
end
/*复位模块*/
initial beginrst_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
相关文章:
uvm白皮书练习_ch2_ch223_加入objection机制
UVM中通过objection机制来控制验证平台的关闭。 在每个phase中,UVM会检查是否有objection被提起(raise_ objection),如果有,那么等待这个objection被撤销(drop_objection)后停止仿真;…...
利用C++开发一个迷你的英文单词录入和测试小程序-增强功能
小玩具基本完成之后,在日常工作中,记录一些单词,然后定时再复习下,还真的有那么一点点用(毕竟自己做的小玩具)。 在使用过程中,遇到不认识的单词,总去翻译软件翻译,然后…...
kibana启动报错
1.响应 超过时间30000ms (1) docker rm elasticsearch #从docker中删除es docker rm kibana #从docker中删除kibana (2)重新安装启动es加大最大运行内存 :1024M docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \ -e "discovery.typesingle-node" \ -…...
排查内存泄露
1 通过Performance确认是否存在内存泄露 一个存在内存泄露的 DEMO 代码: App.vue <template><div><button click"myFn" style"width: 200px; height: 200px;"></button><home v-if"ishow"></hom…...
【LeetCode-简单题】501. 二叉搜索树中的众数
文章目录 题目方法一:暴力哈希方法二:利用二叉搜索树的特性(递归双指针) 题目 方法一:暴力哈希 这是针对于普通二叉树的解法 统计number出现次数 然后将次数最大的众数集 取出来 Map<Integer , Integer > map …...
MAC word 如何并列排列两张图片
系统:MAC os 参考博客 https://baijiahao.baidu.com/s?id1700824516945958911&wfrspider&forpc 步骤1 新建一个word文档和表格 修改表格属性 去掉自动重调尺寸以适应内容 插入图片 在表格的位置插入对应的图片如下 去除边框 最终结果如下...
PTA第三章作业题
文章目录 前言7-1 比较大小Ⅰ. 方法一 :直接判断法Ⅱ. 方法二:交换法 7-2 比较两个数的大小Ⅰ. 方法 :直接判断法 7-3 成绩等级Ⅰ. 方法 :直接判断法 7-4 打鱼晒网Ⅰ. 方法 :直接判断法 7-5 计算奖金Ⅰ. 方法 …...
vscode vue html 快捷键
css文件 选择多行 按下ctrl不放 按下鼠标滚轮不放(鼠标中键) 鼠标向下移动 同时修改多个相同的字符串 <style> .base-goods-item li {width: 304px;height: 404px;background-color: #eef9f4; } .base-goods-item li {display: block; } .base-…...
mysql锁相关的总结
1、参考文章 MySQL 主键索引在 RR 和 RC 隔离级别下的加锁情况总结_51CTO博客_mysql二级索引加锁 2、 show OPEN TABLES where In_use > 0; -- 类似rc的需求 show variables like innodb_locks_unsafe_for_binlog; SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; -- …...
计算机竞赛 深度学习乳腺癌分类
文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…...
docker-compose搭建的mysql,如何定时备份数据
一、前言 使用docker-compose搭建的mysql中自带了mysqldump,所以在服务器上如何使用容器中的mysqldump命令是实现备份的原理,下面是主要实现的命令 docker exec -it mysql mysqldump -u root -p$mysql_password $database_name > $backup_file二、备…...
webpack:关于处理html文件的插件html-webpack-plugin、add-asset-html-webpack-plugin
简介 add-asset-html-webpack-plugin 将 JavaScript或CSS文件添加到由html-webpack-plugin插件生成的HTML中去。 html-webpack-plugin 默认配置会在出口目录中(通过output.path选项配置)生成一个index.html文件; 生成的index.html文件将会…...
如何两个不同的脚本文件之间传递参数
两个不同的Shell脚本之间如何访问传递的参数取决于它们是如何调用的。如果一个Shell脚本1调用另一个Shell脚本2并且想要将参数传递给被调用的脚本2,可以使用以下方法: 方法1:通过位置参数传递参数 这是一种常见的方法,其中一个脚…...
一篇文章彻底搞懂熵、信息熵、KL散度、交叉熵、Softmax和交叉熵损失函数
文章目录 一、熵和信息熵1.1 概念1.2 信息熵公式 二、KL散度和交叉熵2.1 KL散度(相对熵)2.2 交叉熵 三、Softmax和交叉熵损失函数3.1 Softmax3.2 交叉熵损失函数 一、熵和信息熵 1.1 概念 1. 熵是一个物理学概念,它表示一个系统的不确定性程度,或者说是…...
[架构之路-223]:数据管理能力成熟度评估模型DCMM简介
目录 一、背景 二、评估依据 三、评估内容 四、主要适用对象 五、能力等级 六、不同层次的文件: 一、背景 信息技术与经济社会的交汇融合引发了数据爆发式增长。数据蕴含着重要的价值,已成为国家基础性战略资源,正日益对全球生产、流通…...
十大排序算法的实现(C/C++)
以下是十大经典排序算法的简单 C 实现: 冒泡排序(Bubble Sort): 思想:重复地遍历要排序的列表,比较相邻的两个元素,如果它们的顺序错误就交换它们。时间复杂度:最坏情况和平均情况…...
HTML+CSS综合案例一新闻详情
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>新闻详情</title><style>h1{text-align…...
【Spring Boot】实战:实现Session共享
🌿欢迎来到@衍生星球的CSDN博文🌿 🍁本文主要学习实现Session共享 🍁 🌱我是衍生星球,一个从事集成开发的打工人🌱 ⭐️喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路⭐️💠作为一名热衷于分享知识的程序员,我乐于在CSDN上与广大开发者交流学习。 💠我…...
3、Elasticsearch功能使用
第4章 功能使用 4.1 Java API 操作 随着 Elasticsearch 8.x 新版本的到来,Type 的概念被废除,为了适应这种数据结构的改 变,Elasticsearch 官方从 7.15 版本开始建议使用新的 Elasticsearch Java Client。 4.1.1 增加依赖关系 <propertie…...
数据链路层协议
文章目录 数据链路层协议0. 数据链路层解决的问题1. 以太网协议(1) 认识以太网(2) 以太网帧格式<1> 两个核心问题 (3) 认识MAC地址(4) 局域网通信原理(5) MTU<1> 认识MTU<2> MTU对IP协议的影响<3> MTU对UDP协议的影响<4> MTU对TCP协议的影响<…...
千问3.5-9B模型切换指南:OpenClaw多模型动态调用
千问3.5-9B模型切换指南:OpenClaw多模型动态调用 1. 为什么需要多模型动态调用 上周我尝试用OpenClaw自动整理电脑里积压的300多份PDF文档时,遇到了一个有趣的现象:处理简单文件重命名任务时,轻量级模型响应飞快;但遇…...
从K8S配置到前端实现:用Vue3+Codemirror打造专业级YAML编辑器全流程
从K8S配置到前端实现:用Vue3Codemirror打造专业级YAML编辑器全流程 在云原生技术栈中,YAML文件如同空气般无处不在——从Kubernetes集群部署到CI/CD流水线配置,这种人类可读的数据序列化格式已成为基础设施即代码的核心载体。但当我们面对动辄…...
MIT-BEVFusion LiDAR Encoder 保姆级拆解:从点云到BEV特征图,手把手带你过一遍代码
MIT-BEVFusion LiDAR Encoder 深度解析:从点云到BEV特征图的完整实现路径 当自动驾驶系统需要理解周围环境时,LiDAR点云数据的高效处理成为关键挑战。MIT-BEVFusion框架中的LiDAR编码器模块,通过创新的稀疏卷积架构,将无序的三维点…...
别再死记硬背了!用C++手把手带你图解哈夫曼树构建全过程(附完整可运行代码)
从零开始:用C动态图解哈夫曼树构建与编码实现 哈夫曼树(Huffman Tree)是数据结构中一种经典的贪心算法应用,广泛用于数据压缩领域。对于初学者来说,理解其构建过程往往比单纯记忆代码更有价值。本文将用C结合动态图示的…...
告别GitHub下载卡顿:手把手教你配置Electron国内镜像(npmrc文件详解)
告别Electron下载困境:深度解析.npmrc配置与国内镜像实战指南 每次执行npm install electron时,看着进度条卡在node install.js阶段一动不动,或是突然蹦出RequestError: connect ETIMEDOUT的红色报错——这种体验对于国内开发者来说再熟悉不过…...
WPF项目实战视频《四》(主要为项目实战API设计)
30.WPF项目实战(创建数据库)31.WPF项目实战(工作单元)32.WPF项目实战(待办事项接口)33.WPF项目实战(配置)34.WPF项目实战(备忘录接口)35.WPF项目实战…...
esp-nimble-cpp:ESP32上轻量级BLE C++开发指南
1. 项目概述esp-nimble-cpp是专为 ESP32 平台设计的 C 封装库,其核心目标是为 Apache NimBLE BLE 协议栈提供面向对象、线程安全且资源高效的抽象层。该库并非简单封装,而是以工程实践为导向的深度重构:它在保持与 nkolban 经典cpp_utilsBLE …...
MusePublic助力Java开发者:SpringBoot集成指南
MusePublic助力Java开发者:SpringBoot集成指南 1. 为什么Java团队需要MusePublic能力 最近帮一家电商公司做推荐系统升级时,技术负责人跟我聊起一个现实问题:他们用传统协同过滤算法生成的商品推荐列表,点击率已经连续三个季度停…...
OpCore-Simplify:一键自动化黑苹果配置,让复杂技术变得简单
OpCore-Simplify:一键自动化黑苹果配置,让复杂技术变得简单 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是…...
向量化计算落地难?揭秘阿里/腾讯内部正在用的7个Java Vector API高危避坑场景
第一章:Java Vector API向量化计算落地的现实困境Java Vector API(JEP 338、414、426、448)虽在JDK 16起逐步成熟,但实际工程化部署仍面临多重结构性约束。其核心矛盾在于:API设计高度抽象,而底层硬件适配、…...
