这里print()函数还有个uvm_printer类型的参数,是指定我们选择的打印器类型,这个我们后面会讲,这里我们先继续讲图4中的代码,只要我们没有在`uvm_field_queue_int中指定FLAG为UVM_NOPRINT,图4中的宏`uvm_print_array_int3()就会被调用,`uvm_print_array_int3定义在uvm_printer_defines.svh
UVM中使用field_automation机制来完成这些事情。 加入了uvm_objection_utils_begin(mac_transaction)这样一句,这句话跟我们前面提到的factory机制时提到的uvm_objection_utils非常相似。事实上,这其实就是factory机制的实现。field_automation机制并不能单独使用宏来实现。 uvm_field_array_A表示的是动态数组,A表示动态数字...
uvm_field系列宏随着transaction成员变量的不同而不同,如上面的定义中出现了针对bit类型的uvm_field_int及针对 byte类型动态数组的uvm_field_array_int。 当使用上述宏注册之后,可以直接调用copy、compare、print等函数,而无需自己定义。这极大地简化了验证平台的搭建,提高了效率: //my_model.sv 26taskmy_model::m...
`defineuvm_field_array_object(ARG,FLAG) `defineuvm_field_array_string(ARG,FLAG 这里只有4种,相比于前面的uvm_field系列宏少了event类型和real类型。另外一个重要的变化是enum类型的数组里也只有两个 参数。 与静态数组相关的uvm_field系列宏有: `defineuvm_field_sarray_int(ARG,FLAG) `defineuvm_field_s...
3)uvm_field系列宏不同:uvm_field_int 对 int;uvm_field_array_int 对 byte。 2.my_model变为: task my_model::main_phase(uvm_phase phase); my_transaction tr; my_transaction new_tr; super.main_phase(phase); while(1) begin port.get(tr); ...
(uvm_object tmp_data__, \ int what__, \ string str__); \ begin \ T local_data__; /* Used for copy and compare */ \ typedef T ___local_type___; \ string string_aa_key; /* Used for associative array lookups */ \ /* Type is verified by uvm_object::compare() */ \ su...
`uvm_field_array_int(pload, UVM_ALL_ON) `uvm_field_int(crc, UVM_ALL_ON | UVM_NOPACK) `uvm_field_int(is_vlan, UVM_ALL_ON | UVM_NOPACK) `uvm_object_utils_end function new(string name = "my_transaction"); super.new();
控制打印数量的变量:在调用print函数时,最终会调用到uvm_print_array_int3宏,该宏通过uvm_print_qda_int4宏实现打印逻辑。在uvm_print_qda_int4宏中,uvm_printer与uvm_printer_knobs变量用于接收打印参数与配置信息。 配置uvm_default_printer:uvm_default_printer作为全局变量,其配置决定了打印格式。
在调用print()函数时,最终调用_m_uvm_field_automation,进一步调用uvm_print_array_int3宏。该宏通过uvm_print_qda_int4宏实现打印逻辑,对静态或动态数组、队列元素的打印格式进行统一处理。在uvm_print_qda_int4宏中,定义了uvm_printer与uvm_printer_knobs变量,用于接收打印参数与配置信息。uvm_...
我定义了一个结构:所谓RecurrentStructure就是把同一个structure反复的应用。好处就是就算输入是一个复杂...