#systemverilog# 之 event region 和 timeslot 仿真调度(五)实战

news2024/11/18 16:31:41

目录

一 问题代码

二 解决方法 

2.1 调换代码顺序

2.2 #0 Delay

2.3 uvm class 执行移到re-avtive

2.4  搭建完备的UVM 验证平台

三 预期波形

经过之前文章的学习,想必大家对systemverilog 仿真调度的理解,应该八九不离十了。今天,我们结合实际中的例子,来实战一下,对之前的理解,做一个考核。

我们拿《UVM实战》中的2.2.1章节的例子,来讲解。

一 问题代码

(1)RTL 的设计实现

文件:src/ch2/dut/dut.sv[2]
  1 module dut(clk,
  2           rst_n,
  3           rxd,
  4           rx_dv,
  5           txd,
  6           tx_en);
  7 input clk;
  8 input rst_n;
  9 input[7:0] rxd;
 10 input rx_dv;
 11 output [7:0] txd;
 12 output tx_en;
 13
 14 reg[7:0] txd;
 15 reg tx_en;
 16
 17 always @(posedge clk) begin 
 18    if(!rst_n) begin
 19       txd <= 8'b0;
 20       tx_en <= 1'b0;
 21    end
 22    else begin
 23       txd <= rxd;
 24       tx_en <= rx_dv; 
 25    end
 26 end
 27 endmodule

(2)my_driver uvm component 的实现

文件:src/ch2/section2.2/2.2.1/my_driver.sv
  3 class my_driver extends uvm_driver;
  4
  5    function new(string name = "my_driver", uvm_component parent = null); 
  6       super.new(name, parent);
  7    endfunction
  8    extern virtual task main_phase(uvm_phase phase);
 
  9 endclass
 10
 11 task my_driver::main_phase(uvm_phase phase);
 12    top_tb.rxd <= 8'b0;
 13    top_tb.rx_dv <= 1'b0;
 14    while(!top_tb.rst_n)
 15       @(posedge top_tb.clk);
 16    for(int i = 0; i < 256; i++)begin
 17       @(posedge top_tb.clk);
 18       top_tb.rxd <= $urandom_range(0, 255);
 19       top_tb.rx_dv <= 1'b1;
 20       `uvm_info("my_driver", "data is drived", UVM_LOW) 
 21    end
 22    @(posedge top_tb.clk);
 23    top_tb.rx_dv <= 1'b0;
 24 endtask

(3)顶层TB的实现 

`timescale 1ns/1ps 
`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;
wire[7:0] txd;
wire 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);
   fork
     drv.main_phase(null);
   join
   $finish();
end

initial begin
   clk = 0;
   forever begin
      #100 clk = ~clk;
   end
end

initial begin
   rst_n = 1'b0;
   #1000;
   rst_n = 1'b1;
end

initial begin
$fsdbDumpfile("test.fsdb");
$fsdbDumpvars(0,top_tb);
$fsdbDumpMDA();
$fsdbDumpSVA();
end

endmodule

我们将上述代码,经VCS编译仿真运行,得到结果如下:

 我们发现:此仿真结果和实际DUT 行为不符合:在rst 复位期间,rxd[7:0] 竟然随机出来数据。这显然是不正确的。问题究竟出在哪里?

对了,此问题映照了今天的主题,是SV仿真调度机制的原因。

如上图所示:总体来看,右图显示,drv.main_phase(null)的执行是放在module:top_tb......endmodule:top_tb  中的   initial begin......end 之间,执行的。并且,driver 中的top_tb.rst_n 的采样,也是发生在 active 区域,而不是发生在re-active 调度区域,所有top_tb.rst_n 的采样执行 vs rst_n = 0 阻塞赋值执行,是在同一个区域,都是在active 域。那么,此时执行的顺序,是代码的位置顺序。所以,

while(!top_tb.rst_n)  @(poasedge top_tb.clk); 

执行的时候,rst_n =0 还未执行,while loop 跳过执行。

二 解决方法 

2.1 调换代码顺序

`timescale 1ns/1ps 
`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;
wire[7:0] txd;
wire tx_en;

initial begin
   clk = 0;
   forever begin
      #100 clk = ~clk;
   end
end

initial begin
   rst_n = 1'b0;
   #1000;
   rst_n = 1'b1;
end


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);
   fork
     drv.main_phase(null);
   join
   $finish();
end


initial begin
$fsdbDumpfile("test.fsdb");
$fsdbDumpvars(0,top_tb);
$fsdbDumpMDA();
$fsdbDumpSVA();
end

endmodule

2.2 #0 Delay

这里来看,uvm class 中的 task 是顺序执行的。但是也遵守调度规则。 

2.3 uvm class 执行移到re-avtive

2.4  搭建完备的UVM 验证平台

预期波形

 

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

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

相关文章

基于STM32的NRF24L01 2.4G通讯模块的驱动实验(HAL库)

前言&#xff1a;本文为手把手教学NRF24L01 2.4G通讯模块的驱动实验&#xff0c;本教程的 MCU 采用STM32F103ZET6与STM32F103C8T6&#xff0c;彼此进行互相通讯。通过 CubeMX 软件配置 SPI 协议驱动NRF24L01 2.4G通讯模块&#xff08;HAL库&#xff09;。NRF24L01 2.4G是嵌入式…

渗透测试--5.2.hash密码的破解

目录 1.hashcat简介 2.hashcat参数 常见参数 哈希类型&#xff08;-m&#xff09; 破解模式&#xff08;-a&#xff09; 3.实例 步骤一&#xff1a;使用hash-identifier工具判断哈希值类型 步骤二&#xff1a;使用字典攻击进行破解 1.hashcat简介 hashcat号称世界上最…

js实现点击改变文字大小

目录 一、前言二、代码实现 一、前言 在编写代码之前我们先来看看通过js获取元素有几种方式&#xff1a; 1.第一种 document.querySelector() 返回文档中匹配指定的选择器组的第一个元素document.querySelectorAll(); 返回文档中匹配指定的选择器组的所有元素 <!DOCTYPE ht…

vector容器 [上]

目录 一、 对于vector的介绍 二、vector的定义 0x01 无参构造 0x02 构造并初始化n个val 0x03 使用迭代器进行初始化构造 0x04 拷贝构造 0x05 比较 三、 vector的遍历 0x01 push_back() 0x02 operator[] 和at() 0x03 遍历 四、vector 容量空间 0x01 max_size : 返回v…

【设置教程】未使用系统分配DNS地址 如何设置?答:

未使用系统分配DNS地址&#xff0c;是你的域名解析DNS地址不是当前系统的DNS地址。 设置方法&#xff1a;先关闭更新。域名控制台--域名列表--安全设置&#xff1a; 通过短信验证。 2、修改DNS地址&#xff1a;域名控制台--域名列表&#xff1a;点击域名&#xff1a; 3、点击&…

C语言函数速查

scanf函数 函数概要&#xff1a; scanf 函数从标准输入流中读取格式化字符串。 与 printf 格式化输出函数相反&#xff0c;scanf 函数是格式化输入函数。 函数原型&#xff1a; #include <stdio.h> ... int scanf(const char *format, ...);参数解析&#xff1a; 1…

事务 ---MySQL的总结(六)

事务 多进程进行并改变同一个数据&#xff0c;如果没有进行版本控制&#xff0c;就会出现数据不确定的问题&#xff0c;为此引入了事务的概念。可以进行数据回滚&#xff0c;解决潜在的问题。 事务的概念 一组的DML组成&#xff0c;这一些的DML要么同时成功&#xff0c;要么同…

Linux上开启coredump

Linux上开启core dump Core dump&#xff08;核心转储&#xff09;是在程序崩溃时生成的一种文件&#xff0c;其中包含了程序在崩溃时的内存状态信息。它可以帮助程序员在调试程序时快速定位问题&#xff0c;并且是一种非常有用的调试工具。core dump的作用如下&#xff1a; 帮…

Java面向对象程序设计实验报告(实验二 面向对象基础练习)

✨作者&#xff1a;命运之光 ✨ 专栏&#xff1a;Java面向对象程序设计实验报告 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录&#xff1a;源程序代码&#xff08;带注释&#xff09; 测试类demo2 Address类 Employee类…

Docker之DockerFile相关基础知识

DockerFile相关基础知识 一、Docker镜像原理1、操作系统组成部分1.1 七大子系统1.2 Linux文件系统 2、Docker镜像原理介绍2.1 原理图2.2 Docker镜像本质2.3 统一文件系统2.4 复用性2.5 统一性 二、容器转为镜像1、Docker镜像的制作1.1 容器转换为镜像1.2 镜像转为压缩文件1.3 导…

【SpringBoot】三:访问数据库

文章目录 1.DataSource2.JdbcTemplate2.1 准备环境2.2 准备表和数据2.3 配置数据源2.4 JdbcTemplate访问mysql2.5 创建实体类 ArticlePO2.6 测试2.6.1 测试聚合函数 3.mybatis3.1 单表CRUMD3.1.1 创建模块3.1.2 查询3.1.3 插入3.1.4 更新3.1.5 删除 3.2 ResultMap3.3 SQL 提供者…

Elasticsearch 集群部署管理

Elasticsearch 集群配置版本均为8以上 安装前准备 CPU 2C 内存4G或更多 操作系统: Ubuntu20.04,Ubuntu18.04,Rocky8.X,Centos 7.X 操作系统盘50G 主机名设置规则为nodeX.qingtong.org 生产环境建议准备单独的数据磁盘主机名 #各自服务器配置自己的主机名 hostnamectl set-ho…

【2023/05/17】smalltalk

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第12天。 Share His own morning are new surprises to God. 译文&#xff1a; 神自己的清晨&#xff0c;在他自己看来也是新奇的。 Life finds its wealth by the claims of the world,and its worth…

基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架

1 main.py主入口 # -*- coding:utf-8 -*- # 作者&#xff1a;虫无涯 # 日期&#xff1a;2023/2/17 # 文件名称&#xff1a;main.py # 作用&#xff1a;框架的主入口函数# codingutf-8import time from common.reportOut import report_out from common.logOut import log_out …

Wandb.init和wandb.sweep的使用准则

目录 在使用 wandb.init() 初始化函数时&#xff0c;你可以包含以下信息&#xff1a; 如果在同一个代码中多次调用 wandb.init()&#xff0c;可能会导致以下问题&#xff1a; 如果你在一个大文件中使用了 wandb.init()&#xff0c;并且想在其他小文件中使用 wandb.log() 来记…

docker-compose部署sonarqube开源代码审计和分析平台

生成文件夹 mkdir -p /docker/sonar/postgres/postgresql mkdir -p /docker/sonar/postgres/datamkdir -p /docker/sonar/sonarqube chmod 777 -R /docker/sonar/sonarqube echo "vm.max_map_count262144" > /etc/sysctl.conf sysctl -p 创建docker-compose.yml文…

Kuberentes,k8s诞生简介

一、前言 什么是k8s&#xff1f; Kuberentes 是基于容器的集群管理平台&#xff0c;它的简称&#xff0c;是K8S。有人说之所以叫k8s&#xff0c;是因为k到s中间有8个字母&#xff0c;因此叫k8s&#xff0c;也有人说&#xff0c;在使用k8s的安装配置流程中&#xff0c;共分为8…

6年测开经验面试十家大厂,整理出来的笔记...

我第一次接触自动化是在2016年。那时刚毕业一年有余&#xff0c;组内一直做手工功能测试&#xff0c;大概在2018年9月&#xff0c;部门领导要求测试组引入自动化。组内之前从没有开展过任何自动化&#xff0c;测试主管安排了一个刚入职不久的研究生同事去研究。 当时自己内心还…

STM32独立按键扫描,支持同时按下、长按、快速键值

背景 有个项目在实际应用中&#xff0c;采用8个独立按键&#xff0c;每个按键都赋予不同功能&#xff0c;实际使用过程中很多时候都是需要比较特殊的按键操作&#xff0c;例如&#xff1a;长按10s按键、长按5s按键&#xff0c;或者长按需要有快速按键值的反馈&#xff0c;这个…

wordcloud背景图多图形演示

文章目录 前言一、问题二、多图层1.部分重叠1.1背景图1.2词云图 2.完全重叠2.1背景图2.2词云图 3.不重叠3.1背景图3.2词云图 三、不同形状1.背景图2.词云图 四、代码总结 前言 大家好&#xff0c;我是空空star&#xff0c;本篇给大家分享一下wordcloud背景图多图形演示。 一、问…