FPGA開発日記

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

Vivado Simulatorを使ってUVMに入門する (22. スコアボードを活用するDUTを作りたい)

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

1サイクルのDelayがあるRAMをUVMで検証している。

モニタのところで、アドレスとデータが1サイクルずれるのを吸収してやる必要がある。 とりあえず以下のようにして、1サイクルのDelayをprev_read_eqprev_read_addrで吸収した。 でも、foreverで囲んでいるところでちゃんとパイプライン化されているのかしら? 波形が出てくるわけではないので、その辺はあまり自信が無い。

  • mem_rw_monitor.sv
  virtual task run_phase (uvm_phase phase);

    logic prev_read_req;
    logic [7:0] prev_read_addr;

    super.run_phase (phase);
    // This task monitors the interface for a complete
    // transactions and writes into analysis port when complete

    forever begin
      mem_rw_seq_item item = new;

      item.i_valid = 1'b0;

      @ (posedge vif.clk);

      if (prev_read_req) begin
        item = mem_rw_seq_item::type_id::create("read_tr", this);
        item.i_valid = 1'b1;
        item.i_addr  = prev_read_addr;
        item.i_rw    = 0; // Read
        item.i_data  = 'x;
        item.o_data  = vif.o_data;
        `uvm_info (get_type_name(), $sformatf("Monitor found packet %s", item.convert2str()), UVM_LOW)
        mon_analysis_port.write(item);
        prev_read_req = 1'b0;
      end

      if (vif.i_valid && vif.i_rw) begin
        item = mem_rw_seq_item::type_id::create("write_tr", this);
        item.i_valid = vif.i_valid;
        item.i_addr  = vif.i_addr;
        item.i_rw    = vif.i_rw;
        item.i_data  = vif.i_data;
        item.o_data = 'x;
        `uvm_info (get_type_name(), $sformatf("Monitor found packet %s", item.convert2str()), UVM_LOW)
        mon_analysis_port.write(item);
      end

      // Check current cycle read request
      if (vif.i_valid && !vif.i_rw) begin
        prev_read_req  = 1'b1;
        prev_read_addr = vif.i_addr;
        `uvm_info (get_type_name(), $sformatf("Read request found. Addr=0x%0x", prev_read_addr), UVM_LOW)
      end

    end // forever begin
  endtask // run_phase

一応、テストは通っているようだ。

** Report counts by severity
UVM_INFO : 5507
UVM_WARNING :    0
UVM_ERROR :    0
UVM_FATAL :    0
** Report counts by id
[DATA_MATCH]   407
[DRV]  1568
[NO_DPI_TSTNAME]     1
[RNTST]     1
[SEQ]  1568
[TEST_DONE]     1
[UVM/COMP/NAMECHECK]     1
[UVM/RELNOTES]     1
[mem_rw_monitor]  1183
[mem_rw_scoreboard]   776