1. 使用UVM的第一条原则: 所有的组件均派生自uvm类。
2. 类的 new函数中的两个参数(string name, uvm_component
parent)
3. uvm_info宏,3个参数 1? 2打印内容
3冗余级别UVM_HIGH/MEDIUM/LOW
uvm_fatal宏,2个参数 1? 2
打印内容
重大问题,结束仿真
4. 使用uvm `include
"uvm_macros.svh"
import uvm_pkg : : *;
5. uvm类的phase函数都有一个uvm_phase
phase参数,在真正的验证平台中,这个参数是不需要用户理会的。
6. factory机制: 自动创建一个类的实例并调用其中的函数和任务。
`uvm_component_utils(string name)
功能之一:如果在定义新类时使用了这个宏,就将这个类登记在UVM内部的一张表中
`uvm_object_utils 用于派生自uvm_object的类的注册
tb中使用run_test(string name); 根据类名创建一个实例(uvm_component_utils)的功能
创建实例 drv = my_driver::type_id::creat("drv",
this);
第一个参数为实例在uvm树中的名字,第二个参数为实例在uvm树中的父节点,因为在env中例化的,父节点为env,故写成this,表示类一级
7. objection机制:
在每个phase中,通过objection的提起和撤销来控制仿真
phase.raise_objection(this); 该语句必须在phase中第一个消耗仿真时间的语句之前,否则会退出
phase.drop_objection(this);
8. 避免绝对路径,提高可移植性 方法一: 使用宏
方法二: 使用接口(interface)
在类中使用的接口要声明virtual
9. 两种不同的层次结构 结构一:
tb_top.dut.xxx 模块(module)的例化所引入的hierachy
结构二:验证平台组件在run_test中的例化引入,如uvm_test_top.drv
10. config_db机制:由于层次结构的不同,类中使用的virtual
interface不能直接与tb中的接口相连, 使用config_db机制来进行连接
在tb中set:
uvm_config_db# (virtual my_if) : : set(null, "uvm_test_top.drv",
"vif", input_if);
在类的build_phase中get: uvm_config_db#(virtual my_if)
: : get(this, "uvm_test_top.drv", "vif", vif);
也可以传递数据
tb: uvm_config_db# (int) : : set(null,
"uvm_test_top.drv", "var", 10);
class:
uvm_config_dv# (int) : : get(this, "uvm_test_top.drv", "var",
var);
set
与get函数的第三个参数一定要一样
11. transaction : 验证平台各组件间信息传递的基本形式,
类似于数据包
一定要从uvm_sequence_item派生,才可以使用UVM的Sequence机制
12. driver的功用: 将激励信号驱动到DUT的端口上
13. env:容器类, env 实例化在uvm中,在env中实例化driver、monitor、reference
model和scoreboard
14. run_test 如何自动实例化一个类? 在tb中使用如下语句:
initial
begin
run_test("my_env");
end
my_env is the class name
run_test自动创建的实例名字为uvm_test_top
15. monitor: 从DUT端口收集数据,打包成transaction,发送给reference
module和scoreboard
16. agent: 在其中封装monitor与driver
uvm_agent中有一个成员变量is_active,取值为UVM_PASSIVE和UVM_ACITVE,
可以控制agent中是否实例化driver。因为在输出端口处的agent不需要driver
17. 创建实例要在build_phase中执行。 build_phase执行从树根到树叶的顺序
加载中,请稍候......