FPGA開発日記

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

Vivado Simulatorを使ってUVMに入門する (6. MasterとSlaveのモデルを試行する)

もう何回目になるのかわからないが、そろそろUVMを覚えなければならないのでVivado Simulatorを使ってUVMに入門してみよう。

前回作ったテストが、Vivado 2023.2 だと、なんとなく動かなかったので、DSimでも試行している。

参考にしているのは例によって以下のウェブサイトだ:

sites.google.com

MasterとSlaveのシーケンスを確認している。以下のページを参考にした。

sites.google.com

いくつかの修正点について、自分で詰まってしまった部分をまとめよう。

  • model/sample_slave_seq_lib.sv
virtual class sample_slave_base_seq extends uvm_sequence #(sample_seq_item);
  function new(string name="sample_slave_base_seq");
    super.new(name);
    do_not_randomize = 1;
    // set_automatic_phase_objection(1);  <-- これを追加しているとシミュレーションが終了しない
  endfunction // new
endclass
  • model/sample_slave_driver.sv
  task run_phase (uvm_phase phase);
    uvm_report_info ("DRIVER", "Hi");
    vif.ready <= 1'b0;
    // vif.valid <= 1'b0;  <-- たぶんここはvif.readyなんだと思う
    @(posedge vif.rstz);  // wait reset negate
    forever begin
      seq_item_port.get_next_item (req); // wait seq_item from sequence (via sequencer)
      @(posedge vif.valid);
      repeat (req.wait_cycle) @(posedge vif.clk);
      vif.ready <= 1'b1;
      if (vif.write === 1'b1) begin
        mem_write (vif.addr, vif.wdata);
      end else if (vif.write === 1'b0) begin
        vif.rdata <= mem_read(vif.addr);
      end
      @(posedge vif.clk) vif.ready <= 1'b0;
      seq_item_port.item_done (req);
    end // forever begin
  endtask // run_phase

DSim / Vivado Simulatorの両方で動作を確認できた。

Hello Master SEQ
UVM_INFO @ 1000: uvm_test_top.env.slave.driver [SLAVE] write access accept. addr=10h, data=55h
UVM_INFO @ 1000: uvm_test_top.env.master.monitor [MON] write addr=10h wdata=55h
UVM_INFO @ 1000: uvm_test_top.env.master.driver [DRIVER] Hi
UVM_INFO @ 2000: uvm_test_top.env.slave.driver [SLAVE] read access accept. adr=10h
UVM_INFO @ 2000: uvm_test_top.env.slave.driver [SLAVE] read data is = 55h
UVM_INFO @ 2000: uvm_test_top.env.master.monitor [MON] read  addr=10h rdata=55h
UVM_INFO @ 3000: uvm_test_top.env.master.driver [DRIVER] Hi
UVM_INFO @ 3000: uvm_test_top.env.master.sequencer@@write_seq [SEQ] read data is 55h