目录
2.2 只有drv的验证平台
2.2.1最简单的验证平台
使用uvm的第一条原则:验证平台中所有的组件应该派生自uvm中的类。
driver = new("driver",this);
new函数中要求指明两个参数:name和parent
可以简单的认为实现一个driver等于实现其main_phase
`uvm_info("my_driver","data is drived",UVM_LOW);
有三个参数:
第一个是字符串 ,用于信息归类
第二个是字符串,用于打印的内容
第三个是冗余级别,冗余度越低,越重要,越会被打印。
2.2.2加入factory机制
`uvm_component_utils(my_driver)
通过使用上述宏命令将driver登记在uvm内部的一个表中
这张表是factory实现的基础
run_test("driver");
run_test会创建一个driver实例,并且自动调用其main_phase函数
请记住:所有派生自uvm_component机器派生类的类都应该使用 `uvm_component_utils注册
2.2.3加入objection机制
uvm中通过objection机制类控制验证平台的关闭
在函数(一般是main_phase函数)内使用
task main_phase(uvm_phase phase);
phase.raise_objection(this);
......
phase.drop_objection(this);
endtask
raise_phase必须在main_phase中第一个消耗仿真时间的语句之前
2.2.4加入virtual interface
消除绝对路径,提高代码可重用性和可移植性
使用config_db将top_tb 中的 inf 和 验证平台的 v_inf 对应起来
uvm_config_db#(virtual my_if)::set(null,"uvm_test_top","vif",input_if);
uvm_config_db#(virtual my_if)::get(this,"","vif",vif);
uvm_config_db:
set和get都有四个参数:
前两个参数是字符串,代表发送到的位置,
第三个参数是标志位,set和get必须保持一致
第四个参数:在set中表示传递的值(内容),在get中表示接收值的变量;
2.3为验证平台加入各种组件
2.3.1加入transaction
transaction使用 `uvm_object_utils 宏进行注册
这表明transaction和是driver不一样的uvm类
post_randomize()函数是SV提供的一个回调函数,当randomize()函数被调用后,会无条件调用该函数。
2.3.2加入env
run_test()虽然强大,但是只能例化一个实例
run_test()相当于在top_tb结构层次之外建立一个新的结构层次
在此基础上,为了存储众多的组件类,新建一个容器类env
new()函数的两个参数:name,parent;就有用了
name表示名字,parent表示父节点,实现路径的传递