uvm白皮书练习_ch2_ch231_加入transaction

2.3 为验证平平台加入各种组件
uvm白皮书练习_ch2_ch231_加入transaction

代码部分

top_tb.sv

`timescale 1ns / 1ps
`include "uvm_macros.svh"import uvm_pkg::*;
/*只能现在*/`include "my_if.sv"
`include "my_transaction.sv"
`include "my_driver.sv"module top_tb();
/*time set*/
initial begin$display("start sim");#1.5ms;$finish;
end/*fsdb*/
initial begin$display("fsdbDumpfilrs is start at %d",$time);$fsdbDumpfile("verilog.fsdb");$fsdbDumpvars(0);
endreg             clk;
reg             rst_n;
reg     [7:0]   rxd;
reg             rx_dv;
wire    [7:0]   txd;
wire            tx_en;my_if input_if  (clk,rst_n);
my_if output_if (clk,rst_n);initial beginclk = 0;forever begin#100ns clk = ~ clk;end
endinitial beginrst_n =1'b0 ;#1us;rst_n =1'b1 ;
enddut my_dut(.clk   (clk      ),.rst_n (rst_n    ),.rxd   (input_if.data      ),.rx_dv (input_if.valid    ),.txd   (output_if.data      ),.tx_en (output_if.valid    ) );// initial begin
//     my_driver drv;
//     drv=new("drv",null);
//     drv.main_phase(null);
//     $finish;
// end
initial beginrun_test("my_driver");
endinitial beginuvm_config_db#(virtual my_if)::set(null, "uvm_test_top", "vif", input_if);    
endendmodule

my_if.sv

`ifndef MY_IF__SV
`define MY_IF__SV
interface my_if(input clk,input rst_n);logic [7:0] data;logic       valid;
endinterface //my_if`endif 

my_transaction.sv

`ifndef MY_TRANSACTION__SV
`define MY_TRANSACTION__SVclass my_transaction extends uvm_sequence_item;rand bit[47:0] dmac;rand bit[47:0] smac;rand bit[15:0] ether_type;rand byte      pload[];rand bit[31:0] crc;constraint pload_cons{pload.size >= 46;pload.size <= 1500;}function bit[31:0] calc_crc();return 32'h0;endfunctionfunction void post_randomize();crc = calc_crc;endfunction`uvm_object_utils(my_transaction)function new(string name = "my_transaction");super.new();endfunction
endclass
`endif

my_driver.sv

// `ifndef MY_DRIVER__SV
// `define MY_DRIVER__SV
// class my_driver extends uvm_driver;
//    virtual my_if vif;
//    `uvm_component_utils(my_driver)    //没有后缀//    function new(string name="my_driver",uvm_component parent = null);
//       super.new(name,parent);
//       `uvm_info("my_driver", "new is called", UVM_LOW)
//    endfunction //new()//    virtual function void build_phase(uvm_phase phase);
//       super.build_phase(phase);
//       `uvm_info("my_driver", "build phase is caslled", UVM_LOW)
//       if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))
//          `uvm_fatal("my_driver", "virtual interface must be set for vif!!!")  //没有后缀
//    endfunction//    extern  task main_phase(uvm_phase phase);
//    extern  task drive_one_pkt(my_transaction tr);// endclass //my_driver extends uvm_driver`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
class my_driver extends uvm_driver;virtual my_if vif;`uvm_component_utils(my_driver)function new(string name = "my_driver", uvm_component parent = null);super.new(name, parent);endfunctionvirtual function void build_phase(uvm_phase phase);super.build_phase(phase);if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))`uvm_fatal("my_driver", "virtual interface must be set for vif!!!")endfunctionextern task main_phase(uvm_phase phase);extern task drive_one_pkt(my_transaction tr);
endclasstask my_driver::main_phase (uvm_phase phase);my_transaction tr ; /*先声明数组*/phase.raise_objection(this);    //有后缀,项目真起始点vif.data    <= 8'b0; vif.valid   <= 1'b0;//先来一个初始化while(!vif.rst_n)@(posedge vif.clk);for(int i = 0; i < 2; i++)begin   //发两轮数据包tr = new("tr");// assert (tr.randomize() with {pload.size ==20;});//源码200,这里减到20,进行随机初始化assert (tr.randomize() with {pload.size ==50;});//源码200,这里减到20,进行随机初始化// else   error_process  //本来此处还有断言,源码处暂时没有drive_one_pkt(tr);endrepeat(5) @(posedge vif.clk);//等待5个时钟// vif.valid <= 1'b0;phase.drop_objection(this);//运行结束
endtask //my_driver::main_phasetask my_driver::drive_one_pkt(my_transaction tr);bit [47:0] tmp_data;bit [7:0] data_q[$]; //push dmac to data_qtmp_data = tr.dmac;for(int i = 0; i < 6; i++) begindata_q.push_back(tmp_data[7:0]);tmp_data = (tmp_data >> 8);end//push smac to data_qtmp_data = tr.smac;for(int i = 0; i < 6; i++) begindata_q.push_back(tmp_data[7:0]);tmp_data = (tmp_data >> 8);end//push ether_type to data_qtmp_data = tr.ether_type;for(int i = 0; i < 2; i++) begindata_q.push_back(tmp_data[7:0]);tmp_data = (tmp_data >> 8);end//push payload to data_qfor(int i = 0; i < tr.pload.size; i++) begindata_q.push_back(tr.pload[i]);end//push crc to data_qtmp_data = tr.crc;for(int i = 0; i < 4; i++) begindata_q.push_back(tmp_data[7:0]);tmp_data = (tmp_data >> 8);end`uvm_info("my_driver", "begin to drive one pkt", UVM_LOW);repeat(3) @(posedge vif.clk);while(data_q.size() > 0) begin@(posedge vif.clk);vif.valid <= 1'b1;vif.data <= data_q.pop_front(); end@(posedge vif.clk);vif.valid <= 1'b0;`uvm_info("my_driver", "end drive one pkt", UVM_LOW);
endtask`endif// /*
// 注册
// main phase// driver one pkt// */

仿真结果

UVM_INFO @ 0: reporter [RNTST] Running test my_driver...
UVM_INFO my_driver.sv(100) @ 1100000: uvm_test_top [my_driver] begin to drive one pkt
UVM_INFO my_driver.sv(111) @ 15500000: uvm_test_top [my_driver] end drive one pkt
UVM_INFO my_driver.sv(100) @ 15500000: uvm_test_top [my_driver] begin to drive one pkt
UVM_INFO my_driver.sv(111) @ 29900000: uvm_test_top [my_driver] end drive one pkt--- UVM Report Summary ---** Report counts by severity
UVM_INFO :    5
UVM_WARNING :    0
UVM_ERROR :    0
UVM_FATAL :    0
** Report counts by id
[RNTST]     1
[my_driver]     4

小结

Error-[CNST-CIF] Constraints inconsistency failure
my_driver.sv, 57Constraints are inconsistent and cannot be solved.Please check the inconsistent constraints being printed above and rewrite them.

约束超出预设范围,会导致失败
解决方法,使用范围内的数据值进行随机化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/155583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue Router的使用

Vue.js是一个流行的JavaScript框架&#xff0c;用于开发单页面应用程序。Vue提供了一个强大的路由系统&#xff0c;可以帮助我们管理应用程序中的不同页面。在本文中&#xff0c;我们将详细讲解Vue路由的使用方法。 目录 1. 安装Vue Router2. 创建路由实例3. 配置路由4. 在模板…

关闭bitlocker加密

windows11的笔记本电脑买回来发现分驱都处于bitlocker状态&#xff0c;上网上搜索都是说进入控制面板的安全项进行关闭&#xff0c;包括去搜索栏搜索“管理 BitLocker”&#xff0c;对搜索出来的项打开&#xff0c;经过试验&#xff0c;它们进入的是同一个位置&#xff0c;只有…

互动直播 之 视频帧原始数据管理

目录 一、视频帧管理 1、存储图片数据的数据结构 1.1)、图片数据首地址

【docker】虚拟化和docker容器概念

基础了解 IAAS&#xff1a; 基础设施服务&#xff0c;&#xff08;只提供基础设施&#xff0c;没有系统&#xff09; **SAAS&#xff1a; ** 软件即服务&#xff0c;&#xff08;提供基础设施和系统&#xff09; PAAS&#xff1a; 平台即服务&#xff0c;&#xff08;提供基…

SwiftUI 如何动态开始和停止播放永久重复(repeatForever)动画

0. 功能需求 在 SwiftUI 丰富多彩的动画世界中,我们有时希望可以随意开始和停止永久循环(repeatForever)的动画,不过这时往往会产生错误的动画“叠加”效果。 从上图可以看到:虽然我们希望密码输入框背景只在用户输入密码时才发生闪烁,但顶部的密码输入框随着不断输入其…

Yii2 ActiveRecord连接OpenGauss提示表不存在table not exist

1.修改数据库连接信息 文件位置 config/db.php 添加默认Schema return [class > yii\db\Connection,dsn > pgsql:host127.0.0.1;port5432;dbnamepostgres,username > postgres,password > Pass123,charset > utf8,//enableSchemaCache > true,//表结构是否…

Linux02 VIM编辑器

Linux02 VIM编辑器 基本上 vi/vim 共分为三种模式&#xff0c; 分别是命令模式&#xff08;Command mode&#xff09;&#xff0c;输入模式&#xff08;Insert mode&#xff09;和底线命令模式&#xff08;Last line mode&#xff09;。 三种状态进行切换 插入模式&#xff1a…

Java入门篇 之 内部类

本篇碎碎念&#xff1a;本篇没有碎碎念&#xff0c;想分享一段话&#xff1a; 你不笨&#xff0c;你只是需要时间&#xff0c;耐心就是智慧&#xff0c;不见得快就好&#xff0c;如果方向都不对&#xff0c;如果心术不正&#xff0c;如果德不配位&#xff0c;快就是对自己天分的…

【数值计算方法】矩阵特征值与特征向量的计算(一):Jacobi 旋转法及其Python实现

文章目录 一、Jacobi 旋转法1. 基本思想2. 计算过程演示3. 注意事项 二、Python实现迭代过程&#xff08;调试&#xff09; 矩阵的特征值&#xff08;eigenvalue&#xff09;和特征向量&#xff08;eigenvector&#xff09;在很多应用中都具有重要的数学和物理意义。Jacobi 旋转…

软件工程理论与实践 (吕云翔) 第十二章 软件测试概述课后习题及其答案解析

第十二章 软件测试概述 1.判断题 &#xff08;1&#xff09;软件测试是对软件规格说明、软件设计和编码的最全面也是最后的审查。&#xff08;) 解析&#xff1a;软件测试是一个独立的活动&#xff0c;旨在评估软件的质量和发现潜在的问题&#xff0c;而不仅仅是对规格说明、…

六、流量监管、流量整形

流量监管、流量整形 流量监管、流量整形1.1.定义1.2.简单流分类应用场景举例1.3.简单流分类的配置1.4.复杂流分类1.5.复杂流分类在产品中的实现 ————————————————— 流量监管、流量整形 当报文的发送速率大于接收速率&#xff0c;或者下游设备的接口速率小于…

使用Python合并pdf文件

import PyPDF2 # 创建一个空的 PDF 文档对象 def pdf_merge(path_a,path_b,path_save):merged_pdf PyPDF2.PdfMerger()# 打开第一个 PDF 文件&#xff0c;读取其内容并追加到新创建的 PDF 文档对象中with open(path_a, rb) as file1:merged_pdf.append(file1)# 打开第二个 PDF…

GitHub 2023报告-开源和AI的现状

GitHub 2023报告-开源和AI的现状 深入探讨人工智能如何与开源互动&#xff0c;以及未来几年可能出现的趋势。 背景介绍 2023年&#xff0c;开源已成为全球软件开发的标准。无论是大公司还是小团队&#xff0c;都广泛使用开源技术进行项目开发。此外&#xff0c;随着机器学习和…

Docker部署FLASK Unicorn并配置Nginx

1. 安装相关依赖 flask3.0.0 pymysql1.1.0 #我自己需要的 flask_cors4.0.0 gunicorn21.2.0 gevent23.9.12. 配置Gunicorn 新建gunicorn.conf.py bind 0.0.0.0:5418 # 绑定的IP地址和端口 workers 8 # 同时执行的进程数&#xff0c;推荐为当前CPU个数*21 worker_class&qu…

【Java】java | CacheManager | redisCacheManager

一、说明 1、查询增加缓存&#xff0c;使用Cacheable注解 2、项目中已经用到了ehcache&#xff0c;现在需求是两个都用 二、备份配置 1、redisConfig增加代码 Bean("redisCacheManage")Primarypublic CacheManager redisCacheManager(RedisConnectionFactory fact…

项目集成的关键过程总结

项目集成是确保项目各部分协调一致&#xff0c;共同实现项目目标的过程。以下是项目集成的关键过程&#xff1a; 制定集成计划 制定集成计划是项目集成的第一步。该计划应明确集成的目标、范围、时间表、资源分配和风险管理策略。在制定集成计划时&#xff0c;需要考虑项目干…

CKD TransBTS:用于脑肿瘤分割的具有模态相关交叉注意的临床知识驱动混合转换器

CKD-TransBTS: Clinical Knowledge-Driven Hybrid Transformer With Modality-Correlated Cross-Attention for Brain Tumor Segmentation CKD TransBTS&#xff1a;用于脑肿瘤分割的具有模态相关交叉注意的临床知识驱动混合转换器背景贡献实验方法how radiologists diagnose b…

【19年扬大真题】已知a数组int a[ ]={1,2,3,4,5,6,7,8,9,10},编写程序,求a数组中偶数的个数和偶数的平均值

【18年扬大真题】 已知a数组int a[ ]{1,2,3,4,5,6,7,8,9,10}&#xff0c;编写程序&#xff0c;求a数组中偶数的个数和偶数的平均值 int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int os 0;//偶数个数int sum 0;//偶数和float ave 0;//偶数平均值for (int i 0;i <…

关于2023年11月25日PMI认证考试准考信下载及考场规定等事项通知

各位考生&#xff1a;为保证参加2023年11月25日PMI项目管理资格认证考试的每位考生都能顺利进入考场参加考试&#xff0c;请完整阅读本通知内容。 一、关于准考信下载为确保您顺利进入考场参加11月份考试&#xff0c;请及时登录本网站个人系统下载并打印准考信&#xff0c;准考…

Google codelab WebGPU入门教程源码<6> - 使用计算着色器实现计算元胞自动机之生命游戏模拟过程(源码)

对应的教程文章: https://codelabs.developers.google.com/your-first-webgpu-app?hlzh-cn#7 对应的源码执行效果: 对应的教程源码: 此处源码和教程本身提供的部分代码可能存在一点差异。点击画面&#xff0c;切换效果。 class Color4 {r: number;g: number;b: number;a…