Store queue scoreboard functional

This commit is contained in:
Florian Zaruba 2017-05-30 10:07:19 +02:00
parent e99b6abab7
commit 0ef1bbd4ca
5 changed files with 27 additions and 15 deletions

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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

View file

@ -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