uvmに基づくuvm_primerch11テスト

この章から正式にuvmの世界に入ります

工場を使用してケースを作成する

次のコマンドを使用すると、一度に複数のケースをコンパイルして実行することしかできません
。vsimtop_optimized -coverage + UVM_TESTNAME = add_test
vsim top_optimized -coverage + UVM_TESTNAME = random_test UVM_TESTNAMEを
使用してrun_test()を呼び出し、ファクトリを使用してさまざまなクラスのオブジェクトを構築します。

パスインターフェイス、run_test()

  • setは静的メソッドです。
  • run_test()は、+ UVM_TESTNAMEのパラメーターを読み取り、このケースのオブジェクトを作成します。
module top;
   import uvm_pkg::*;
`include "uvm_macros.svh"

   import   tinyalu_pkg::*;
`include "tinyalu_macros.svh"

   tinyalu_bfm       bfm();
   tinyalu DUT (.A(bfm.A), .B(bfm.B), .op(bfm.op), 
                .clk(bfm.clk), .reset_n(bfm.reset_n), 
                .start(bfm.start), .done(bfm.done), .result(bfm.result));

initial begin
  uvm_config_db #(virtual tinyalu_bfm)::set(null, "*", "bfm", bfm);
  run_test();
end

endmodule : top

random_test()

  • `uvm_component_utilsはこのマクロを使用してクラスをファクトリに登録するため、ファクトリのコードを変更する必要がないため、このrandom_testオブジェクトを構築できます。
  • get()関数を使用して、セットのインターフェイスを取得します。取得が失敗した場合は、0を返します。
  • 異論の理解:run_phase()は、終了する前に各オブジェクトにraise_objectionがあるかどうかを確認します。ある場合は、待機します。最後のオブジェクトdrop_objectionを認識します。
class random_test extends uvm_test;
   `uvm_component_utils(random_test);

 virtual tinyalu_bfm bfm;
   
   function new (string name, uvm_component parent);
      super.new(name,parent);
      if(!uvm_config_db #(virtual tinyalu_bfm)::get(null, "*","bfm", bfm))
        $fatal("Failed to get BFM");
   endfunction : new


   task run_phase(uvm_phase phase);
      random_tester    random_tester_h;
      coverage  coverage_h;
      scoreboard scoreboard_h;

      phase.raise_objection(this);

      random_tester_h    = new(bfm);
      coverage_h  = new(bfm);
      scoreboard_h = new(bfm);
      
      fork
         coverage_h.execute();
         scoreboard_h.execute();
      join_none

      random_tester_h.execute();
      phase.drop_objection(this);
   endtask : run_phase

endclass

おすすめ

転載: blog.csdn.net/weixin_39060517/article/details/113049523