在 UVM 验证平台中,打印 transaction(事务)通常需要结合 UVM 的打印机制和事务的自定义信息输出。以下是常用的实现方法:
基础方法:使用 uvm_info 配合 sprint()
transaction 通常继承于 uvm_sequence_item,而 uvm_sequence_item 提供了 sprint() 方法,可将事务的字段信息格式化为字符串。结合 uvm_info 打印:
// 在序列或驱动中打印 transaction
class my_sequence extends uvm_sequence#(my_transaction);`uvm_object_utils(my_sequence)virtual task body();my_transaction trans;trans = my_transaction::type_id::create("trans");// 随机化或赋值事务字段assert(trans.randomize());// 打印事务:使用 sprint() 转换为字符串`uvm_info("SEQ", $sformatf("发送事务:\n%s", trans.sprint()), UVM_LOW)// 发送事务(示例)start_item(trans);finish_item(trans);endtask
endclass
- trans.sprint():返回事务所有字段的格式化字符串(包含字段名和值)。
- 输出效果类似:
UVM_INFO SEQ (my_sequence.sv:10) [SEQ] 发送事务:
my_transaction@1234 {addr: 32'h1000_0000data: 32'h1234_5678wr_en: 1'b1...
}
自定义打印格式:重写 do_print() 方法
如果需要自定义事务的打印内容(如筛选字段、调整格式),可以在 transaction 类中重写 do_print() 方法:
class my_transaction extends uvm_sequence_item;rand bit [31:0] addr;rand bit [31:0] data;rand bit wr_en;`uvm_object_utils_begin(my_transaction)`uvm_field_int(addr, UVM_DEFAULT)`uvm_field_int(data, UVM_DEFAULT)`uvm_field_int(wr_en, UVM_DEFAULT)`uvm_object_utils_endfunction new(string name = "my_transaction");super.new(name);endfunction// 重写 do_print() 自定义打印格式virtual function void do_print(uvm_printer printer);super.do_print(printer); // 保留默认打印(可选)// 添加自定义打印内容printer.print_string("操作类型", wr_en ? "写" : "读");printer.print_field("地址", addr, 32, UVM_HEX); // 显式指定位宽和格式printer.print_field("数据", data, 32, UVM_HEX);endfunction
endclass
重写后,trans.sprint() 会包含自定义内容,打印更直观。
简化打印:使用 uvm_transaction 的 print() 方法
uvm_sequence_item 继承于 uvm_transaction,自带 print() 方法可直接打印事务信息(内部调用 sprint()):
trans.print(); // 直接打印事务,等效于 `uvm_info(..., trans.sprint(), ...)
该方法会自动输出事务的类型、名称和字段信息,无需手动拼接字符串。
