OpenCores
URL https://opencores.org/ocsvn/pit/pit/trunk

Subversion Repositories pit

[/] [pit/] [trunk/] [bench/] [sys_verilog/] [wb_master_model.sv] - Rev 24

Compare with Previous | Blame | View Log

////////////////////////////////////////////////////////////////////////////////
//
//  WISHBONE rev.B2 Wishbone Master model
//
//  Author: Bob Hayes
//          rehayes@opencores.org
//
//  Downloaded from: http://www.opencores.org/projects/pit.....
//
////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2011, Robert Hayes
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//     * Neither the name of the <organization> nor the
//       names of its contributors may be used to endorse or promote products
//       derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY Robert Hayes ''AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL Robert Hayes BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
////////////////////////////////////////////////////////////////////////////////
// 45678901234567890123456789012345678901234567890123456789012345678901234567890

`include "timescale.v"

module wb_master_model  #(parameter dwidth = 32,
                          parameter awidth = 32)
(
  // Wishbone Signals
wishbone_if.master           wb_1,          // Define the interface instance name
wishbone_if.master           wb_2,          // Define the interface instance name
wishbone_if.master           wb_3,          // Define the interface instance name
wishbone_if.master           wb_4,          // Define the interface instance name
output logic                 cyc,
output logic                 stb,
output logic                 we,
output logic [dwidth/8 -1:0] sel,
output logic [awidth   -1:0] adr,
output logic [dwidth   -1:0] dout,
input  logic [dwidth   -1:0] din,
input  logic                 clk,
input  logic                 ack,
input  logic                 rst,  // No Connect
input  logic                 err,  // No Connect
input  logic                 rty   // No Connect
);

//////////////////////////////////
//
// Local Wires
//


logic [dwidth-1:0] q;

event cmp_error_detect;

assign wb_1.wb_adr = adr[2:0];
assign wb_1.wb_sel = 2'b11;
assign wb_1.wb_we  = we;
assign wb_1.wb_cyc = cyc;
assign wb_1.wb_dat = dout;

assign wb_2.wb_adr = adr[2:0];
assign wb_2.wb_sel = 2'b11;
assign wb_2.wb_we  = we;
assign wb_2.wb_cyc = cyc;
assign wb_2.wb_dat = dout;

assign wb_3.wb_adr = adr[2:0];
assign wb_3.wb_sel = 2'b11;
assign wb_3.wb_we  = we;
assign wb_3.wb_cyc = cyc;
assign wb_3.wb_dat = dout;

assign wb_4.wb_adr = adr[2:0];
assign wb_4.wb_sel = 2'b11;
assign wb_4.wb_we  = we;
assign wb_4.wb_cyc = cyc;
assign wb_4.wb_dat = dout[7:0];

//////////////////////////////////
//
// Memory Logic
//

initial
  begin
    adr  <= 'x;
    dout <= 'x;
    cyc  <= 1'b0;
    stb  <= 1'bx;
    we   <= 1'hx;
    sel  <= 'x;
    #1;
    $display("\nINFO: WISHBONE MASTER MODEL INSTANTIATED (%m)");
  end

//////////////////////////////////
//
// Wishbone write cycle
//

task wb_write(
  integer delay,
  logic   [awidth -1:0] a,
  logic   [dwidth -1:0] d);

  // wait initial delay
  repeat(delay) @(posedge clk);

  // assert wishbone signal
  #1;
  adr  = a;
  dout = d;
  cyc  = 1'b1;
  stb  = 1'b1;
  we   = 1'b1;
  sel  = '1;
  @(posedge clk);

  // wait for acknowledge from slave
  while(~ack)     @(posedge clk);

  // negate wishbone signals
  #1;
  cyc  = 1'b0;
  stb  = 1'bx;
  adr  = 'x;
  dout = 'x;
  we   = 1'hx;
  sel  = 'x;

endtask

//////////////////////////////////
//
// Wishbone read cycle
//

task wb_read(
  integer delay,
  logic         [awidth -1:0] a,
  output logic  [dwidth -1:0] d);

  // wait initial delay
  repeat(delay) @(posedge clk);

  // assert wishbone signals
  #1;
  adr  = a;
  dout = 'x;
  cyc  = 1'b1;
  stb  = 1'b1;
  we   = 1'b0;
  sel  = '1;
  @(posedge clk);

  // wait for acknowledge from slave
  while(~ack)     @(posedge clk);

  // negate wishbone signals
  d    = din; // Grab the data on the posedge of clock
  #1;         // Delay the clearing (hold time of the control signals
  cyc  = 1'b0;
  stb  = 1'bx;
  adr  = 'x;
  dout = 'x;
  we   = 1'hx;
  sel  = 'x;
  d    = din;

endtask

//////////////////////////////////
//
// Wishbone compare cycle (read data from location and compare with expected data)
//

task wb_cmp(
  integer delay,
  logic [awidth -1:0] a,
  logic [dwidth -1:0] d_exp);

  wb_read (delay, a, q);

  if (d_exp !== q)
    begin
      -> cmp_error_detect;
      $display("Data compare error at address %h. Received %h, expected %h at time %t", a, q, d_exp, $time);
    end
endtask

endmodule : wb_master_model


Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.