我对UVM很新。请指导我如何使用驱动程序打包数据包成员并将其传递给驱动程序DUT接口。直到现在,我一直在做无包装,并分享驱动程序的代码废料(运行阶段)
task run_phase(uvm_phase phase);
begin
Packet simple_seq;
forever begin
seq_item_port.get_next_item(simple_seq);
drive_item(simple_seq);
seq_item_port.item_done();
end
endtask
task drive_item(input Packet pkt)
begin
@(dut_if.master_cb);
dut_if.master_cb.Data_in_08p <= pkt.correct_data_in;
dut_if.master_cb.Data_valid_08p <= pkt.valid_in;
end
endtask
我想首先打包对象然后在驱动程序中调用do_pack而不是执行drive_item,而是将其传递给接口,但不知道该怎么做。我的do_pack函数是
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 : do_pack
关于驱动程序如何使用这个do_pack函数的一个很好的例子就足够了。这只是为了练习。
答案 0 :(得分:1)
您必须实例化uvm_packer对象(并且可能还设置其endianness property)。一旦这样做,您应该能够将Packet
类对象打包到位数组中。然后,您可以将生成的位数组传递给您必须添加到SystemVerilog接口的任务。
task run_phase(uvm_phase phase);
uvm_packer packet_packer;
bit bitstream[];
int num_bits;
packet_packer = new;
packet_packer.big_endian = 0;
begin
Packet simple_seq;
forever begin
seq_item_port.get_next_item(simple_seq);
num_bits = simple_seq.pack( bitstream, packet_packer );
dut_if.drive( bitstream );
//drive_item(simple_seq);
seq_item_port.item_done();
end
endtask
task drive_item(input Packet pkt)
begin
@(dut_if.master_cb);
dut_if.master_cb.Data_in_08p <= pkt.correct_data_in;
dut_if.master_cb.Data_valid_08p <= pkt.valid_in;
end
endtask
在我上面显示的代码中,num_bits
只是一个虚拟变量,用于存储已打包的位数。接口中的drive
任务看起来与此类似(假设correct_data_in
为4位宽,valid_in
为1位信号):
task drive ( bit bitstream[] );
@(master_cb);
Data_in_08p <= { bitstream[3], bitstream[2], bitstream[1], bitstream[0] };
Data_valid_08p <= bitstream[4];
endtask : drive
这里提供了关于uvm“do”挂钩工作方式(包括do_pack
)的一个很好的解释:
http://cluelogic.com/2013/01/uvm-tutorial-for-candy-lovers-do-hooks/
重要的是要注意打包/拆包与您决定如何在测试平台中驱动RTL信号无关。打包只是将uvm_object
转换为位数组的一种方法。这与您为驱动信号而选择的策略不同。您可以在驱动程序中执行drive_item
任务,也可以在界面中调用任务并从那里驱动信号(后一种方法在将测试平台移植到仿真平台时有一些好处。)