summaryrefslogtreecommitdiff
path: root/rtl/wb2axip/wbc2pipeline.v
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/wb2axip/wbc2pipeline.v')
-rw-r--r--rtl/wb2axip/wbc2pipeline.v188
1 files changed, 188 insertions, 0 deletions
diff --git a/rtl/wb2axip/wbc2pipeline.v b/rtl/wb2axip/wbc2pipeline.v
new file mode 100644
index 0000000..ad6a11c
--- /dev/null
+++ b/rtl/wb2axip/wbc2pipeline.v
@@ -0,0 +1,188 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Filename: wbc2pipeline.v
+// {{{
+// Project: WB2AXIPSP: bus bridges and other odds and ends
+//
+// Purpose: Takes a WB classic connection from a master, and converts it
+// to WB pipelined for the slave.
+//
+// If you don't see an `ifdef FORMAL section below, then this core hasn't
+// (yet) been formally verified. Use it at your own risk.
+//
+// Creator: Dan Gisselquist, Ph.D.
+// Gisselquist Technology, LLC
+//
+////////////////////////////////////////////////////////////////////////////////
+// }}}
+// Copyright (C) 2019-2024, 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 wbc2pipeline #(
+ // {{{
+ parameter AW = 12,
+ DW = 32
+ // }}}
+ ) (
+ // {{{
+ //
+ input wire i_clk, i_reset,
+ //
+ // Incoming WB classic port
+ input wire i_scyc, i_sstb, i_swe,
+ input wire [AW-1:0] i_saddr,
+ input wire [DW-1:0] i_sdata,
+ input wire [DW/8-1:0] i_ssel,
+ output reg o_sack,
+ output reg [DW-1:0] o_sdata,
+ output reg o_serr,
+ input wire [3-1:0] i_scti,
+ input wire [2-1:0] i_sbte,
+ //
+ // Outgoing WB pipelined port
+ output reg o_mcyc, o_mstb, o_mwe,
+ output reg [AW-1:0] o_maddr,
+ output reg [DW-1:0] o_mdata,
+ output reg [DW/8-1:0] o_msel,
+ input wire i_mstall,
+ input wire i_mack,
+ input wire [DW-1:0] i_mdata,
+ input wire i_merr
+ // }}}
+ );
+
+ reg last_stb;
+
+ // last_stb
+ // {{{
+ initial last_stb = 0;
+ always @(posedge i_clk)
+ if (i_reset || !i_sstb || o_sack || o_serr)
+ last_stb <= 0;
+ else if (!i_mstall)
+ last_stb <= 1;
+ // }}}
+
+ // Combinatorial assignments to the downstream port
+ // {{{
+ always @(*)
+ begin
+ o_mcyc = i_scyc && (!o_serr);
+ o_mstb = i_sstb & !last_stb && (!o_serr);
+ o_mwe = i_swe;
+ o_maddr = i_saddr;
+ o_mdata = i_sdata;
+ o_msel = i_ssel;
+ end
+ // }}}
+
+ // o_sack, o_serr
+ // {{{
+ initial o_sack = 0;
+ initial o_serr = 0;
+ always @(posedge i_clk)
+ if (i_reset || !i_sstb || o_sack || o_serr)
+ begin
+ o_sack <= 0;
+ o_serr <= 0;
+ end else begin
+ if (i_mack)
+ o_sack <= 1;
+ if (i_merr)
+ o_serr <= 1;
+ end
+ // }}}
+
+ // o_sdata
+ // {{{
+ always @(posedge i_clk)
+ if (i_mack)
+ o_sdata <= i_mdata;
+ // }}}
+
+ // Make Verilator happy
+ // {{{
+ // Verilator lint_off UNUSED
+ wire [4:0] unused;
+ assign unused = { i_scti, i_sbte };
+ // Verilator lint_on UNUSED
+ // }}}
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+//
+// Formal properties
+// {{{
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+`ifdef FORMAL
+ ////////////////////////////////////////////////////////////////////////
+ //
+ //
+ //
+ ////////////////////////////////////////////////////////////////////////
+ //
+ //
+ localparam F_LGDEPTH = 1;
+ reg [F_LGDEPTH-1:0] f_nreqs, f_nacks, f_outstanding;
+
+ reg f_past_valid;
+ initial f_past_valid = 0;
+ always @(posedge i_clk)
+ f_past_valid = 1;
+
+ always @(*)
+ if (!f_past_valid)
+ assume(i_reset);
+
+ ////////////////////////////////////////////////////////////////////////
+ //
+ // Upstream Wishbone classic slave properties
+ // {{{
+ ////////////////////////////////////////////////////////////////////////
+ //
+ fwbc_slave #(.AW(AW), .DW(DW)) incoming (i_clk, i_reset,
+ i_scyc, i_sstb, i_swe, i_saddr, i_sdata, i_ssel,
+ i_scti, i_sbte,
+ o_sack, o_sdata, o_serr, 1'b0);
+ // }}}
+ ////////////////////////////////////////////////////////////////////////
+ //
+ // Downstream Wishbone pipeline slave properties
+ // {{{
+ ////////////////////////////////////////////////////////////////////////
+ //
+ fwb_master #(.AW(AW), .DW(DW),
+ .F_MAX_STALL(3),
+ .F_MAX_ACK_DELAY(3),
+ .F_LGDEPTH(1)) pipelined (i_clk, i_reset,
+ o_mcyc, o_mstb, o_mwe, o_maddr, o_mdata, o_msel,
+ i_mack, i_mstall, i_mdata, i_merr,
+ f_nreqs, f_nacks, f_outstanding);
+ // }}}
+`endif
+// }}}
+endmodule
+`ifndef YOSYS
+`default_nettype wire
+`endif