UVM中的config_db机制传递interface

(1)定义interface

interface my_if(input clk, input rst_n);logic [7:0] data;logic valid;endinterface

(2)在tb中使用interface

        定义了interface后,在top_tb中实例化DUT时,就可以直接使用。
        先实例化interface

  my_if input_if(clk, rst_n);my_if output_if(clk, rst_n);

        将interface与dut绑定

dut 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));

(3)在driver中使用interface

        不能在class中直接例化interface,向下面的代码是错误的:

class my_driver extends uvm_driver;
my_if drv_if;
…
endclass

        在类中使用的是virtual interface。如下面的代码所示:

class my_driver extends uvm_driver;virtual my_if vif;...
endclass

        在声明了vif后,就可以在main_phase中使用如下方式驱动其中的信号:

task my_driver::main_phase(uvm_phase phase);phase.raise_objection(this);`uvm_info("my_driver", "main_phase is called", UVM_LOW);vif.data <= 8'b0; vif.valid <= 1'b0;while(!vif.rst_n)@(posedge vif.clk);for(int i = 0; i < 256; i++)begin@(posedge vif.clk);vif.data <= $urandom_range(0, 255);vif.valid <= 1'b1;`uvm_info("my_driver", "data is drived", UVM_LOW);end@(posedge vif.clk);vif.valid <= 1'b0;phase.drop_objection(this);
endtask

(4)把top_tb中的input_if和my_driver中的vif对应起来

        最简单的方法莫过于直接赋值。此时一 个新的问题又摆在了面前:在top_tb中,通过run_test语句建立了一个my_driver的实例,但是应该如何引用这个实例呢?不可能像 引用my_dut那样直接引用my_driver中的变量:top_tb.my_dut.xxx是可以的,但是top_tb.my_driver.xxx是不可以的。这个问题的终极 原因在于UVM通过run_test语句实例化了一个脱离了top_tb层次结构的实例,建立了一个新的层次结构。
        对于这种脱离了top_tb层次结构,同时又期望在top_tb中对其进行某些操作的实例,UVM引进了config_db机制。在config_db机 制中,分为set和get两步操作。所谓set操作,读者可以简单地理解成是“寄信”,而get则相当于是“收信”。在top_tb中执行set操作

initial beginuvm_config_db#(virtual my_if)::set(null, "uvm_test_top", "vif", input_if);
end

        在my_driver中,执行get操作:

   virtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("my_driver", "build_phase is called", 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

        这里引入了build_phase。与main_phase一样,build_phase也是UVM中内建的一个phase当UVM启动后,会自动执行 build_phase。build_phase在new函数之后main_phase之前执行在build_phase中主要通过config_db的set和get操作来传递一些数据, 以及实例化成员变量等。需要注意的是,这里需要加入super.build_phase语句,因为在其父类的build_phase中执行了一些必要的操 作,这里必须显式地调用并执行它。build_phase与main_phase不同的一点在于,build_phase是一个函数phase,而main_phase是一个 任务phase,build_phase是不消耗仿真时间的。build_phase总是在仿真时间($time函数打印出的时间)为0时执行
        在build_phase中出现了uvm_fatal宏,uvm_fatal宏是一个类似于uvm_info的宏,但是它只有两个参数,这两个参数与uvm_info宏 的前两个参数的意义完全一样。与uvm_info宏不同的是,当它打印第二个参数所示的信息后,会直接调用Verilog的finish函数来结 束仿真。uvm_fatal的出现表示验证平台出现了重大问题而无法继续下去,必须停止仿真并做相应的检查。所以对于uvm_fatal来 说,uvm_info中出现的第三个参数的冗余度级别是完全没有意义的,只要是uvm_fatal打印的信息,就一定是非常关键的,所以无 需设置第三个参数。
        config_db的set和get函数都有四个参数,这两个函数的第三个参数必须完全一致。set函数的第四个参数表示要将哪个interface 通过config_db传递给my_driver,get函数的第四个参数表示把得到的interface传递给哪个my_driver的成员变量set函数的第二个参 数表示的是路径索引,即在2.2.1节介绍uvm_info宏时提及的路径索引。在top_tb中通过run_test创建了一个my_driver的实例,那么 这个实例的名字是什么呢?答案是uvm_test_topUVM通过run_test语句创建一个名字为uvm_test_top的实例
        无论传递给run_test的参数是什么,创建的实例的名字都为uvm_test_top。由于set操作的目标是my_driver,所以set函数的第二 个参数就是uvm_test_top。
        set函数与get函数使用双冒号是因为这两个函数都是静态函数,而 uvm_config_db#(virtual my_if)则是一个参数化的类,其参数就是要寄信的类型,这里是virtual my_if。

(5)通过config_db机 制向变量传递值

        假如要向my_driver的var变 量传递一个int类型的数据,那么可以使用如下方式:

initial begin
uvm_config_db#(int)::set(null, "uvm_test_top", "var", 100);
end

        而在my_driver中应该使用如下方式:

class my_driver extends uvm_driver;int var;virtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("my_driver", "build_phase is called", UVM_LOW);if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))`uvm_fatal("my_driver", "virtual interface must be set for vif!!!")if(!uvm_config_db#(int)::get(this, "", "var", var))`uvm_fatal("my_driver", "var must be set!!!")
endfunction

        从这里可以看出,可以向my_driver中“寄”许多信。上文列举的两个例子是top_tb向my_driver传递了两个不同类型的数据,其 实也可以传递相同类型的不同数据。假如my_driver中需要两个my_if,那么可以在top_tb中这么做:

initial beginuvm_config_db#(virtual my_if)::set(null, "uvm_test_top", "vif", input_if);uvm_config_db#(virtual my_if)::set(null, "uvm_test_top", "vif2", output_if);
end

        在my_driver中这么做:

virtual my_if vif;
virtual my_if vif2;virtual function void build_phase(uvm_phase phase);super.build_phase(phase);`uvm_info("my_driver", "build_phase is called", UVM_LOW);if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))`uvm_fatal("my_driver", "virtual interface must be set for vif!!!")if(!uvm_config_db#(virtual my_if)::get(this, "", "vif2", vif2))`uvm_fatal("my_driver", "virtual interface must be set for vif2!!!")
endfunction

        ​​​​​​​注意:set和get函数,这两个函数的第三个参数必须完全一致

参考:UVM实战



 

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

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

相关文章

【面试总结】Java面试题目总结(一)

&#xff08;以下仅为个人见解&#xff0c;如果有误&#xff0c;欢迎大家批评并指出错误&#xff0c;谢谢大家&#xff09; 1.项目中的验证码功能是如何实现的&#xff1f; 第一步&#xff1a;在项目的pom.xml文件中导入 EasyCaptcha 的依赖&#xff1b; <dependency>…

软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

目录 1、问题说明 2、使用Windbg查看崩溃时详细的函数调用堆栈

SQL命令---修改字段名

介绍 使用sql语句修改字段名。 命令 alter table 表名 change 旧字段名 新字段名 新数据类型;例子 将a表id字段名改为id1 alter table a change id id1 int(12) NOT NULL;

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG 2023/12/7 23:50 SDK&#xff1a;rk356x_android12_220722.tgz 只修改DTS的DTC部分就【直接】可以跑NanoPC-T4 参考资料&#xff1a; http://www.friendlyelec.com.cn/agent.asp http://www.friendlyelec.com.c…

[python高级编程]:01-数据结构

此系列主要用于记录Python学习过程中查阅的优秀文章&#xff0c;均为索引方式。其中内容只针对本作者一人&#xff0c;作者熟悉了解的内容不再重复记录。 目录 01-列表推导式 列表推导同filter和map的比较 02-元组 元组拆包 具名元组 01-列表推导式 列表推导同filter和map的比…

实现安装“自由化”!在Windows 11中如何绕过“您尝试安装的应用程序未通过微软验证”

这篇文章描述了如果你不能安装应用程序,而是当你在Windows 11中看到消息“您尝试安装的应用程序未通过微软验证”时该怎么办。完成这些步骤将取消你安装的应用程序必须经过Microsoft验证的要求。 使用设置应用程序 “设置”应用程序提供了绕过此警告消息的最简单方法,以便你…

Windows10下MySQL5.7.31解压版安装与卸载

一、安装 1进入官网下载MySQL5.7.31解压版&#xff1a; MySQL :: Download MySQL Community Server (Archived Versions) 2解压文件 解压目录到D:\developer_tools\MySQL\mysql-5.7.31-winx64&#xff0c;在bin同级目录下创建my.ini文件&#xff0c;写入以下代码&#xff1…

python简易学生管理 + MySQL

数据库表 Python代码部分 import pymysqlclass StMgmt(object):def tips(self):"""提示用户选择的操作"""print("""学生管理系统 1.01.查看所有信息2.查看学生信息3.修改学生信息4.增加学生信息5.退出学生系统"""…

【网络安全技术】传输层安全——SSL/TLS

一、TLS位置及架构 TLS建立在传输层TCP/UDP之上&#xff0c;应用层之下。 所以这可以解决一个问题&#xff0c;那就是为什么抓不到HTTP和SMTP包&#xff0c;因为这两个在TLS之上&#xff0c;消息封上应用层的头&#xff0c;下到TLS层&#xff0c;TLS层对上层消息整个做了加密&…

数的划分(递归)

题目名字 数的划分 题目链接 题意 给数字n&#xff0c;讲数字n分为m份&#xff0c;共有多少种分法&#xff0c;不能重复&#xff0c;分成一样的数字也不行 思路 看到这种分数字的先化成有多少个球要分到多少个篮子里去再想两个分法并且加起来&#xff0c;一个是每个篮子最多只…

<JavaEE> 经典设计模式之 -- 单例模式(“饿汉模式”和“懒汉模式”实现单例模式)

目录 一、单例模式概述 二、“饿汉模式”实现单例模式 三、“懒汉模式”实现单例模式 3.1 单线程下的“懒汉模式” 3.2 多线程下的“懒汉模式” 一、单例模式概述 1&#xff09;什么是单例模式&#xff1f; 单例模式是一种设计模式。 单例模式可以保证某个类在程序中只存…

【Java数据结构 -- 顺序表】

List和ArrayList与顺序表 一. List1.1 List介绍2.1 常见接口介绍3.1 List的使用 二. ArrayList与顺序表1.线性表2.顺序表2.1 接口的实现2.2 顺序表的创建2.3 顺序表的打印2.4 顺序表的插入2.5 顺序表的按索引位置插入数据2.6 判断顺序表是否包含某个数2.7 返回顺序表某个数的索…

Java 22种设计模式详解

22种设计模式详解 创建型模式单例模式工厂方法模式抽象工厂模式建造者模式原型模式 结构型模式适配器模式桥接模式组合模式装饰器模式代理模式外观模式享元模式享元模式原理&#xff1a;享元模式角色&#xff1a;示例代码&#xff1a; 行为型模式模板方法模式原理角色示例代码命…

UEFI 学习笔记

引言 相比于Windows/MacOS/Linux等主流的操作系统,大部分人对于固件BIOS(Basic Input & Output System)并不熟悉,它诞生于1981年出产的第一代个人计算机IBM PC,在那时工程师将硬件检测代码、最基本的外围设备I/O处理程序和操作系统引导程序代码写入仅有32KB大小的PRO…

(1)(1.4) ESP32 wifi telemetry

文章目录 前言 1 用于ESP32的DroneBridge 2 推荐的硬件 3 下载和烧录固件 4 为ESP32配置DroneBridge 前言 ESP32 是现成的 Wi-Fi 模块&#xff0c;具有完整的 TCP/IP 协议栈和微控制器功能。它们提供专用的 UART、SPI 和 I2C 接口。它们可与任何 ArduPilot 自动驾驶控制器…

2023-12学习笔记

1.NonNull要手动写无参构造器 这是一个我今天研究了很久的问题&#xff0c;开始不知道原因是在这里&#xff0c;还在那想是不是Data覆盖了无参构造&#xff0c;结果当然不是。先说下解决历程 1.问题起因 通过RequestBody接收前端报文的时候报错&#xff0c;大致是说我构造方…

python中tkinter实现GUI程序:三个实例

python中tkinter实现GUI程序 写在最前面Python中使用Tkinter实现GUI程序的基本元素Tkinter简介基本元素1. 根窗口&#xff08;Root Window&#xff09;2. 小部件&#xff08;Widgets&#xff09;3. 布局管理4. 事件处理 1.用 tkinter实现一个简单的 GUI程序,单击“click”按钮&…

项目方看过来,详解Moonbeam Grants申请技巧

Grants加速计划是Moonbeam基金会发起的生态资助计划&#xff0c;旨在支持生态系统中的不同项目、社区和个人&#xff0c;帮助他们顺利进入Moonbeam发展&#xff0c;依靠早期的生态扶持迅速成长。 每一份Grant计划旨在融合社区参与、包容性和透明度等特性&#xff0c;加速Moonb…

Java项目-瑞吉外卖Day3

填充公共字段&#xff1a; 目的&#xff1a;由于某些属性&#xff0c;例如createdTime这些需要填充的字段会在多个地方出现&#xff0c;所以考虑使用公共字段自动填充的办法减少重复代码。 在对应属性上加入TableField注解。通过fill字段表明策略&#xff0c;是插入/更新的时候…

Android studio之ConstraintLayout使用

文章目录 优势使用ConstraintLayout的步骤使用多种方式定义控件的位置 优势 ConstraintLayout是一个相对布局&#xff0c;是在Android 2.3版本中引入的。它可以在不同的屏幕大小和分辨率中提供一致的布局&#xff0c;并且是支持复杂布局的最佳选择之一。ConstraintLayout相对于…