在 UVM 中打包对象并传递给驱动程序
Packing of object and passing to driver in UVM
我对 UVM 很陌生。请指导我一个关于如何使用驱动程序打包数据包成员并将其传递给驱动程序 DUT 接口的好例子。到现在一直在做without pack,分享Driver的代码片段(运行阶段)
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
我不想做drive_item,而是想先打包对象,然后在驱动程序中调用do_pack将其传递给接口,但不确定如何做。我的 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 函数的一个很好的例子对我来说就足够了。这只是为了练习。
您必须实例化一个 uvm_packer object (and probably also set its endianness property)。一旦你这样做了,你应该能够将你的 Packet
class 对象打包成一个位数组。然后您可以将生成的位数组传递给您必须添加到 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/
重要的是要注意 packing/unpacking 与您决定如何在测试台中驱动 RTL 信号无关。打包只是将 uvm_object
转换为位数组的一种方式。这与您为驱动信号而可能选择的策略不同。您可以在驱动程序中有一个 drive_item
任务,或者您可以在接口中调用一个任务并从那里驱动信号(后一种方法在将测试台移植到仿真平台时有一些好处)。
我对 UVM 很陌生。请指导我一个关于如何使用驱动程序打包数据包成员并将其传递给驱动程序 DUT 接口的好例子。到现在一直在做without pack,分享Driver的代码片段(运行阶段)
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
我不想做drive_item,而是想先打包对象,然后在驱动程序中调用do_pack将其传递给接口,但不确定如何做。我的 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 函数的一个很好的例子对我来说就足够了。这只是为了练习。
您必须实例化一个 uvm_packer object (and probably also set its endianness property)。一旦你这样做了,你应该能够将你的 Packet
class 对象打包成一个位数组。然后您可以将生成的位数组传递给您必须添加到 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/
重要的是要注意 packing/unpacking 与您决定如何在测试台中驱动 RTL 信号无关。打包只是将 uvm_object
转换为位数组的一种方式。这与您为驱动信号而可能选择的策略不同。您可以在驱动程序中有一个 drive_item
任务,或者您可以在接口中调用一个任务并从那里驱动信号(后一种方法在将测试台移植到仿真平台时有一些好处)。