uvm_component与uvm_object
uvm_object是最基础的类;uvm_component派生自uvm_object。uvm_component能够在new时指定parent参数来形成一种树形结构,另外还具有phase的自动执行特点。
派生自uvm_object的类 | 派生自uvm_component的类 |
---|---|
uvm_sequence_item(派生自uvm_transaction) | uvm_driver |
uvm_sequence | uvm_monitor |
config | uvm_sequencer |
uvm_scoreboard | |
uvm_agent | |
uvm_env | |
uvm_test |
与uvm_object相关的宏 | 与uvm_component相关的宏 |
---|---|
uvm_object_utils;uvm_object_param_utils(用于注册到factory中) | uvm_component_utils;uvm_component_param_utils |
uvm_object_utils_begin/end(用于使用field automation机制) | uvm_component_utils_begin/end |
uvm_component由于作为uvm树的结点,失去了uvm_object的一些特征,比如不能使用clone函数。但可以使用copy函数。因为clone函数传入的是指针,复制后无法确定parent参数。copy函数传入的是已经指定好parent的实例。
当parent参数被设置成null时,其parent就是uvm_root实例uvm_top。与parent有关的一些函数:
extern virtual function uvm_component get_parent();
extern virtual function uvm_component get_child(string name);/*指定name得到child*/
extern function void get_children (ref uvm_component children[$]);/*得到所有children*/
extern function int get_num_children();/*children个数*/
field automation 机制
filed automation机制提供了一些方便的函数,比如copy,compare等,可以提高效率。在使用前,需要注册字段,比如:
`define uvm_field_int(ARG,FLAG)
`define uvm_field_real(ARG,FLAG)
注册字段时,可以使用一些参数,控制字段是否参与某些函数的使用。
`uvm_field_int(crc_err, UVM_ALL_ON | UVM_NOPACK)
/*
之所以用这种奇怪的方式(|),是因为UVM_ALL_ON是一个17bit的数字;
某位为高,则相应的函数启用,nopack在第10位,UVM_NOPACK为第10位为1的数字,与UVM_ALL_ON相或后,代表nopack启用,该字段不参与pack函数。
*/
注册字段时也可与if连用,开启关闭某些字段的注册。
常用的一些函数有:
extern function void copy (uvm_component rhs);
extern function bit compare (uvm_object rhs, uvm_comparer comparer=null);
extern function int pack_bytes (ref byte unsigned bytestream[], input uvm_packer packer=null);
extern function int unpack_bytes (ref byte unsigned bytestream[], input uvm_packer packer=null);
UVM中打印信息的控制
设置打印信息的冗余度阈值,默认为UVM_MEDIUM,指低于等于该级别的信息都会打印出来,显然设置级别越高,显示的信息会越多。
env.i_agt.set_report_verbosity_level(UVM_HIGH); /*设置某个特定component冗余度阈值*/
env.i_agt.set_report_verbosity_level_hier(UVM_HIGH); /*i_agt其下所有component生效*/
env.i_agt.set_report_id_verbosity("ID1",UVM_HIGH); /*ID1信息的冗余度阈值*/
<sim command> +UVM_VERBOSITY = UVM_HIGH
<sim command> +UVM_VERBOSITY = HIGH /*命令行中设置冗余度阈值,整个验证平台有效*/
UVM具有四种信息严重性:UVM_INFO、UVM_WARNING、UVM_ERROR、UVM_FATAL。四种信息可以互相重载。
env.i_agt_drv.set_report_severity_override(UVM_WARNING,UVM_ERROR); /*把所有的warning信息显示为error*/
env.i_agt_drv.set_report_severity_id_override(UVM_WARNING,"my_driver",UVM_ERROR);/*单独设置某id*/
<sim command> +uvm_set_severity=<comp>,<id>,<current severity>,<new severity>
可以设置UVM_ERROR出现次数以停止仿真。
set_report_max_quit_count(5);
<sim command> +UVM_MAX_QUIT_COUNT=6,NO /*NO表示不能被后续设置语句覆盖*/
env.i_agt.set_report_severity_action(UVM_WARNING,UVM_DISPLAY|UVM_COUNT); /*把warning信息加入计数,同样也可以不对error计数*/
env.i_agt.set_report_id_severity_action("my_drvr",UVM_WARNING,UVM_DISPLAY|UVM_COUNT); /*设置某id计数*/
可以设置断点,停止仿真,进入交互模式。
env.i_agt.drv.set_report_severity_action(UVM_WARNING,UVM_DISPLAY|UVM_STOP);/*drv中出现warning信息即停止仿真*/
可以把信息导出到文件中
UVM_FILE info_log;
info_log = $fopen("info_log","w");
env.i_agt.drv.set_report_severity_file(UVM_INFO,info_log);
env.i_agt.drv.set_report_severity_action(UVM_INFO,UVM_DISPLAY|UVM_LOG);
UVM内部控制打印信息的行为与上面提到的filed automation机制的函数使用类似。把UVM_DISPLAY定义成一个多比特整数,然后与某些参数相或,以开启关闭相应功能。
config_db 机制
使用get_full_name()可以获得该component的路径。
config_db机制用于在UVM验证平台中传递参数。它们一般成对出现,set发送参数,get接收。
uvm_config_db#(int)::set(this,"env.i_agt.drv","pre_num",100);
uvm_config_db#(int)::get(this,"","pre_num",pre_num);
/*set,get第一个参数是uvm_component的指针,前两个参数组成的就是component的路径;第三个参数就是配对的标识,第四个参数就是要传递的参数*/
对于跨层次的多次set,则get函数得到的参数遵循层次优先原则,层次越高,参数优先级别越高,若层次相同,则比较接收时间,越接近get函数,则优先级别越高。
check_config_usage可以检查哪些参数设置过但没有被获取过。一般在connect_phase被调用。