2017-03-04 63 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 <= ?? –

相關問題