UVM笔记

一、UVM基本 概念

验证计划
功能覆盖率,结构覆盖率
模块机/芯片级/系统级
白盒/灰盒/黑盒

UVM笔记_第1张图片

二、构建简化的UVM平台

UVM笔记_第2张图片
UVM笔记_第3张图片
简化的UVM平台
只有master agent

2.1、创建transaction

UVM笔记_第4张图片

2.2、创建sequence

在这里插入图片描述
UVM笔记_第5张图片
含义:启动后产生10个事物对象,然后停止仿真。

2.3、创建agent(sequencer,monitor、driver,phase顺序)

sequencer:
UVM笔记_第6张图片

driver:
UVM笔记_第7张图片
UVM笔记_第8张图片
创建monitor:
UVM笔记_第9张图片

UVM笔记_第10张图片
phase执行顺序

UVM平台中所有的组件具有phase概念,它们按照一定顺序执行的任务或函数产生。
UVM笔记_第11张图片

2.4、创建agent

UVM笔记_第12张图片

UVM笔记_第13张图片

2.5、创建env

UVM笔记_第14张图片
UVM笔记_第15张图片

2.6、创建testcase

在这里插入图片描述
UVM笔记_第16张图片
UVM笔记_第17张图片

2.7、运行仿真

UVM笔记_第18张图片
UVM笔记_第19张图片
UVM笔记_第20张图片
UVM笔记_第21张图片

三、UVM平台组件

UVM笔记_第22张图片

3.1、UVM库

UVM库-在类库中使用继承和封装
基本要素的三个层次:
1、TLM:TLM是组件之间的通信标准
2、Structural Elements:不同方法学的通用类:组件、信息系统、仿真阶段等等
3、Methodology:这个时用户实现平台重要的主要接口。使用这些接口用户可以在不改变测试平台代码的情况下更改平台的配置、替换平台组件、更换不同的激励甚至改变仿真行为等。

UVM笔记_第23张图片
UVM package包含了三个主要的类
1、uvm_component:是用来构建UVM testbench层次结构最基本的类
2、uvm_object:作为UVM的一种数据结构,课作为配置对象来配置测试平台
3、uvm_transaction:用来产生激励和收集响应

3.2、uvm_component

UVM笔记_第24张图片
这一分类为事物服务
UVM笔记_第25张图片

3.3、UVM结构树

1、agent包含driver
UVM笔记_第26张图片
2、env包含agent
UVM笔记_第27张图片
3、test_case实例化env
UVM笔记_第28张图片

简化的UVM结构树
顶层名字总为uvm_test_top
UVM笔记_第29张图片
UVM笔记_第30张图片
uvm的实际顶层为uvm_root,系统自己产生。

UVM构建这种结构的原因:
1、为config机制提供搜索路径
2、为override机制提供搜索路径
3、时phase自动执行的需要

3.4、UVM phase

UVM中为平台组件定义了一套phase流程来控制仿真平台的执行过程。
phase是uvm_component的属性

UVM笔记_第31张图片
Task phase & Function phase。Task phase消耗仿真时间,图中黄色为Task phase其余都为Function phase。
build_phase自顶向下执行,其他phase都是自下向上执行。
黄色区域为12个run-time pahse,这12个之间按顺序执行。相同组件的task phase同一时刻进行。
注意:
1、只有当所有component的同名phase都执行完毕时,才会执行下一个phase。
2、同名phase在不同的component中的顺序执行。
3、run phase与12个run time phase的关系。同时存在可以同时使用

从验证平台的构建,到配置,到连接,再到运行,最后停止需要有一定的先后顺序。
UVM笔记_第32张图片
每一个component中都有一个任务或者函数与某个phase相对应,这些任务或者函数会在该phase阶段被自动的执行。
UVM笔记_第33张图片
依次调用buile phase。

每个phase的功能:
UVM笔记_第34张图片
12个run-time phase
UVM笔记_第35张图片
uvm_phase的启动
-使用run_test()启动UVM平台
UVM笔记_第36张图片

3.5、UVM object

UVM phase具有objection属性
UVM phase的objection属性有两个作用:
1、控制task phase的运行与终止
2、同步各个components同名的task phase

objection的使用方法:
1、在task phase中调用raise_objection()和drop_objection()。
2、task phase中其他需要执行的语句放在这两个方法之间。

UVM objection注意事项:
1、objection对于task phase才有意义,控制task phase的运行和终止。
2、必须在执行消耗仿真时间的语句之前raise objection。如果在raise之前加入消耗仿真时间的语句,会导致raise失效,延时过后直接结束当前task。
3、在task phase结束时drop objection。否则将用于不会执行下一个phase,一直停留在当前phase。
4、在一个component中的某个task phase中raise和drop objection会影响到其他component中相同名字的task phase。
5、建议在每个task phase中都raise和drop objection一次。

示例对比:
UVM笔记_第37张图片
UVM笔记_第38张图片
因为按顺序执行phase,所以如果reset_phase的执行了,那么configure_phase的打印就会变成在200延时打印。

UVM笔记_第39张图片
修改代码后,在reset_phase添加raise和drop objection。

注意事项4和5:
UVM笔记_第40张图片
monitor中的reset_phase没有raise和drop objection,但打印还是被执行了,原因在于,在driver中有同名的reset_phase
UVM笔记_第41张图片
各组件中相同的task phase会并行执行。并且会同时开始,同时退出。
但是如果monitor中执行打印时的延时高,比如#50变成#150那么将不会有打印。因为在driver #100时结束了drop_objection,而monitor中又没有raise objection,那么monitor的objection会被终止。

四、UVM factory

4.1、什么是factory

UVM笔记_第42张图片
UVM笔记_第43张图片
UVM笔记_第44张图片

4.2、使用factory(uvm_component_utils,uvm_object_utils)

UVM笔记_第45张图片
UVM笔记_第46张图片
UVM笔记_第47张图片
UVM笔记_第48张图片

4.3、factory机制与override机制

factory机制要与override机制结合使用。
factory是基础。override机制是为实现第三步而存在的,即要想factory的替换列表中添加替换项。

常见的override函数有两个:
set_type_override_by_type(original_class_name::get_type(),target_class_name::get_type());
set_inst_override_by_type(“original_inst_path”,original_class_name::get_type(),target_class_name::get_type());
这两个函数存在于component中,并且一般需要在build_phase()中调用。

UVM笔记_第49张图片第一个为全局替换,第二个为替换指定的路径,比如只替换master_agent中的类。
问题1:要将transaction中的da值约束为3
UVM笔记_第50张图片
解决:
UVM笔记_第51张图片
UVM笔记_第52张图片
UVM笔记_第53张图片
UVM笔记_第54张图片
UVM笔记_第55张图片
问题2:
仅仅希望替换master_agent中sequencer中的transaction类型而不是整个平台的呢?
解决:
UVM笔记_第56张图片
UVM笔记_第57张图片
UVM笔记_第58张图片
UVM笔记_第59张图片
UVM平台的重要性:在不改变原来平台的代码的情况下即可实现不同激励的产生。

五、事物级建模

5.1、什么是事物级建模

事物是一系列具有一定关系和功能的数据集合。
比如满足PCI协议的称为PCI事物,满足AMBA AXI协议的称为AMBA AXI事物。
是各个组件通信的基本单元。

5.2、从uvm_sequence_item扩展事物

例:
UVM笔记_第60张图片
UVM笔记_第61张图片
UVM笔记_第62张图片
UVM笔记_第63张图片

5.3、UVM field automation机制

UVM笔记_第64张图片
uvm_field_automation可以使用打印,复制,对比,记录,打包,解压等功能。
UVM笔记_第65张图片
UVM笔记_第66张图片
UVM笔记_第67张图片
在这里插入图片描述
UVM笔记_第68张图片
UVM笔记_第69张图片

六、UVM信息服务

6.1、信息服务机制

UVM笔记_第70张图片

6.2、安全等级及信息行为

UVM笔记_第71张图片
UVM笔记_第72张图片
UVM笔记_第73张图片
UVM笔记_第74张图片

七、UVM configuration

7.1、什么是UVM configuration机制

UVM笔记_第75张图片
configuration机制的特点:
1、半个全局变量,避免全局变量带来的风险
2、高层组件可以通过configuration机制实现在不改变代码的情况下更改它所包含子组件的变量
3、在各个层次上都可以使用configuration机制
4、支持通配符和正则表达式对多个变量进行配置
5、支持用户自定义的数据类型
6、可以在仿真运行的过程中进行配置

configuration的原理:
UVM configuration机制的实现由两部分组成
1、设置配置资源
2、获取配置资源

7.2、如何使用configuration

UVM笔记_第76张图片
UVM笔记_第77张图片
UVM笔记_第78张图片
用法1:
UVM笔记_第79张图片
UVM笔记_第80张图片
用法2:
UVM笔记_第81张图片
UVM笔记_第82张图片
UVM笔记_第83张图片
UVM笔记_第84张图片

用法3:
UVM笔记_第85张图片
UVM笔记_第86张图片
UVM笔记_第87张图片
UVM笔记_第88张图片
UVM笔记_第89张图片
UVM笔记_第90张图片
UVM笔记_第91张图片
UVM笔记_第92张图片
UVM笔记_第93张图片
回顾过程:
UVM笔记_第94张图片

八、UVM sequence机制

UVM笔记_第95张图片

8.1、什么是UVM sequence机制

控制和产生一系列的事物,并将事物发送给driver的一套机制。

UVM sequence将事物的产生和驱动互相分离。

8.2、UVM sequence机制的原理

sequence机制在driver、sequenc、sequencer中完成。
UVM笔记_第96张图片

8.3、如何使用UVM sequence机制

1、driver中实现 sequence机制:
UVM笔记_第97张图片
2、sequencer中实现sequence机制:
UVM已经实现sequencer全部功能,只需要拿来实现即可。

3、sequence中实现sequence机制:
UVM笔记_第98张图片
UVM笔记_第99张图片
UVM笔记_第100张图片
如果不用uvm_do宏,使用上述分解步骤完成可实现同样功能。

8.4、如何启动sequence

有两种方法:1、默认default启动 2、手动启动
UVM笔记_第101张图片
UVM笔记_第102张图片
UVM笔记_第103张图片
一般使用方法2(手动启动)

8.5、sequence机制其他知识

UVM笔记_第104张图片
UVM笔记_第105张图片
UVM笔记_第106张图片
在这里插入图片描述
UVM笔记_第107张图片

九、UVM TLM

UVM笔记_第108张图片

9.1、什么是UVM TLM

TLM -Transaction Level Model事物级建模,用于组件之间通信。

9.2、为什么要使用TLM

建立专门的通信通道,避免通信出现混乱。
各个通道独立,互不影响。

9.3、UVM TLM原理

UVM笔记_第109张图片

9.4、常用的UVM TLM port/import/export

UVM笔记_第110张图片

T:该参数代表port所要传输的transaction的类型
TMP:指定所在的component
put():是一个task,可能会阻塞当前进程直到transaction传输成功。
try_put():是一个function,不会阻塞当前进程,不管transaction传输是否完成都会立刻返回。
can_put():是一个function,不会阻塞当前进程,不会发生transaction传输,只会检查对方是否准备好了接收。
*get():同理,传输变成接收。
port和import成对使用

uvm_put_port 支持 put(),try_put(),can_put()
uvm_blocking_put_port支持put()
uvm_nonblocking_put_port 支持 try_put(),can_put()
uvm_get_port 支持 get(),try_get(),can_get()
uvm_blocking_get_port 支持 get()
uvm_nonblocking_get_port 支持 try_get(),can_get()
UVM笔记_第111张图片
export通常作为中间端口使用
UVM笔记_第112张图片
示例:
在这里插入图片描述

9.5、普通TLM端口的使用方法(PUT、GET、FIFO)

1、PUT模式
lab08
UVM笔记_第113张图片
UVM笔记_第114张图片
UVM笔记_第115张图片
UVM笔记_第116张图片
2、GET模式
lab08-a
UVM笔记_第117张图片
UVM笔记_第118张图片
UVM笔记_第119张图片
UVM笔记_第120张图片
3、FIFO模式(在PUT基础上修改)
lab08-b
UVM笔记_第121张图片
UVM笔记_第122张图片

十、UVM analysis component

lab09
analysis component:1、reference model 2、scoreboard
UVM笔记_第123张图片
实现步骤:
UVM笔记_第124张图片
UVM笔记_第125张图片
UVM笔记_第126张图片
UVM笔记_第127张图片
UVM笔记_第128张图片
UVM笔记_第129张图片
UVM笔记_第130张图片

十一、UVM callback

在这里插入图片描述

11.1、什么是UVM callback

UVM笔记_第131张图片
UVM笔记_第132张图片
UVM笔记_第133张图片
UVM笔记_第134张图片

11.2、如何使用UVM callback

UVM笔记_第135张图片
UVM笔记_第136张图片
lab10
UVM笔记_第137张图片
UVM笔记_第138张图片

UVM笔记_第139张图片
UVM笔记_第140张图片
UVM笔记_第141张图片
UVM笔记_第142张图片
前三步都为定义,第四步为实例化使用。
UVM笔记_第143张图片
UVM笔记_第144张图片
上图这个示例没有载入post_send方法(post_send也会执行),所有post_send没有任何功能。

十二、UVM Advanced

UVM笔记_第145张图片

12.1、什么是UVM sequence library

UVM笔记_第146张图片
sequence library其本质是一个sequence,相对于普通的sequence,sequence library有以下功能:
1、其他sequence可以想sequence library注册
2、可根据配置产生并且执行已经在其注册过的sequence
3、具有多种内嵌的选择sequence的算法
4、支持用户自定义的sequence选择算法
5、注册方式的多样化
UVM笔记_第147张图片
向UVM sequence library永久注册sequence
UVM笔记_第148张图片
UVM笔记_第149张图片
UVM笔记_第150张图片
UVM笔记_第151张图片

如何将sequence临时添加到UVM sequence library中
UVM笔记_第152张图片

临时注册方法1:UVM笔记_第153张图片
上图为临时添加,在不同test中控制添加对应的sequence。
临时注册方法2:
UVM笔记_第154张图片
UVM笔记_第155张图片
sequence library内置的变量,作用是控制sequence library的行为
UVM笔记_第156张图片
sequence library相关变量
UVM笔记_第157张图片
例:
UVM笔记_第158张图片
执行仿真
UVM笔记_第159张图片
UVM笔记_第160张图片
本技术在项目中使用较少。

12.2、什么是Virtual sequence

UVM笔记_第161张图片
UVM笔记_第162张图片
UVM笔记_第163张图片
代码实现:
UVM笔记_第164张图片
与普通sequencer基本没区别
UVM笔记_第165张图片
UVM笔记_第166张图片
UVM笔记_第167张图片
与普通sequence基本没区别
在env实例化它们并进行连接
UVM笔记_第168张图片
UVM笔记_第169张图片

十三、UVM寄存器抽象级-RAL

UVM笔记_第170张图片

13.1、寄存器抽象级概念

问题:
在这里插入图片描述
寄存器抽象层:
UVM笔记_第171张图片
UVM笔记_第172张图片
backdoor比较简单
UVM笔记_第173张图片

UVM笔记_第174张图片

13.2、frontdoor实现?

UVM笔记_第175张图片
UVM笔记_第176张图片

1、建模工作UVM笔记_第177张图片
UVM笔记_第178张图片
UVM笔记_第179张图片
UVM笔记_第180张图片
UVM笔记_第181张图片
接下来开始封装
UVM笔记_第182张图片
UVM笔记_第183张图片
UVM笔记_第184张图片
UVM笔记_第185张图片
UVM笔记_第186张图片

2、Adapter实现
UVM笔记_第187张图片
UVM笔记_第188张图片
UVM笔记_第189张图片

3、在env中实例化
UVM笔记_第190张图片
UVM笔记_第191张图片

4、connectUVM笔记_第192张图片
UVM笔记_第193张图片
5、API访问寄存器
UVM笔记_第194张图片

13.3、寄存器模型的基本数据结构

UVM笔记_第195张图片

14.4、寄存器模型API

1、read&write
UVM笔记_第196张图片
2、peak&poke
UVM笔记_第197张图片
3、randomize&update&mirror
UVM笔记_第198张图片
UVM笔记_第199张图片
UVM笔记_第200张图片
read&write默认一般使用前3个参数,其他使用默即可

14.5、寄存器测试sequence和内建coverage

UVM笔记_第201张图片
driver单方面驱动DUT,只能从monitor查看DUT。代码实现如下
UVM笔记_第202张图片
UVM笔记_第203张图片
内建coverage

UVM笔记_第204张图片
UVM笔记_第205张图片

你可能感兴趣的:(UVM)