| ||
替换OVM configuration方法
习惯于OVM配置方法的用户,在配置过程中都使用的是[set,get]_config_[int,string,object]来在组件层次中实现配置,尽管在UVM中这些方法仍然有效,但我们并不建议再使用旧有的方法,原因有二。第一是,原来在OVM中并不支持interface通过配置的方式直接传递interface,也因为这一种限制使得interface不得不找到其它的ovm_object wrapper来将其二次包装继而通过object的配置方式实现接口传递,这种传递也是OVM的配置中为人诟病的一个地方,在UVM中interface也被纳入了uvm_config_db传递的可行参数中,与UVM的配置方式完全兼容了;第二是,在以前set_config与get_config的配置不是成对出现的,这增加了UVM新手的调试难度,如果一些域已经通过OVM宏注册,那么就可以通过隐性的方式获取上层的配置数值,尽管这一点在UVM中也保留下来了,但我们依然建议通过uvm_config_db::set/get的方式来实现成对的配置,这使得配置的方式易于学习和调试。下面是分别是OVM和UVM的配置方式:
OVM set/get config配置方式
class my_env extends ovm_env;
...
function void build();
ahb_cfg = ahb_config::type_id::create("ahb_cfg");
ahb_cfg.width = 16; // set additional fields
set_config_object("*","ahb_cfg",ahb_cfg);
endfunction
...
endclass
class my_ahb_agent extends ovm_component;
...
function void build();
ovm_object cfg;
ahb_config my_cfg;
assert(get_config_object("ahb_cfg",cfg,0);
if (!$cast(my_cfg, cfg)) ovm_report_error(...);
...
endfunction
...
endclass
UVM config_db set/get配置方式
class my_env extends uvm_env;
...
function void build();
ahb_cfg = ahb_config::type_id::create("ahb_cfg");
ahb_cfg.width = 16; // set additional fields
uvm_config_db#(ahb_config)::set(
this,"ahb_agent","ahb_cfg",ahb_cfg);
endfunction
...
endclass
class my_ahb_agent extends uvm_component;
...
function void build();
ahb_config my_cfg;
if (!uvm_config_db::ahb_config::get(
this,"","ahb_cfg",my_cfg);
`uvm_error(...)
...
endfunction
...
endclass
添加UVM的新特性
另外到了添加UVM新特性的部分,用户需要考虑修改下面的这些部分(但不是必须):
将OVM中的信息报告部分中的函数ovm_report_info/warning/error/fatal替换为宏`uvm_info/warning/error/fatal。这一点建议我们在之前的UVM宏比较中提到过,考虑到后者宏的性能更好,我们建议用户使用信息报告宏的方式。
在上一个步骤的配置替换中,我们也提到了,尽管OVM中interface的传递通过object进行二次封装可以实现,但由于其复杂度在UVM中不再需要,因此在允许的情况下用户可以考虑使用config_db来简化interface的传递。
此外关于sequence和sequencer的使用,从OVM到UVM的迁移中也有很多的变化。譬如下面这些关键词已经在UVM中被废止:
OVM sequence宏:
ovm_sequencer_utils
ovm_sequencer_param_utils
ovm_sequence_utils
ovm_declare_sequence_lib
ovm_update_sequence_lib
ovm_sequence_lib_and_item
OVM内建sequence:
ovm_random_sequence
ovm_exhaustive_sequence
ovm_simple_sequence
OVM sequence API方法:
seq_kind
num_sequences
get_seq_kind