UVM重点归纳(一)

这篇具有很好参考价值的文章主要介绍了UVM重点归纳(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 factory 机制

1.1 利用工厂机制的一般实现步骤:

1.继承

范式:

class comp_type/obj_type extends uvm_component/uvm_object;

实例:

class comp1/obj1 extends uvm_component/uvm_object;

2.注册

范式:

​​​​​​​`uvm_component/object_utils(comp_type/obj_type);

实例:

`uvm_component/object_untils(comp1/obj1);

3.new函数声明

范式:

function new (string name="comp1/obj1",uvm_compinent parent=null(obj1无此项));

实例:

function new (string name="comp1/obj1",uvm_compinent parent=null(obj1无此项));

4.实例化

范式:

comp_type/obj_type 实例名

实例:comp1 c1,c2;

           obji o1,o2;

5.覆盖

范式:

类型覆盖:orig_type::type_id::set_type_override(new_type::get_type());

实例覆盖:orig_type::type_id::set_inst_override(neew_type::get_type(),"orig_inst_path");

​​​​​​​实例:

类型覆盖:comp1::type_id::set_type_override(comp2::get_type());

实例覆盖:obj1::type_id::set_type_override(obj2::get_type(),"");

6.创建

范式:

comp_type::type_id::create(string name, uvm_component parent);

           obj_type::type_id::create(string name);

实例:

c1=comp1::type_id::create("c1",null);

o1=obj1::type::id::create("o1");​​​​​​​

一些细节:

1. 在uvm中的创建一定使用以上范式,尽管使用new函数也可以实现,但是会使后边很多工厂自带的方法失效;

2.覆盖一定在创建之前;

3.特别注意覆盖中返回的句柄,有时需要根据实际情况进行cast转换;

了解更多关于工厂机制的内容请点击下边链接:

工厂机制&覆盖方法https://blog.csdn.net/weixin_45680021/article/details/124256876​​​​​​​

1.2 uvm_coreservice_t 类 

​​​​​​​factory 机制并不是object类型也不是component 类型,它存在于uvm_coreservice_t类中;uvm_coreservice_t在仿真开始时例化(run 0 时刻),用户无需额为例化;另外以上关于工厂机制的覆盖,创建也可以通过直接使用factory的方法实现;

uvm_coreservice_t 主要包括:

1. 唯一的uvm_factory,该组件用来注册,覆盖和例化;

2.全局的report_server,该组件用来做消息统筹和报告;

3.全局的tr_database,该组件用来用来记录transaction,便于后续调试;

4.get_root()方法用来返回当前uvm环境的结构顶层对象;

1.3 域的自动化​​​​​​​ 

范式:

`uvm_(object/component)_utils_begin(object_type/component_type)

`uvm_field_{int,enum,real,object,string,event,array_int}(ARG,FLAG);

ARG:表示成员变量;

FLAG:标记的数据操作(UVM_ALL_ON/ UVM_COPY);

`uvm_(object/component)_utils_end

实例:

`uvm_component_utils_begin(com1)

`uvm_field_int(volume,UVM_ALL_ON)

`uvm_field_enum(color_t,color,UVM_ALL_ON)

`uvm_field_string(name,UVM_ALL_ON)

`uvm_component_utils_end

 域的自动化是uvm环境搭建中重要的一部分,可以减少验证人员的工作量,大大解放验证人员的双手,详细了解此部分内容请点击以下链接:

核心基类方法@域的自动化https://blog.csdn.net/weixin_45680021/article/details/124285897

2. phase 机制

phase机制,phase机制主要是使得UVM的运行仿真层次化,使得各种例化先后次序正确。SV 中可以通过构建函数来实现对象的例化,但是只通过new函数无法实现层次化;在UVM 中,phase机制的出现正好解决了这个问题,而且层次化的构建是在例化之前就已经确定的。

UVM 的 phase机制主要有9个,外加12个小phase。主要的 phase有 build phase、connect phase、run phase、report phase、final phase等,其中除了run phase是 task,其余都是function,然后build phase和 final phase都是自顶向下运行,其余都是自底向上运行。Run phase和12个小phase( reset phase、configure phase、main phase、shutdown phase)是并行运行的,有这12个小phase主要是进一步将run phase 中的事务划分到不同的phase进行,简化代码。注意,run phase和 12个小phase最好不要同时使用。从运行上来看,9个phase顺序执行,不同组件中的同一个phase执行有顺序,build phase为自顶向下,只有同一个phase全部执行完毕才会执行下一个phase。

run_phase 和 main_phase 的区别:

run_phasemain phase(动态运行)都是task phase,且是并行运行的,后者称为动态运行(run-time)phase。如果想执行一些耗费时间的代码,那么要在此phase下任意一个component中至少提起一次objection,这个结论只适用于12run-timephase。对于run_phase则不适用,由于run_phase与动态运行的phase并行运行的,如果12个动态运行的phaseobjection被提起,那么run_phase根本不需要raise_objection就可以自动执行。

phase机制时序图: 

uvm知识点整理,UVM,fpga开发,UVM,验证方法学

UVM仿真的开始:

在顶层环境中调用全局函数run_test(),验证人员可以考虑在调用时传递test名称,也可以不传递,而选择在仿真时通过传递参数+UVM_TESTNAME=<testname>来选择test。

uvm_root:

run_test()的方法是由uvm_root提供的,uvm_root作为UVM唯一的顶层类,其继承于uvm_

component,注意在uvm环境中,顶层类有且只有一个。uvm_root的职责是通过创建组件是指定的parent来构成层次,如果parent设置为null,那么他将作为uvm_root 的子组件;调用其方法run_test()将进行如下的初始化:

1.得到正确的test_name;

2.初始化objection机制;

3.创建uvm_test_top实例;

4.调用phase中的控制方法,安排所有组件的执行顺序;

5.等待phase结束,关闭进程;

6.报告总结和结束仿真;

UVM仿真的结束:

结束当真的机制有且只有一种,就是利用objection挂起机制来控制仿真的结束;

run_phase 机制的挂起与落下objection

raise_objection();

drop_objection();

set_drain_time():设置退出时间

注意:run开始后至少要有一个组件立即挂起objection,否则仿真将会立即退出。

建议:在sequence中使用objection机制,可以在body()的首尾部分挂起的落下objection.

 以上内容只是对phase机制的一个简单介绍,许多细节的内容请点击以下链接:

phase机制https://blog.csdn.net/weixin_45680021/article/details/124295347 

3.config机制

在SV的世界里,只有当所有的环境后才准备好,如果想要在顶层环境对底层环境做配置时,需要通过句柄进行一层一层的传递,这要很不利于软件的封装复用,而且极容易出错;

在uvm中,config机制的出现,彻底改善了以上的弊端,通过uvm_cinfig_db #(T)::set()和uvm_cinfig_db #(T)::get()的配对使用,可以在环境构建前从顶层直接对任意底层进行配置,传递的对象可以是virtual interface,单一变量,对象。

范式:

uvm_config_db #(T)::set(uvm_component cntxt,string inst_name,string field_name,T value);

uvm_config_db #(T)::get(uvm_component cntxt,string inst_name,string field_name,T value)

实例:

uvm_config_db #(virtual intf)::set(uvm_root::get(),"uvm_test_top.c1","vif",intf);

get方法中的前两个参数构成了从顶层到配置层的路径,第三个参数是类中的变量,最后一个参数是传递的数值

uvm_config_db #(virtual intf)::get(this," ","vif",vif);

set方法中的前两个参数一般都是以上形式,因为是当前层,第三个,第四个参数分别表示变量和值;

环境结构层次如下:

uvm知识点整理,UVM,fpga开发,UVM,验证方法学

使用config机制特别需要注意:

1.set/get的路径一定要一致;

2.传递的参数一定要一致;

3.一定是先set后get; 

关于set/get方法的一些后台操作理解:

1.set的路径和数据实际上被放置到uvm_pkt唯一的全局变量uvm_pkt::uvm::resources中;

uvm_resources是uvm_resource_pool的唯一实例,在该实例中有两个resource数组来存放配置子信息,一个由层次索引,一个由类型索引;

2.get方法被调用后回自动到uvm_resources中按照路径寻找值,如果可以找到,则返回1,找不到返回0;

以上内容只是对config的精简介绍,关于具体用法请点击以下链接:

config机制应用https://blog.csdn.net/weixin_45680021/article/details/124304969

 4.消息机制

一个好的验证环境的搭建离不开信息报告的打印,在UVM中由专门的一套信息机制,提供了一系列丰富的类和方法来生成和过滤消息;

范式:

方法调用:function void uvm_report_info(string id,string message,int verbosity= UVM_LOW,string filename="",int line=0);

宏调用:`uvm_info(ID,MESSAGE,VERBOSITY)

string id:消息ID

string message:消息内容;

int verbosity:冗余度,有UVM_NONE/LOW/MEDIUM/HIGH/FULL/DEBUG

string filename:文件名(不做定义,系统自己打印)

int line: 行号(不做定义,系统自己打印)

一般使用宏定义的方法更加简洁,还有其他的严重级别,比如WARNING/ERROR/FATAL,请对应的处理方式及实现代码演练请参考以下文章:

​​​​​​​消息机制https://blog.csdn.net/weixin_45680021/article/details/124316347

消息管理是由uvm_report_handler类来实现的,而每一个uvm_report_object类中都有一个 uvm_report_handler实例,不管是上边的方法调用还是宏调用,都是针对uvm_report_ handler做出的配置。

uvm知识点整理,UVM,fpga开发,UVM,验证方法学​​​​​​​

 文章来源地址https://www.toymoban.com/news/detail-634020.html

到了这里,关于UVM重点归纳(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP协议的重点知识点

    TCP(传输控制协议)是一种面向连接、可靠的数据传输协议,工作在传输层,提供可靠的字节流服务。它是互联网协议栈中最重要、最复杂的协议之一,也是面试中常被问到的知识点。本文将详细介绍TCP协议的各个重要概念。 TCP主要具有以下基本特性: 面向连接:在传输数据前必须先

    2024年02月11日
    浏览(43)
  • 西安石油大学 C++期末考试 重点知识点+题目复习(上)

    当使用 const 修饰变量、函数参数、成员函数以及指针时,以下是一些代码示例: 声明只读变量: 保护函数参数: 防止成员函数修改对象状态: 防止指针修改指向的值: 这些示例展示了如何使用 const 来声明常量、保护函数参数、防止成员函数修改对象状态以及防止指

    2024年02月11日
    浏览(42)
  • 西安石油大学 C++期末考试 重点知识点+题目复习(下)

    析构函数的调用顺序与对象的创建和销毁顺序相反。 对于单个对象,当对象的生命周期结束时(例如离开作用域),会调用其析构函数。因此,析构函数会在对象销毁之前被调用。 对于类的成员对象,它们的析构函数的调用顺序与它们在类中的声明顺序相反。即,在类的析

    2024年02月11日
    浏览(55)
  • [知识点整理]中科院/国科大 自然语言处理nlp 期末考试知识点整理

    本文为2022秋网安学院的自然语言处理课程期末复习知识点整理,水平有限,整理的答案可能有错误或遗漏,欢迎大家指正。 文章的第二部分内容参考了学校学姐的文章,文章写的很好,大家可以关注她: (133条消息) 【一起入门NLP】中科院自然语言处理期末考试*总复习*:考

    2024年02月09日
    浏览(51)
  • 【数据结构】考研真题攻克与重点知识点剖析 - 第 6 篇:图

    本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。 此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术有限,最终数据清洗结果不够理想,

    2024年04月15日
    浏览(53)
  • 重点| 系统集成项目管理工程师考前50个知识点

    本文章总结了系统集成项目管理工程师考试背记50个知识点!!! 帮助大家更好的复习,希望能对大家有所帮助 比较长,放了部分,需要可私信!! 1、信息系统安全的属性包括保密性、完整性、可用性和不可抵赖性。 (1)保密性是应用系统的信息不被泄露给非授权的用户

    2023年04月09日
    浏览(47)
  • 复习知识点整理

    1.导入某个文件夹的index文件,index可以省略(这里导入的是router和store文件下的index.js文件) 2.路由懒加载 this 1.在vue文件中使用routerstore对象时 2.在js文件中使用routerstore对象时 使用什么需要导入时候,挂载在vue全局对象上的对象在vue文件中可以使用,在js文件中不能使用

    2024年04月08日
    浏览(82)
  • Mysql知识点整理

    什么是Mysql; Mysql常用的存储引擎有什么?它们有什么区别? 数据库的三大范式; Mysql的数据类型有哪些? Mysql的索引: 什么是Mysql索引? 索引的优缺点 索引的数据结构 Hash索引和B+树索引的区别 索引类型有哪些? 索引的种类有哪些? B树和B+树的区别? 数据库为什么使用

    2023年04月12日
    浏览(40)
  • Redis知识点整理

    第一部分:Redis基础知识点 1、数据类型 5种常用基础类型:string,hash,list,set,zset – 字符串,Hash表,List顺序集合,Set无序集合,ZSet有序集合 3中特殊类型:bitmap-字节地图, hyperloglog-统计日志,geospatial-地理位置计算 2、底层数据结构 String: 基于SDS字典结构 Hash表 : 由zipList/qui

    2024年02月10日
    浏览(45)
  • Docker知识点整理

    传统的虚拟机,可以虚拟出一条硬件,运行一个完整的操作系统,在这个操作系统上安装和运行所需的软件 容器内的应用可以直接运行在宿主 主机的内核中,容器没有自己的内核,也不用虚拟硬件 (轻便) 每个容器是相互隔离的,每个容器内都有属于自己的文件系统,之间

    2024年02月03日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包