From 83c52e67444b2abc31571733595c8ea58663064a Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Tue, 23 Dec 2025 17:37:36 -0800 Subject: [PATCH] axi: Add AXI-lite tie modules Signed-off-by: Alex Forencich --- src/axi/rtl/taxi_axil_tie.f | 4 ++ src/axi/rtl/taxi_axil_tie.sv | 61 +++++++++++++++++++++++++++++ src/axi/rtl/taxi_axil_tie_rd.sv | 61 +++++++++++++++++++++++++++++ src/axi/rtl/taxi_axil_tie_wr.sv | 69 +++++++++++++++++++++++++++++++++ 4 files changed, 195 insertions(+) create mode 100644 src/axi/rtl/taxi_axil_tie.f create mode 100644 src/axi/rtl/taxi_axil_tie.sv create mode 100644 src/axi/rtl/taxi_axil_tie_rd.sv create mode 100644 src/axi/rtl/taxi_axil_tie_wr.sv diff --git a/src/axi/rtl/taxi_axil_tie.f b/src/axi/rtl/taxi_axil_tie.f new file mode 100644 index 0000000..935d61b --- /dev/null +++ b/src/axi/rtl/taxi_axil_tie.f @@ -0,0 +1,4 @@ +taxi_axil_tie.sv +taxi_axil_tie_wr.sv +taxi_axil_tie_rd.sv +taxi_axil_if.sv diff --git a/src/axi/rtl/taxi_axil_tie.sv b/src/axi/rtl/taxi_axil_tie.sv new file mode 100644 index 0000000..42829a9 --- /dev/null +++ b/src/axi/rtl/taxi_axil_tie.sv @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +/* + +Copyright (c) 2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4 lite tie + */ +module taxi_axil_tie +( + /* + * AXI4 lite slave interface + */ + taxi_axil_if.wr_slv s_axil_wr, + taxi_axil_if.rd_slv s_axil_rd, + + /* + * AXI4 lite master interface + */ + taxi_axil_if.wr_mst m_axil_wr, + taxi_axil_if.rd_mst m_axil_rd +); + +taxi_axil_tie_wr +wr_inst ( + /* + * AXI4 lite slave interface + */ + .s_axil_wr(s_axil_wr), + + /* + * AXI4 lite master interface + */ + .m_axil_wr(m_axil_wr) +); + +taxi_axil_tie_rd +rd_inst ( + /* + * AXI4 lite slave interface + */ + .s_axil_rd(s_axil_rd), + + /* + * AXI4 lite master interface + */ + .m_axil_rd(m_axil_rd) +); + +endmodule + +`resetall diff --git a/src/axi/rtl/taxi_axil_tie_rd.sv b/src/axi/rtl/taxi_axil_tie_rd.sv new file mode 100644 index 0000000..a0fea61 --- /dev/null +++ b/src/axi/rtl/taxi_axil_tie_rd.sv @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +/* + +Copyright (c) 2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4 lite tie (read) + */ +module taxi_axil_tie_rd +( + /* + * AXI4 lite slave interface + */ + taxi_axil_if.rd_slv s_axil_rd, + + /* + * AXI4 lite master interface + */ + taxi_axil_if.rd_mst m_axil_rd +); + +// extract parameters +localparam DATA_W = s_axil_rd.DATA_W; +localparam ADDR_W = s_axil_rd.ADDR_W; +localparam STRB_W = s_axil_rd.STRB_W; +localparam logic ARUSER_EN = s_axil_rd.ARUSER_EN && m_axil_rd.ARUSER_EN; +localparam ARUSER_W = s_axil_rd.ARUSER_W; +localparam logic RUSER_EN = s_axil_rd.RUSER_EN && m_axil_rd.RUSER_EN; +localparam RUSER_W = s_axil_rd.RUSER_W; + +// check configuration +if (m_axil_rd.DATA_W != DATA_W) + $fatal(0, "Error: Interface DATA_W parameter mismatch (instance %m)"); + +if (m_axil_rd.STRB_W != STRB_W) + $fatal(0, "Error: Interface STRB_W parameter mismatch (instance %m)"); + +assign m_axil_rd.araddr = s_axil_rd.araddr; +assign m_axil_rd.arprot = s_axil_rd.arprot; +assign m_axil_rd.aruser = ARUSER_EN ? s_axil_rd.aruser : '0; +assign m_axil_rd.arvalid = s_axil_rd.arvalid; +assign s_axil_rd.arready = m_axil_rd.arready; + +assign s_axil_rd.rdata = m_axil_rd.rdata; +assign s_axil_rd.rresp = m_axil_rd.rresp; +assign s_axil_rd.ruser = RUSER_EN ? m_axil_rd.ruser : '0; +assign s_axil_rd.rvalid = m_axil_rd.rvalid; +assign m_axil_rd.rready = s_axil_rd.rready; + +endmodule + +`resetall diff --git a/src/axi/rtl/taxi_axil_tie_wr.sv b/src/axi/rtl/taxi_axil_tie_wr.sv new file mode 100644 index 0000000..98fe7db --- /dev/null +++ b/src/axi/rtl/taxi_axil_tie_wr.sv @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +/* + +Copyright (c) 2025 FPGA Ninja, LLC + +Authors: +- Alex Forencich + +*/ + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * AXI4 lite tie (write) + */ +module taxi_axil_tie_wr +( + /* + * AXI4 lite slave interface + */ + taxi_axil_if.wr_slv s_axil_wr, + + /* + * AXI4 lite master interface + */ + taxi_axil_if.wr_mst m_axil_wr +); + +// extract parameters +localparam DATA_W = s_axil_wr.DATA_W; +localparam ADDR_W = s_axil_wr.ADDR_W; +localparam STRB_W = s_axil_wr.STRB_W; +localparam logic AWUSER_EN = s_axil_wr.AWUSER_EN && m_axil_wr.AWUSER_EN; +localparam AWUSER_W = s_axil_wr.AWUSER_W; +localparam logic WUSER_EN = s_axil_wr.WUSER_EN && m_axil_wr.WUSER_EN; +localparam WUSER_W = s_axil_wr.WUSER_W; +localparam logic BUSER_EN = s_axil_wr.BUSER_EN && m_axil_wr.BUSER_EN; +localparam BUSER_W = s_axil_wr.BUSER_W; + +// check configuration +if (m_axil_wr.DATA_W != DATA_W) + $fatal(0, "Error: Interface DATA_W parameter mismatch (instance %m)"); + +if (m_axil_wr.STRB_W != STRB_W) + $fatal(0, "Error: Interface STRB_W parameter mismatch (instance %m)"); + +// bypass AW channel +assign m_axil_wr.awaddr = s_axil_wr.awaddr; +assign m_axil_wr.awprot = s_axil_wr.awprot; +assign m_axil_wr.awuser = AWUSER_EN ? s_axil_wr.awuser : '0; +assign m_axil_wr.awvalid = s_axil_wr.awvalid; +assign s_axil_wr.awready = m_axil_wr.awready; + +assign m_axil_wr.wdata = s_axil_wr.wdata; +assign m_axil_wr.wstrb = s_axil_wr.wstrb; +assign m_axil_wr.wuser = WUSER_EN ? s_axil_wr.wuser : '0; +assign m_axil_wr.wvalid = s_axil_wr.wvalid; +assign s_axil_wr.wready = m_axil_wr.wready; + +assign s_axil_wr.bresp = m_axil_wr.bresp; +assign s_axil_wr.buser = BUSER_EN ? m_axil_wr.buser : '0; +assign s_axil_wr.bvalid = m_axil_wr.bvalid; +assign m_axil_wr.bready = s_axil_wr.bready; + +endmodule + +`resetall