blob: 76ff53fc5e24fa2bd162622c05502da8f307488d [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
class xbar_seq_base;
virtual xbar_if vif;
mailbox #(xbar_seq_item) req;
mailbox #(xbar_seq_item) rsp;
string name;
function new(string name);
this.name = name;
endfunction : new
task connect(mailbox #(xbar_seq_item) req,
mailbox #(xbar_seq_item) rsp
);
this.req = req;
this.rsp = rsp;
endtask : connect
task pre_start(virtual xbar_if xbar_if);
this.vif = xbar_if;
endtask : pre_start
task run();
// Call body
body();
endtask : run
virtual task body();
// FATAL: Need to override
endtask : body
task write_req(input bit [31:0] addr,
input bit [31:0] data,
input bit [3:0] wstrb);
xbar_seq_item item;
item = new;
item.addr = addr;
item.data = data;
item.wstrb = wstrb;
item.op = xbar_pkg::BUS_WR;
this.req.put(item);
endtask : write_req
task write_rsp();
xbar_seq_item item;
this.rsp.get(item);
endtask : write_rsp
task write(input bit [31:0] addr,
input bit [31:0] data,
input bit [3:0] wstrb);
this.write_req(addr, data, wstrb);
this.write_rsp(); // 1 outstanding
endtask : write
task write_async(input bit [31:0] addr,
input bit [31:0] data,
input bit [3:0] wstrb);
this.write_req(addr, data, wstrb);
fork
this.write_rsp();
join_none
endtask : write_async
task read_req(input bit [31:0] addr);
xbar_seq_item item;
item = new;
item.addr = addr;
item.op = xbar_pkg::BUS_RD;
this.req.put(item);
endtask : read_req
task read_data(output bit [31:0] data);
xbar_seq_item item;
this.rsp.get(item);
data = item.data;
endtask : read_data
task read(input bit [31:0] addr,
output bit [31:0] data);
this.read_req(addr);
this.read_data(data);
endtask : read
task compare(input bit [31:0] addr,
input bit [31:0] data);
logic [31:0] rdata;
this.write_req(addr, data, '1);
this.read_req(addr);
this.write_rsp();
this.read_data(rdata);
assert(data == rdata)
else $error("Data mismatch: ADDR(0x%08x) EXP(0x%08x) GOT(0x%08x)", addr, data, rdata);
endtask : compare
task compare_async(input bit [31:0] addr,
input bit [31:0] data);
logic [31:0] rdata;
this.write_req(addr, data, '1);
this.read_req(addr);
fork
begin
this.write_rsp();
this.read_data(rdata);
assert(data == rdata)
else $error("Data mismatch: ADDR(0x%08x) EXP(0x%08x) GOT(0x%08x)", addr, data, rdata);
end
join_none
endtask : compare_async
endclass