UVM-实验2

sv环境转换到uvm环境中时,有一些重要的改变发生。

1、clone()函数的调用需要类型转换

 比如在chal_pkg中的do_drvie()方法里调用clone()函数
SV环境下,不需要类型转换,因为自定义的clone()函数已经指定了返回类型为chnl_trans;
UVM环境下,需要类型转换,因为clone()是核心基类的方法,返回类型是UVM_object,子类对象调用clone()函数返回的是父类句柄(指向子类对象的父类句柄),想要使用子类成员就需要类型转换(父 -> 子);
 

// SV中直接进行过clone
rsp = req.clone();

// UVM中需要进行转化
chnl_trans extends uvm_sequence_item;
chnl_trans req, rsp;
void'($cast(rsp, req.clone()));

2、端口类

 不是object类,也不是component类,而是uvm_void,创建的时候要用new(),而不是type_id::create();

3、创建对象放在new()中还是build_phase()

用new()创建对象可以放在function new()中,也可以放在build_phase中;
用type_id::create()创建对象只能放在build_phase中;
在创建组件的时候,一定要用type_id::create(),提供override的可能,还可以实现字符串的层次化建议把配置放在创建之前;
 

4、 mcdf_pkg里对象的创建和连接

SV环境下,将创建和连接都放在new()里;
UVM环境下,普通创建放在new()里,type_id::create()创建放在build_phase里,组件之间的连接放在connect_phase里;

5、test中添加virtual interface

先在test层build_phase中用config_db::get()到interface的指针,再在connect_phase中调用set_interface将接口set给各个组件

6、 tb中不能用set_interface()

如果想要用set_interface(),就要下面1这样,前提是base_test已经创建了,但实际上base_test()还没有被创建,等到run_test()才会被创建。

base_test.set_interface(vif);
run_test();

如果想下面2这样,先创建环境,然后再set_interface(),也是不行的,run_test()的时候确实在创建环境,创建的同时也会调用各自环境的build_phase,connect_phase,结果不能找的interface的指针。 

run_test();
base_test.set_interface(vif);

所以在创建环境之前得先用config_db::set()把interface的指针set到test层 

uvm_config_db#(virtual intf)::set();
run_test();

 

7、 组件的phase自动执行

SV环境下的run()是上层调用下层,显式“点火”
UVM环境下的run_phase()平行“点火”,因为uvm_root在一层层构建组件的时候也构建了层次,就可以得到所有的组件层次和句柄

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值