UVM实战 卷I学习笔记14——OVM到UVM的迁移


对等的迁移

UVM从OVM衍生而来,因此UVM几乎完全继承OVM所有特性。从OVM到UVM的迁移,很大程度上只是ovm前缀到uvm前缀的变更。所有ovm_xxx宏都可以变更到uvm_xxx宏。ovm_component变更为uvm_component,ovm_object变更为uvm_object。关于前缀的变更,UVM在其发行包中提供一个名为ovm2uvm.pl的perl脚本,使用它轻松完成替换。不过通常该脚本并不完美,使用它替换完成后总会出现一些编译错误。

UVM与OVM的phase名称不一样UVM都是以xxxx_phase命名,OVM并没有_phase的后缀。另外,UVM在每个phase函数/任务中都有一个类型为uvm_phase、名字为phase的参数,OVM并没有相应参数。

OVM配置参数使用set_config_xxx/get_config_xxx的方式,UVM依然支持这种设置方式。不过也可将它们升级为UVM专用的config_db的形式

一些过时的用法

虽然UVM继承了OVM所有用法,但在这些用法中,UVM对其中一些进行了升级,从而使原先的用法过时了。本节讲述这些过时的用法。

*sequence与sequencer的factory机制实现

在某些UVM验证平台中,sequencer的定义采用如下的方式:

class my_sequencer extends uvm_sequencer #(my_transaction);
	function new(string name, uvm_component parent);
		super.new(name, parent);
		`uvm_update_sequence_lib_and_item(my_transaction)
	endfunction
	`uvm_sequencer_utils(my_sequencer)
endclass

而sequence的定义使用如下的方式:

class case0_sequence extends uvm_sequence #(my_transaction);
	my_transaction m_trans;
	`uvm_sequence_utils(case0_sequence, my_sequencer)
	…
endclass

这两种方式都是继承自OVM的用法。通过使用宏uvm_sequence_utils实现sequence的factory机制注册,还把每个sequence和sequencer绑定在一起。这种绑定的本质是向my_sequencer内部的一个静态数组中加入了所有的sequence。通过绑定之后就可实现从所有sequence中随机选取一个进行执行功能。这一点类似于前面讲述的sequence library,但功能远远没有sequence library强大。sequence及sequencer注册方式的变更是UVM对OVM最大的改变之一

如果采用上述的方式进行sequence及sequencer的定义,那么UVM会给出三条警告信息:

UVM_WARNING /home/landy/uvm/uvm-1.1d/src/seq/uvm_sequencer_base.svh(1436) @ 0: uvm_test_top.env.i_agt.
sqr [UVM_DEPRECATED] Registering sequence 'uvm_random_sequence' with sequencer 
'uvm_test_top.env.i_agt.sqr' is deprecated.
UVM_WARNING /home/landy/uvm/uvm-1.1d/src/seq/uvm_sequencer_base.svh(1436) @ 0: uvm_test_top.env.i_agt.
sqr [UVM_DEPRECATED] Registering sequence 'uvm_exhaustive_sequence' with sequencer 
'uvm_test_top.env.i_agt.sqr' is deprecated.
UVM_WARNING /home/landy/uvm/uvm-1.1d/src/seq/uvm_sequencer_base.svh(1436) @ 0: uvm_test_top.env.i_agt.
sqr [UVM_DEPRECATED] Registering sequence 'uvm_simple_sequence' with sequencer 
'uvm_test_top.env.i_agt.sqr' is deprecated.

这里uvm_random_sequence就是实现类似于UVM_SEQ_LIB_RAND算法的功能。UVM明确提出这种用法已经过时了。虽然UVM现在依然支持这种用法,但UVM不保证在将来依然会支持。所以尽量将这种方式升级为UVM的注册方式,新方式去除了将sequence加入到sequencer的静态数组的功能,从而不能从所有sequence中随机选择一个进行启动。如果依然想使用这种功能,可参考前面的sequence library。

sequence的启动与uvm_test_done

OVM时代使用如下方式设置default_sequence:

function void my_case0::build_phase(uvm_phase phase);
	super.build_phase(phase);
	set_config_string("env.i_agt.sqr", "default_sequence", 
					"case0_sequence");
endfunction

sequence名字以字符串形式传递给sequencer,sequencer根据名字调用factory机制的creat_object_by_name函数创建sequence的实例,并执行此sequence,该过程在run_phase中进行。UVM丢弃了这种启动sequence方式。与这种启动sequence方式对应的是objection控制机制

class case0_sequence extends uvm_sequence #(my_transaction);
	…
	virtual task body();
		uvm_test_done.raise_objection(this);
		repeat (10) begin
			`uvm_do(m_trans)
		end
		#100;
		uvm_test_done.drop_objection(this);
	endtask
	`uvm_sequence_utils(case0_sequence, my_sequencer)
endclass

uvm_test_done是一个全局变量。在OVM由于只有一个run_phase,没有其他如main_phase等动态运行的phase,所以uvm_test_done已足够控制运行。但UVM分成多个动态运行的phase,各有自己的objection控制,所以应改用starting_phase来控制objection

*手动调用build_phase

UVM按照phase控制验证平台的运行,各个phase自动执行,不需要手工的干预。但由于各种原因,有一些从OVM继承的代码会出现手工调用build_phase的情况:

function void base_test::build_phase(uvm_phase phase);
	super.build_phase(phase);
	env = my_env::type_id::create("env", this);
	env.build_phase(phase);
endfunction

上述代码在实例化env后手工调用env的build_phase。OVM允许这种用法,不会给出任何错误或警告信息。但在UVM环境会给出如下警告信息:

UVM_WARNING @ 0: uvm_test_top.env [UVM_DEPRECATED] build()/build_phase() has been called explicitly,
outside of the phasing system. This usage of build is deprecated and may lead to unexpected behavior.

因此,应明确去除这种用法。UVM的phase运行机制是自成一体的。这种用法会破坏掉这种自成一体的结构,并可能带来某些不可预知的结果

消除这种用法并不容易,其出现的原因通常是验证平台的高层(base_test)必须依赖于低层(env)中某些函数或功能的实现。如想在base_test的build_phase中对env.i_agt某个成员变量进行赋值,而i_agt是在env的build_phase中实例化,所以必须在base_test手动调用env的build_phase。要去除这种用法,需要合理规划整个验证平台中的相关函数的执行时间,没有统一的解决方案

纯净的UVM环境

除上面讲述的一些过时的用法外,还有另一些过时的用法。但那些用法的应用并不多,因此这里不再讲述。

如果想获得一个纯净的UVM环境,完全丢弃这些过时的用法,可以在编译UVM库的时候加入一个宏UVM_NO_DEPRECATED

`define UVM_NO_DEPRECATED

或者使用命令行的方式:

<compile command> +define+UVM_NO_DEPRECATED

建议在搭建自己验证平台时加入这个宏,以使搭建的验证平台完全符合UVM的规范。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值