2017-03-04 66 views
0

我对UVM非常陌生。请指导我一个关于如何使用驱动程序打包数据包成员并将其传递给驱动程序DUT接口的很好例子。直到现在,我一直在做没有包和共享驱动器的代码废料(运行阶段)对象的包装和传递给UVM中的驱动程序

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功能就能满足我一个很好的例子。这只是为了练习。

回答

1

你将不得不实例化一个uvm_packer对象(也可能设置它的endianness property)。一旦你这样做了,你应该能够把你的类对象打包成一个位数组。然后,您可以将得到的位数组传递给您必须添加到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_pack)在这里提供:

http://cluelogic.com/2013/01/uvm-tutorial-for-candy-lovers-do-hooks/

需要注意的是打包/解包什么都没有做与你决定如何推动RTL信号在测试平台是非常重要的。包装只是一种将uvm_object转换为位阵列的方法。这与您为了驱动信号而选择的策略不同。您可以在驱动程序中安装drive_item任务,也可以调用接口中的任务并从中驱动信号(在将测试平台移植到仿真平台时,后一种方法具有一些优势)。

+0

因此,1)不使用UVM_NOPACK和直接驱动信号到接口和2)使用UVM_NOPACK和do_pack函数有什么区别? –

+0

另外,这里num_bits的用途是什么? –

+0

能否请您详细说明驱动器任务,比如在打包到比特流后应该在rhs上应该如何处理[],即@(dut_if.master_cb); dut_if.master_cb.Data_in_08p <= ?? –

相关问题