你不能這樣做的序,因爲發送的項目在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。
非常感謝讓我知道這種方法。我試過了,它確實有效。當頂級序列等待來自驅動程序的get_response()時,我遇到了一些問題。由於req的「m_sequencer」是upper_sequencer本身,因此在內部翻譯序列中使用req from get_next_item()會導致無限循環。所以我不得不使用「some_trans」(克隆)而不是「請求」。我修改了下面的翻譯序列中的一些行,並將其添加到我的代碼的編輯部分。 – sundar 2014-11-24 09:09:01
很高興聽到它!我在EDAPlayground上自己嘗試過,並且遇到了無限循環,但是我沒有弄清楚爲什麼。感謝提示。 – 2014-11-24 13:07:25