0

ここに私の簡単なコードセグメントがあります

class sample_sequence extends uvm_sequence#(sample_sequence_item);


rand int no_txn;
  `uvm_object_param_utils_begin(sample_sequence_item)
  `uvm_field_int(no_txn,UVM_ALL_ON)
  `uvm_object_utils_end

  rand sample_sequence_item sample_sequence_item_inst;
  function new(string name="sample_sequence");
    super.new(name);
  endfunction

  virtual task body();
    no_txn = 10;
    for(int i = 0;i<no_trn;i++) begin
      sample_sequence_item_inst = sample_sequence_item::type_id::create($sformatf("sample_sequence_item_%0d",i));
      sample_sequence_item_inst.addr = $urandom_range(0,20);

      start_item(sample_sequence_item_inst);
      finish_item(sample_sequence_item_inst);
    end


  endtask: body

endclass

このシーケンスは、ランダムなアドレスを生成してドライバーに送信するだけです。テストからパラメーター no_txn を制御したい。

シーケンスの階層を使用してそれを行うことができますが、それをオーバーライドするための UVM ベースのファクトリ メソッドはありますか?

4

1 に答える 1

1

私はあなたがシーケンスを開始する方法に依存します。

テストで直接開始する場合は、シーケンスをランダム化するときに制約を追加できます。

class some_test extends uvm_test;
  // ...

  task run_phase(uvm_phase phase);
    sample_sequence seq = sample_seq::type_id::create("seq");
    if (!seq.randomize() with { no_txn == 5; })
      `uvm_fatal("RANDERR", "Randomization error")
    seq.start(sequencer);
  endtask
endclass

上に示したものと同様に開始したテストを拡張する場合 (withブロックを除く)、特定の制約を追加する子クラスを作成できます。

class some_other_sequence extends some_sequence;
  constraint do_5_items { no_txn == 5; }
endclass

テストのどこかで、型のオーバーライドを設定する必要があります (通常はend_of_elaboration_phase(...)関数で行います)。タイプのオーバーライドとファクトリの詳細については、UVM ユーザー ガイドを参照してください。

于 2015-01-13T19:55:33.750 に答える