2014-11-21 56 views
2

我想抓住我的uvm_sequencer的run_phase中的事務來檢查事務是否跨越4KB邊界。如果它們跨越4KB邊界,我想將該事務分成多個事務,然後將其發送給驅動程序。當從驅動程序接收到響應時,所有拆分事務響應應合併回原始事務並返回到生成原始事務的序列。有沒有辦法做到這一點? uvm_sequencer是做這份工作的好地方嗎?任何幫助將不勝感激。UVM_Sequencer運行階段內抓取事務

編輯:

都鐸王朝的解決方案確實有效。我添加了幾個編輯一行代碼(translation_sequence)如下:

up_sequencer.get_next_item(req); 
$cast(up_trans, req.clone()); 
// do the splitting. 
start_item(up_trans); 
finish_item(up_trans); 
up_sequencer.item_done(); 
get_response(rsp); 
rsp.set_sequence_id(req.get_sequence_id()); 
up_sequencer.put_response(rsp); 

回答

2

你不能這樣做的序,因爲發送的項目在2個步驟進行:start_item(...)finish_item(...)。如果只有一種方法,你可以在那裏完成。

要走的路,國際海事組織,是實施分層方案。你的上層是你開始序列的地方,你不關心交易的長度。你的第二層是最大長度爲4K的那一層。交易的流程是:

您的序列 - >上序 - >翻譯序列 - >總線序列 - >司機

這意味着,在你的代理,你需要2個序列發生器,其中只有一個是連接到驅動程序。阿譯序列可能是這樣的:

class translation_sequence extends uvm_sequence #(some_trans); 
    uvm_sequencer #(some_trans) up_sequencer; 

    task body(); 
    while (1) begin 
     some_trans up_trans; 
     up_sequencer.get_next_item(up_trans); 

     if (up_trans.size <= 4096) begin 
     `uvm_info("SPLIT", "No need to split", UVM_LOW); 
     start_item(up_trans); 
     finish_item(up_trans); 
     end 
     else begin 
     // implement the splitting 
     int unsigned size = up_trans.size; 

     while (1) begin 
      req = new(); 
      req.size = size > 4096 ? 4096 : size; 
      start_item(req); 
      finish_item(req); 

      if (size < 4096) 
      break; 
      else 
      size -= 4096; 
     end 
     end 

     up_sequencer.item_done(); 
    end 
    endtask 
endclass 

請注意,它有一個指針到上一級序,並從中獲取項目,標誌着其完成。在代理,需要啓動這個程序,也給它的指針上序:

class some_agent extends uvm_agent; 
    //... 

    // start the translation sequence 
    task run_phase(uvm_phase phase); 
    translation_sequence seq = new(); 
    seq.up_sequencer = sequencer; 
    seq.start(bus_sequencer); 
    endtask 
endclass 

如果您想了解更多的層次感,看看這篇文章Verification Horizons

+0

非常感謝讓我知道這種方法。我試過了,它確實有效。當頂級序列等待來自驅動程序的get_response()時,我遇到了一些問題。由於req的「m_sequencer」是upper_sequencer本身,因此在內部翻譯序列中使用req from get_next_item()會導致無限循環。所以我不得不使用「some_trans」(克隆)而不是「請求」。我修改了下面的翻譯序列中的一些行,並將其添加到我的代碼的編輯部分。 – sundar 2014-11-24 09:09:01

+0

很高興聽到它!我在EDAPlayground上自己嘗試過,並且遇到了無限循環,但是我沒有弄清楚爲什麼。感謝提示。 – 2014-11-24 13:07:25