FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Vivado Simulatorを使ってUVMに入門する (15. UVM Testbench Example 2を試す)

前回はこちら:msyksphinz.hatenablog.com

UVMのさらなるテストベンチを試行するために、以下のウェブサイトのサンプルを試してみることにした。

www.chipverify.com

前回は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

ちゃんと動いたようだ。よかった。 波形も想定通りに出ていることを確認した。