2

uvm_sequencer の run_phase 内のトランザクションを取得して、トランザクションが 4KB 境界を超えているかどうかを確認したいと考えています。それらが 4KB の境界を越える場合に備えて、そのトランザクションを複数のトランザクションに分割してからドライバーに送信したいと考えています。ドライバーから応答が受信されると、すべての分割トランザクション応答が元のトランザクションにマージされ、元のトランザクションを生成したシーケンスに戻されます。これを行う方法はありますか?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);
4

1 に答える 1

2

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 Horizo​​nsに関するこの記事をご覧ください。

于 2014-11-23T02:55:05.890 に答える