1

検証チームと uvm テスト ケースを簡単に記述できるフレームワークを作成しています。基本的な考え方は、私のベース (uvm_) シーケンスには、本体タスクに 1 行しか含まれていないということです。

regs.update(status);

個々の (uvm_) テストから、便利なヘルパー関数を使用してレジスタ値を設定できます。たとえば、私のテストには次のものが含まれます。

class base_test extends uvm_test;
    ........
    ........
    virtual function void set_registerA(....);
        regs.registerA1.set(....);
        regs.registerA2.set(....);
        regs.registerA3.set(....);
    endfunction

    virtual function void set_registerB(....);
        regs.registerB1.set(....);
        regs.registerB2.set(....);
        regs.registerB3.set(....);
    endfunction
endclass

class test1 extends base_test;
    virtual function void end_of_elaboration_phase(uvm_phase phase);
        set_registerA(....);
        set_registerB(....);
    endfunction
endclass

class test2 extends base_test;
    virtual function void end_of_elaboration_phase(uvm_phase phase);
        set_registerA(....);
        set_registerB(....);
    endfunction
endclass

end_of_elaboration フェーズは、レジスタを設定するのに最適な場所ではない可能性があることに気付きました。私のコンパイラは、「警告: タスク "end_of_elaboration" でタスク "set_registerA" を呼び出しています。したがって、run_phase で実行するように変更しました:

class test1 extends base_test;
    virtual task run_phase(uvm_phase phase);
        super.run_phase(phase);
        set_registerA(....);
        set_registerB(....);
    endfunction
endclass

class test2 extends base_test;
    virtual task run_phase(uvm_phase phase);
        super.run_phase(phase);
        set_registerA(....);
        set_registerB(....);
    endfunction
endclass

これが私がやろうとしていることの正しい方法論であるかどうか確信が持てませんか? super.run_phase を呼び出すと問題が発生しますか? 私はこれがどこでも行われているのを見ません。

4

3 に答える 3

1

考えられる解決策は 2 つあります。 1. ベース シーケンスのアイデアをあきらめて、別のシーケンスを作成し、 にレジスタを設定してbody()から、 を呼び出すことができますupdate()。または、本当に基本シーケンスを使用したい場合はpre_bodybody呼び出しsuper.bodyでレジスタを設定できますupdate。方法論の観点から、値をレジスターに設定すること (更新によって実際には reg.write() に変換される) は、テストではなくシーケンスに属していると思います。2. テストに setregs を残すことができます テスト main_phase でシーケンスを開始すると、seq.start(seqr) を実行する前に、すべてのレジスタを設定できます

交互シーケンスで 1 つのテストのみを使用するには、テスト ファイルに追加します。

function void build_phase(uvm_phase phase);
      string seq_name;
      uvm_sequence_base seq;
      uvm_factory factory= uvm_factory::get();

      super.build_phase(phase);

      $value$plusargs("SEQ_NAME=%s", seq_name); 
      .......    

 if(! $cast(seq, factory.create_object_by_name(seq_name)))
     `uvm_fatal("", "Failed to create sequence")
  if(seq == null)
     `uvm_fatal("", "no sequence created seq=null!!")

  uvm_config_db #(uvm_sequence_base)::set(this, "master.sequencer.main_phase" ,"default_sequence", seq);

次に、コマンドラインに次を追加します: +SEQ_NAME=rand_seq

于 2014-06-17T11:53:43.217 に答える