もう何回目になるのかわからないが、そろそろUVMを覚えなければならないのでVivado Simulatorを使ってUVMに入門してみよう。
前回作ったテストが、Vivado 2023.2 だと、なんとなく動かなかったので、DSimでも試行している。
参考にしているのは例によって以下のウェブサイトだ:
MasterとSlaveのシーケンスを確認している。以下のページを参考にした。
いくつかの修正点について、自分で詰まってしまった部分をまとめよう。
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