不同的 UVM 包装方法之间有什么区别?

What are the differences between different UVM packing approaches?

我想知道使用这两个有什么区别

function void do_pack(uvm_packer packer);
  super.do_pack(packer); 
  packer.pack_field_int(correct_data_in,$bits(correct_data_in));
  packer.pack_field_int(valid_in,$bits(valid_in));
endfunction

function void do_pack(uvm_packer packer);
  super.do_pack(packer); 
  `uvm_pack_intN(correct_data_in);
  `uvm_pack_intN(valid_in);
endfunction

如果我们不 pack/unpack 信号并直接将它们驱动到 DUT 会怎样?

此外,我们什么时候使用 pack() 和 do_pack()。有人可以举例说明吗

通常在总线协议中,您将拥有大量关于特定总线事务的数据,因此很难从该总线事务中提取特定字段值。

因此您在更高级别上使用 classes,这样通过使用不同的字段,您可以轻松控制这些字段的值。

但在真实的硬件中,一切都按照位模式进行,因此您需要根据您的协议将 class 字段转换为有效的位模式,并沿着总线传输它们。

为此,您需要 packunpack 方法。您 pack 在发射端填充,unpack 在接收器端填充。