前回はこちら:msyksphinz.hatenablog.com
1サイクルのDelayがあるRAMをUVMで検証している。
モニタのところで、アドレスとデータが1サイクルずれるのを吸収してやる必要がある。
とりあえず以下のようにして、1サイクルのDelayをprev_read_eq
とprev_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