前回はこちら:msyksphinz.hatenablog.com
UVMのさらなるテストベンチを試行するために、以下のウェブサイトのサンプルを試してみることにした。
前回はScoreboardまで作ったので、残りを組み立てていこう。
テストの構成
class test extends uvm_test
は以下のように組んで、テストを生成した。gen_item_seq
を生成して、テストをドライバに渡していく。
test.sv
class test extends uvm_test; `uvm_component_utils(test); function new(string name="test", uvm_component parent=null); super.new(name, parent); endfunction // new env e0; virtual switch_if vif; virtual function void build_phase(uvm_phase phase); super.build_phase(phase); e0 = env::type_id::create("e0", this); if (!uvm_config_db #(virtual switch_if)::get(this, "", "switch_vif", vif)) begin `uvm_fatal("TEST", "Did not get vif") end uvm_config_db #(virtual switch_if)::set(this, "e0.a0.*", "switch_vif", vif); endfunction // build_phase virtual task run_phase (uvm_phase phase); gen_item_seq seq = gen_item_seq::type_id::create ("seq"); phase.raise_objection(this); apply_reset(); seq.randomize(); seq.start(e0.a0.s0); phase.drop_objection(this); endtask // run_phase virtual task apply_reset(); vif.rstn <= 1'b0; repeat(5) @ (posedge vif.clk); vif.rstn <= 1'b1; repeat(10) @ (posedge vif.clk); endtask // apply_reset endclass // test
tb_top.sv
DUTとテスト全体を含んだモジュールだ。
///////////////////////////////////// logic clk, rstz; switch_if vif(clk); // clk initial begin clk <= 1'b1; #100; forever #50 clk <= ~clk; end // rstz initial begin rstz <= 1'b0; #80 rstz <= 1'b1; end switch u0 ( .clk (clk ), .rstn (vif.rstn ), .vld (vif.vld ), .addr (vif.addr ), .data (vif.data ), .addr_a (vif.addr_a ), .data_a (vif.data_a ), .addr_b (vif.addr_b ), .data_b (vif.data_b ) ); initial begin uvm_config_db #(virtual switch_if)::set(uvm_root::get(), "*", "switch_vif", vif); run_test(); $finish; end endmodule // tb_top
これを含んで、テストベンチを走らせた。
$ grep scoreboard dsim.log UVM_INFO ./model/scoreboard.sv(29) @ 2000: uvm_test_top.e0.sb0 [SCBD] PASS! Match addr=0x8e data=0xe114 addr_a=0x8e data_a=0xe114 UVM_INFO ./model/scoreboard.sv(29) @ 2000: uvm_test_top.e0.sb0 [SCBD] PASS! Match addr=0x4d data=0x47d6 addr_a=0x4d data_a=0x47d6 UVM_INFO ./model/scoreboard.sv(29) @ 2000: uvm_test_top.e0.sb0 [SCBD] PASS! Match addr=0x56 data=0x6e67 addr_a=0x56 data_a=0x6e67 UVM_INFO ./model/scoreboard.sv(29) @ 2000: uvm_test_top.e0.sb0 [SCBD] PASS! Match addr=0x98 data=0x9c8f addr_a=0x98 data_a=0x9c8f UVM_INFO ./model/scoreboard.sv(29) @ 2000: uvm_test_top.e0.sb0 [SCBD] PASS! Match addr=0x62 data=0xa84 addr_a=0x62 data_a=0xa84 UVM_INFO ./model/scoreboard.sv(29) @ 2000: uvm_test_top.e0.sb0 [SCBD] PASS! Match addr=0x7f data=0x839e addr_a=0x7f data_a=0x839e
ちゃんと動いたようだ。よかった。 波形も想定通りに出ていることを確認した。