start_item(...)
アイテムの送信はとの 2 つのステップで実行されるため、シーケンサーでこれを行うことはできませんfinish_item(...)
。たったひとつの方法なら、そこまでできたのに。
進むべき道、IMOは、階層化スキームを実装することです. 上位レイヤーは、シーケンスを開始するレイヤーであり、トランザクションの長さは気にしません。2 番目のレイヤーは、最大長が 4K のレイヤーです。トランザクションの流れは次のようになります。
あなたのシーケンス -> 上位シーケンサー -> 変換シーケンス -> バス シーケンサー -> ドライバー
これは、エージェントに 2 つのシーケンサーが必要であり、1 つだけがドライバーに接続されていることを意味します。翻訳シーケンスは次のようになります。
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に関するこの記事をご覧ください。