blob: 5dfa5bc926969233d65f0fd02ef2fcc847ec6e89 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// Testbench module for prim_fifo_sync.
// Intended to be used with a formal tool.
//
// This formal testbench instantiates a set of differently parameterized FIFOs:
//
// - a depth 0 pass through FIFO
// - depth 1, 7, 8, 15, 16 pass through FIFOs
// - depth 1, 7, 8, 15, 16 non-pass through FIFOs
//
// Data/depth value checks are enabled up to depth 8 in order to constrain the
// runtime.
module prim_fifo_sync_tb #(
// number of DUTs instantiated in this FPV testbench
parameter int unsigned NumDuts = 11,
// fifo params
parameter int unsigned Width = 4,
parameter int unsigned MaxDepth = 16, // max depth used in this destbench
localparam int unsigned DepthW = ($clog2(MaxDepth+1) == 0) ? 1 : $clog2(MaxDepth+1)
) (
input clk_i,
input rst_ni,
input clr_i,
input wvalid_i[NumDuts],
output wready_o[NumDuts],
input [Width-1:0] wdata_i [NumDuts],
output rvalid_o[NumDuts],
input rready_i[NumDuts],
output [Width-1:0] rdata_o [NumDuts],
output [DepthW-1:0] depth_o [NumDuts]
);
// need to instantiate by hand since bind statements inside
// generate blocks are currently not supported
////////////////////
// non-pass FIFOs //
////////////////////
prim_fifo_sync #(
.Width(Width),
.Pass(1'b0),
.Depth(1)
) i_nopass1 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[0]),
.wready_o(wready_o[0]),
.wdata_i(wdata_i[0]),
.rvalid_o(rvalid_o[0]),
.rready_i(rready_i[0]),
.rdata_o(rdata_o[0]),
.depth_o(depth_o[0][0])
);
prim_fifo_sync #(
.Width(Width),
.Pass(1'b0),
.Depth(7)
) i_nopass7 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[1]),
.wready_o(wready_o[1]),
.wdata_i(wdata_i[1]),
.rvalid_o(rvalid_o[1]),
.rready_i(rready_i[1]),
.rdata_o(rdata_o[1]),
.depth_o(depth_o[1][2:0])
);
prim_fifo_sync #(
.Width(Width),
.Pass(1'b0),
.Depth(8)
) i_nopass8 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[2]),
.wready_o(wready_o[2]),
.wdata_i(wdata_i[2]),
.rvalid_o(rvalid_o[2]),
.rready_i(rready_i[2]),
.rdata_o(rdata_o[2]),
.depth_o(depth_o[2][3:0])
);
prim_fifo_sync #(
.Width(Width),
.Pass(1'b0),
.Depth(15)
) i_nopass15 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[3]),
.wready_o(wready_o[3]),
.wdata_i(wdata_i[3]),
.rvalid_o(rvalid_o[3]),
.rready_i(rready_i[3]),
.rdata_o(rdata_o[3]),
.depth_o(depth_o[3][3:0])
);
prim_fifo_sync #(
.Width(Width),
.Pass(1'b0),
.Depth(16)
) i_nopass16 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[4]),
.wready_o(wready_o[4]),
.wdata_i(wdata_i[4]),
.rvalid_o(rvalid_o[4]),
.rready_i(rready_i[4]),
.rdata_o(rdata_o[4]),
.depth_o(depth_o[4][4:0])
);
////////////////
// pass FIFOs //
////////////////
// depth_o-zero is per definition a pass-through FIFO
prim_fifo_sync #(
.Width(Width),
.Pass(1'b1),
.Depth(0)
) i_pass0 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[5]),
.wready_o(wready_o[5]),
.wdata_i(wdata_i[5]),
.rvalid_o(rvalid_o[5]),
.rready_i(rready_i[5]),
.rdata_o(rdata_o[5]),
.depth_o(depth_o[5][0])
);
prim_fifo_sync #(
.Width(Width),
.Pass(1'b1),
.Depth(1)
) i_pass1 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[6]),
.wready_o(wready_o[6]),
.wdata_i(wdata_i[6]),
.rvalid_o(rvalid_o[6]),
.rready_i(rready_i[6]),
.rdata_o(rdata_o[6]),
.depth_o(depth_o[6][0])
);
prim_fifo_sync #(
.Width(Width),
.Pass(1'b1),
.Depth(7)
) i_pass7 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[7]),
.wready_o(wready_o[7]),
.wdata_i(wdata_i[7]),
.rvalid_o(rvalid_o[7]),
.rready_i(rready_i[7]),
.rdata_o(rdata_o[7]),
.depth_o(depth_o[7][2:0])
);
prim_fifo_sync #(
.Width(Width),
.Pass(1'b1),
.Depth(8)
) i_pass8 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[8]),
.wready_o(wready_o[8]),
.wdata_i(wdata_i[8]),
.rvalid_o(rvalid_o[8]),
.rready_i(rready_i[8]),
.rdata_o(rdata_o[8]),
.depth_o(depth_o[8][3:0])
);
prim_fifo_sync #(
.Width(Width),
.Pass(1'b1),
.Depth(15)
) i_pass15 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[9]),
.wready_o(wready_o[9]),
.wdata_i(wdata_i[9]),
.rvalid_o(rvalid_o[9]),
.rready_i(rready_i[9]),
.rdata_o(rdata_o[9]),
.depth_o(depth_o[9][3:0])
);
prim_fifo_sync #(
.Width(Width),
.Pass(1'b1),
.Depth(16)
) i_pass16 (
.clk_i,
.rst_ni,
.clr_i,
.wvalid_i(wvalid_i[10]),
.wready_o(wready_o[10]),
.wdata_i(wdata_i[10]),
.rvalid_o(rvalid_o[10]),
.rready_i(rready_i[10]),
.rdata_o(rdata_o[10]),
.depth_o(depth_o[10][4:0])
);
endmodule : prim_fifo_sync_tb