UVM基础 | UVM笔记 1

Posted by Kion on January 28, 2020

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被调用。