mirror of
https://github.com/openhwgroup/cva6.git
synced 2025-04-22 13:17:41 -04:00
Store queue scoreboard functional
This commit is contained in:
parent
e99b6abab7
commit
0ef1bbd4ca
5 changed files with 27 additions and 15 deletions
|
@ -58,8 +58,8 @@ class dcache_if_monitor extends uvm_component;
|
|||
|
||||
string if_type = this.get_full_name();//(m_cfg.dcache_if_config inside {SLAVE, SLAVE_REPLAY, SLAVE_NO_RANDOM}) ? "[SLAVE]" : "[MASTER]";
|
||||
logic [11:0] address_index [$];
|
||||
logic [44:0] address;
|
||||
logic[7:0] be [$];
|
||||
logic [7:0] be [$];
|
||||
logic [63:0] wdata [$];
|
||||
|
||||
dcache_if_seq_item cmd = dcache_if_seq_item::type_id::create("cmd");
|
||||
// Monitor process
|
||||
|
@ -73,6 +73,7 @@ class dcache_if_monitor extends uvm_component;
|
|||
// $display("%s: %t, Putting index: %0h", if_type, $time(), m_vif.pck.address_index);
|
||||
address_index.push_back(m_vif.pck.address_index);
|
||||
be.push_back(m_vif.pck.data_be);
|
||||
wdata.push_back(m_vif.pck.data_wdata);
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -103,7 +104,8 @@ class dcache_if_monitor extends uvm_component;
|
|||
// blocking get, wait for both to be ready
|
||||
data_mbx.get(cmd.data);
|
||||
address_mbx.get(cmd.address);
|
||||
cmd.be = be.pop_front();
|
||||
cmd.be = be.pop_front();
|
||||
cmd.wdata = wdata.pop_front();
|
||||
// $display("%s: %t, Popping %0h from MBX", if_type, $time(), cmd.address);
|
||||
// was this from a master or slave agent monitor?
|
||||
cmd.isSlaveAnswer = (m_cfg.dcache_if_config inside {SLAVE, SLAVE_REPLAY, SLAVE_NO_RANDOM}) ? 1'b1 : 1'b0;
|
||||
|
|
|
@ -24,6 +24,7 @@ class dcache_if_seq_item extends uvm_sequence_item;
|
|||
//------------------------------------------
|
||||
rand logic [63:0] address;
|
||||
rand logic [63:0] data;
|
||||
rand logic [63:0] wdata;
|
||||
rand logic [7:0] be;
|
||||
rand int requestDelay;
|
||||
mode_t mode;
|
||||
|
@ -54,6 +55,7 @@ class dcache_if_seq_item extends uvm_sequence_item;
|
|||
data = rhs_.data;
|
||||
be = rhs_.be;
|
||||
mode = rhs_.mode;
|
||||
wdata = rhs_.wdata;
|
||||
isSlaveAnswer = rhs_.isSlaveAnswer;
|
||||
endfunction : do_copy
|
||||
|
||||
|
@ -69,14 +71,15 @@ class dcache_if_seq_item extends uvm_sequence_item;
|
|||
&& address == rhs_.address
|
||||
&& data == rhs_.data
|
||||
&& be == rhs_.be
|
||||
&& mode == rhs_.mode;
|
||||
&& mode == rhs_.mode
|
||||
&& wdata == rhs_.wdata;
|
||||
endfunction : do_compare
|
||||
|
||||
function string convert2string();
|
||||
string s;
|
||||
|
||||
$sformat(s, "%s\n", super.convert2string());
|
||||
$sformat(s, "%s\nMode: %s\nAddress: %0h\nData: %0h\nBE: %0h \nisSlaveAnswer: %h", s, mode.name, address, data, be, isSlaveAnswer);
|
||||
$sformat(s, "%s\nMode: %s\nAddress: %0h\nData: %0h\nBE: %0h\nwdata: %0h\nisSlaveAnswer: %h", s, mode.name, address, data, be, wdata, isSlaveAnswer);
|
||||
return s;
|
||||
|
||||
endfunction:convert2string
|
||||
|
@ -94,10 +97,11 @@ class dcache_if_seq_item extends uvm_sequence_item;
|
|||
super.do_record(recorder);
|
||||
|
||||
// Use the record macros to record the item fields:
|
||||
`uvm_record_field("Mode", mode)
|
||||
`uvm_record_field("Address", address)
|
||||
`uvm_record_field("Data", data)
|
||||
`uvm_record_field("BE", be)
|
||||
`uvm_record_field("mode", mode)
|
||||
`uvm_record_field("address", address)
|
||||
`uvm_record_field("data", data)
|
||||
`uvm_record_field("be", be)
|
||||
`uvm_record_field("wdate", be)
|
||||
endfunction:do_record
|
||||
|
||||
endclass : dcache_if_seq_item
|
||||
|
|
|
@ -58,7 +58,7 @@ class store_queue_if_monitor extends uvm_component;
|
|||
// a new store item request has arrived
|
||||
@(m_vif.pck iff (m_vif.pck.store_valid && m_vif.pck.ready));
|
||||
// $display("%t, %0h", $time(), m_vif.pck.store_paddr);
|
||||
cmd.address = m_vif.pck.store_paddr;
|
||||
cmd.address = m_vif.pck.store_paddr[55:0];
|
||||
cmd.data = m_vif.pck.store_data;
|
||||
cmd.be = m_vif.pck.store_be;
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@ class store_queue_if_seq_item extends uvm_sequence_item;
|
|||
|
||||
$sformat(s, "%s\n", super.convert2string());
|
||||
// Convert to string function reusing s:
|
||||
$sformat(s, "Address: %0h, Data: %0h, BE: %0h", this.address, this.data, this.be);
|
||||
$sformat(s, "Address: %0h\nData: %0h\nBE: %0h", this.address, this.data, this.be);
|
||||
return s;
|
||||
|
||||
endfunction:convert2string
|
||||
|
|
14
tb/env/store_queue/store_queue_scoreboard.svh
vendored
14
tb/env/store_queue/store_queue_scoreboard.svh
vendored
|
@ -35,6 +35,8 @@ class store_queue_scoreboard extends uvm_scoreboard;
|
|||
virtual function void write (uvm_sequence_item seq_item);
|
||||
// variables to hold the casts
|
||||
store_queue_if_seq_item casted_store_queue = new;
|
||||
store_queue_if_seq_item store_queue_item;
|
||||
|
||||
dcache_if_seq_item casted_dcache = new;
|
||||
|
||||
|
||||
|
@ -50,10 +52,14 @@ class store_queue_scoreboard extends uvm_scoreboard;
|
|||
if (seq_item.get_type_name() == "dcache_if_seq_item") begin
|
||||
// cast dcache variable
|
||||
$cast(casted_dcache, seq_item.clone());
|
||||
|
||||
$display("%s", store_queue_items.pop_front().convert2string());
|
||||
$display("%s", casted_dcache.convert2string());
|
||||
|
||||
// get the latest store queue item
|
||||
store_queue_item = store_queue_items.pop_front();
|
||||
// match it with the expected result from the store queue side
|
||||
if (store_queue_item.address != casted_dcache.address ||
|
||||
store_queue_item.data != casted_dcache.wdata ||
|
||||
store_queue_item.be != casted_dcache.be) begin
|
||||
`uvm_error("Store Queue Scoreboard", $sformatf("Mismatch. Expected: %s Got: %s", store_queue_item.convert2string(), casted_dcache.convert2string()));
|
||||
end
|
||||
end
|
||||
endfunction
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue