您不能在音序器中执行此操作,因为发送项目分两步执行:start_item(...)
和finish_item(...)
. 如果它只是一种方法,你可以在那里完成。
IMO,要走的路是实施分层方案。您的上层是您开始序列的地方,您不关心事务的长度。您的第二层是最大长度为 4K 的层。交易流程将是:
你的序列 -> 上序列器 -> 翻译序列 -> 总线序列器 -> 驱动程序
这意味着在您的代理中,您将需要两个定序器,其中只有一个连接到驱动程序。翻译序列可能如下所示:
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的文章。