blob: 898397f424fd95739605e27b83dafb66e1a5ff0d [file] [log] [blame]
//
// -------------------------------------------------------------
// Copyright 2004-2008 Synopsys, Inc.
// All Rights Reserved Worldwide
//
// Licensed under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in
// writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See
// the License for the specific language governing
// permissions and limitations under the License.
// -------------------------------------------------------------
//
`include "wishbone.sv"
module top;
initial $timeformat(0, 0, "ns", 1);
wb_if if0();
reg clk;
assign if0.clk = clk;
always begin
#10;
clk = 1'b0;
#10;
clk = 1'b1;
end
endmodule
program test;
class wb_env extends vmm_env;
wb_slave_cfg cfg;
wb_master master;
wb_slave slave;
wb_ram ram;
wb_cycle tr;
function new();
this.cfg = new;
endfunction: new
virtual function void gen_cfg();
super.gen_cfg();
if (!this.cfg.randomize()) begin
`vmm_fatal(this.log, "Unable to randomize configuration");
end
this.cfg.display("Using CFG: ");
this.tr = new(this.cfg);
endfunction: gen_cfg
virtual function void build();
super.build();
this.master = new("0", 32'd0, this.cfg, top.if0.master);
this.ram = new("0", 32'd0);
this.slave = new("0", 32'd0, this.cfg, top.if0.slave,
this.ram.req_chan, this.ram.resp_chan);
this.master.log.set_verbosity(vmm_log::DEBUG_SEV);
// this.ram.log.set_verbosity(vmm_log::DEBUG_SEV);
this.slave.log.set_verbosity(vmm_log::DEBUG_SEV);
endfunction: build
virtual task start();
super.start();
this.master.start_xactor();
this.slave.start_xactor();
this.ram.start_xactor();
endtask: start
virtual task wait_for_end();
bit [63:0] tmp;
int ok;
wb_slave_cfg slv_cfg;
super.wait_for_end();
slv_cfg = this.cfg;
for (int i = 0; i < 100; i++) begin
this.tr.data_id = i;
ok = this.tr.randomize() with { slv_cfg.min_addr <= addr &&
addr <= slv_cfg.max_addr; };
if (!ok) begin
`vmm_fatal(log, "Unable to randomize a Wishbone cycle");
end
if (tr.kind == wb_cycle::READ ) begin
tmp = tr.data;
this.ram.write(tr.addr, tmp);
tr.data = 64'hx;
end
this.master.exec_chan.put(this.tr);
if (tr.kind == wb_cycle::WRITE ) begin
tmp = this.ram.read(tr.addr);
if (tmp !== tr.data) begin
`vmm_error(this.log, $psprintf("RAM[%h] == %h, not %h after %0s cycle",
tr.addr, tmp, tr.data, tr.kind.name()));
end
end
$write("---------------------------------------------------------\n");
tr.display();
$write("=========================================================\n");
// If there was a timeout, leave enough time for the salve to recover
if (tr.status == wb_cycle::TIMEOUT ) repeat (10) @(top.if0.mck);
end
endtask: wait_for_end
endclass
wb_env env = new;
initial
begin
env.run();
end
endprogram