对象的包装和在UVM中传递给驱动程序

时间:2017-03-04 08:37:12

标签: system-verilog uvm

我对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函数的一个很好的例子就足够了。这只是为了练习。

1 个答案:

答案 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任务,也可以在界面中调用任务并从那里驱动信号(后一种方法在将测试平台移植到仿真平台时有一些好处。)