blob: 69ca8717278be4973f1cd7e31a8aa98bc9f9fca1 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Filename: easyaxil
// {{{
// Project: WB2AXIPSP: bus bridges and other odds and ends
//
// Purpose: A formal miter core to compare the easyaxil core to a similar
// (but mutated) core.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
////////////////////////////////////////////////////////////////////////////////
// }}}
// Copyright (C) 2020, Gisselquist Technology, LLC
// {{{
//
// This file is part of the WB2AXIP project.
//
// The WB2AXIP project contains free software and gateware, licensed under the
// Apache License, Version 2.0 (the "License"). You may not use this project,
// or 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.
//
////////////////////////////////////////////////////////////////////////////////
// }}}
//
`default_nettype none
//
module easyaxil_tb #(
// {{{
//
// Size of the AXI-lite bus. These are fixed, since 1) AXI-lite
// is fixed at a width of 32-bits by Xilinx def'n, and 2) since
// we only ever have 4 configuration words.
parameter C_AXI_ADDR_WIDTH = 4,
localparam C_AXI_DATA_WIDTH = 32,
parameter [0:0] OPT_SKIDBUFFER = 1'b0,
parameter [0:0] OPT_LOWPOWER = 0
// }}}
) (
// {{{
input wire S_AXI_ACLK,
input wire S_AXI_ARESETN,
//
input wire S_AXI_AWVALID,
output wire S_AXI_AWREADY,
input wire [C_AXI_ADDR_WIDTH-1:0] S_AXI_AWADDR,
input wire [2:0] S_AXI_AWPROT,
//
input wire S_AXI_WVALID,
output wire S_AXI_WREADY,
input wire [C_AXI_DATA_WIDTH-1:0] S_AXI_WDATA,
input wire [C_AXI_DATA_WIDTH/8-1:0] S_AXI_WSTRB,
//
output wire S_AXI_BVALID,
input wire S_AXI_BREADY,
output wire [1:0] S_AXI_BRESP,
//
input wire S_AXI_ARVALID,
output wire S_AXI_ARREADY,
input wire [C_AXI_ADDR_WIDTH-1:0] S_AXI_ARADDR,
input wire [2:0] S_AXI_ARPROT,
//
output wire S_AXI_RVALID,
input wire S_AXI_RREADY,
output wire [C_AXI_DATA_WIDTH-1:0] S_AXI_RDATA,
output wire [1:0] S_AXI_RRESP,
// }}}
input wire [7:0] mutation_index
);
easyaxil // #(.C_AXI_ADDR_WIDTH(C_AXI_ADDR_WIDTH),
// .OPT_SKIDBUFFER(OPT_SKIDBUFFER),
// .OPT_LOWPOWER(OPT_LOWPOWER)
// )
gold (
.S_AXI_ACLK( S_AXI_ACLK),
.S_AXI_ARESETN(S_AXI_ARESETN),
//
.S_AXI_AWVALID(S_AXI_AWVALID),
.S_AXI_AWREADY(S_AXI_AWREADY),
.S_AXI_AWADDR( S_AXI_AWADDR),
.S_AXI_AWPROT( S_AXI_AWPROT),
//
.S_AXI_WVALID( S_AXI_WVALID),
.S_AXI_WREADY( S_AXI_WREADY),
.S_AXI_WDATA( S_AXI_WDATA),
.S_AXI_WSTRB( S_AXI_WSTRB),
//
.S_AXI_BVALID( S_AXI_BVALID),
.S_AXI_BREADY( S_AXI_BREADY),
.S_AXI_BRESP( S_AXI_BRESP),
//
.S_AXI_ARVALID(S_AXI_ARVALID),
.S_AXI_ARREADY(S_AXI_ARREADY),
.S_AXI_ARADDR( S_AXI_ARADDR),
.S_AXI_ARPROT( S_AXI_ARPROT),
//
.S_AXI_RVALID(S_AXI_RVALID),
.S_AXI_RREADY(S_AXI_RREADY),
.S_AXI_RDATA( S_AXI_RDATA),
.S_AXI_RRESP( S_AXI_RRESP),
.mutsel(0)
);
wire uut_AWREADY, uut_WREADY, uut_BVALID, uut_ARREADY, uut_RVALID;
wire [1:0] uut_BRESP, uut_RRESP;
wire [31:0] uut_RDATA;
easyaxil // #(
// .C_AXI_ADDR_WIDTH(C_AXI_ADDR_WIDTH),
// .OPT_SKIDBUFFER(OPT_SKIDBUFFER),
// .OPT_LOWPOWER(OPT_LOWPOWER)
// )
uut (
.S_AXI_ACLK( S_AXI_ACLK),
.S_AXI_ARESETN(S_AXI_ARESETN),
//
.S_AXI_AWVALID(S_AXI_AWVALID),
.S_AXI_AWREADY(uut_AWREADY),
.S_AXI_AWADDR( S_AXI_AWADDR),
.S_AXI_AWPROT( S_AXI_AWPROT),
//
.S_AXI_WVALID( S_AXI_WVALID),
.S_AXI_WREADY( uut_WREADY),
.S_AXI_WDATA( S_AXI_WDATA),
.S_AXI_WSTRB( S_AXI_WSTRB),
//
.S_AXI_BVALID( uut_BVALID),
.S_AXI_BREADY( S_AXI_BREADY),
.S_AXI_BRESP( uut_BRESP),
//
.S_AXI_ARVALID(S_AXI_ARVALID),
.S_AXI_ARREADY(uut_ARREADY),
.S_AXI_ARADDR( S_AXI_ARADDR),
.S_AXI_ARPROT( S_AXI_ARPROT),
//
.S_AXI_RVALID(uut_RVALID),
.S_AXI_RREADY(S_AXI_RREADY),
.S_AXI_RDATA( uut_RDATA),
.S_AXI_RRESP( uut_RRESP),
.mutsel(mutation_index)
);
`ifdef FORMAL
////////////////////////////////////////////////////////////////////////
//
// Formal properties used in verfiying this core
//
////////////////////////////////////////////////////////////////////////
//
// {{{
reg f_past_valid;
initial f_past_valid = 0;
always @(posedge S_AXI_ACLK)
f_past_valid <= 1;
////////////////////////////////////////////////////////////////////////
//
// The AXI-lite control interface
//
////////////////////////////////////////////////////////////////////////
//
// {{{
localparam F_AXIL_LGDEPTH = 4;
wire [F_AXIL_LGDEPTH-1:0] faxil_rd_outstanding,
faxil_wr_outstanding,
faxil_awr_outstanding;
faxil_slave #(
// {{{
.C_AXI_DATA_WIDTH(C_AXI_DATA_WIDTH),
.C_AXI_ADDR_WIDTH(C_AXI_ADDR_WIDTH),
.F_LGDEPTH(F_AXIL_LGDEPTH),
.F_AXI_MAXWAIT(2),
.F_AXI_MAXDELAY(2),
.F_AXI_MAXRSTALL(3),
.F_OPT_COVER_BURST(4)
// }}}
) faxil(
// {{{
.i_clk(S_AXI_ACLK), .i_axi_reset_n(S_AXI_ARESETN),
//
.i_axi_awvalid(S_AXI_AWVALID),
.i_axi_awready(S_AXI_AWREADY),
.i_axi_awaddr( S_AXI_AWADDR),
.i_axi_awcache(4'h0),
.i_axi_awprot( S_AXI_AWPROT),
//
.i_axi_wvalid(S_AXI_WVALID),
.i_axi_wready(S_AXI_WREADY),
.i_axi_wdata( S_AXI_WDATA),
.i_axi_wstrb( S_AXI_WSTRB),
//
.i_axi_bvalid(S_AXI_BVALID),
.i_axi_bready(S_AXI_BREADY),
.i_axi_bresp( S_AXI_BRESP),
//
.i_axi_arvalid(S_AXI_ARVALID),
.i_axi_arready(S_AXI_ARREADY),
.i_axi_araddr( S_AXI_ARADDR),
.i_axi_arcache(4'h0),
.i_axi_arprot( S_AXI_ARPROT),
//
.i_axi_rvalid(S_AXI_RVALID),
.i_axi_rready(S_AXI_RREADY),
.i_axi_rdata( S_AXI_RDATA),
.i_axi_rresp( S_AXI_RRESP),
//
.f_axi_rd_outstanding(faxil_rd_outstanding),
.f_axi_wr_outstanding(faxil_wr_outstanding),
.f_axi_awr_outstanding(faxil_awr_outstanding)
// }}}
);
always @(*)
if (S_AXI_ARESETN)
begin
if (S_AXI_AWVALID)
assert(S_AXI_AWREADY == uut_AWREADY);
if (S_AXI_WVALID)
assert(S_AXI_WREADY == uut_WREADY);
if (S_AXI_ARVALID)
assert(S_AXI_ARREADY == uut_ARREADY);
assert(S_AXI_BVALID == uut_BVALID);
assert(S_AXI_RVALID == uut_RVALID);
if (S_AXI_BVALID)
assert( S_AXI_BRESP == uut_BRESP );
if (S_AXI_RVALID)
assert({ S_AXI_RRESP, S_AXI_RDATA }
== { uut_RRESP, uut_RDATA });
end
// }}}
// }}}
`endif
endmodule