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