mirror of
https://github.com/fpganinja/taxi.git
synced 2026-04-07 04:38:42 -07:00
apb: Add APB tie module
Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
71
src/apb/rtl/taxi_apb_tie.sv
Normal file
71
src/apb/rtl/taxi_apb_tie.sv
Normal file
@@ -0,0 +1,71 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
|
||||
Copyright (c) 2026 FPGA Ninja, LLC
|
||||
|
||||
Authors:
|
||||
- Alex Forencich
|
||||
|
||||
*/
|
||||
|
||||
`resetall
|
||||
`timescale 1ns / 1ps
|
||||
`default_nettype none
|
||||
|
||||
/*
|
||||
* APB tie
|
||||
*/
|
||||
module taxi_apb_tie
|
||||
(
|
||||
/*
|
||||
* APB slave interface
|
||||
*/
|
||||
taxi_apb_if.slv s_apb,
|
||||
|
||||
/*
|
||||
* APB master interface
|
||||
*/
|
||||
taxi_apb_if.mst m_apb
|
||||
);
|
||||
|
||||
// extract parameters
|
||||
localparam DATA_W = s_apb.DATA_W;
|
||||
localparam ADDR_W = s_apb.ADDR_W;
|
||||
localparam STRB_W = s_apb.STRB_W;
|
||||
localparam logic PAUSER_EN = s_apb.PAUSER_EN && m_apb.PAUSER_EN;
|
||||
localparam PAUSER_W = s_apb.PAUSER_W;
|
||||
localparam logic PWUSER_EN = s_apb.PWUSER_EN && m_apb.PWUSER_EN;
|
||||
localparam PWUSER_W = s_apb.PWUSER_W;
|
||||
localparam logic PRUSER_EN = s_apb.PRUSER_EN && m_apb.PRUSER_EN;
|
||||
localparam PRUSER_W = s_apb.PRUSER_W;
|
||||
localparam logic PBUSER_EN = s_apb.PBUSER_EN && m_apb.PBUSER_EN;
|
||||
localparam PBUSER_W = s_apb.PBUSER_W;
|
||||
|
||||
// check configuration
|
||||
if (m_apb.ADDR_W > ADDR_W)
|
||||
$fatal(0, "Error: Output ADDR_W is wider than input ADDR_W, cannot access entire address space (instance %m)");
|
||||
|
||||
if (m_apb.DATA_W != DATA_W)
|
||||
$fatal(0, "Error: Interface DATA_W parameter mismatch (instance %m)");
|
||||
|
||||
if (m_apb.STRB_W != STRB_W)
|
||||
$fatal(0, "Error: Interface STRB_W parameter mismatch (instance %m)");
|
||||
|
||||
assign m_apb.paddr = m_apb.ADDR_W'(s_apb.paddr);
|
||||
assign m_apb.pprot = s_apb.pprot;
|
||||
assign m_apb.psel = s_apb.psel;
|
||||
assign m_apb.penable = s_apb.penable;
|
||||
assign m_apb.pwrite = s_apb.pwrite;
|
||||
assign m_apb.pwdata = s_apb.pwdata;
|
||||
assign m_apb.pstrb = s_apb.pstrb;
|
||||
assign s_apb.pready = m_apb.pready;
|
||||
assign s_apb.prdata = m_apb.prdata;
|
||||
assign s_apb.pslverr = m_apb.pslverr;
|
||||
assign m_apb.pauser = PAUSER_EN ? s_apb.pauser : '0;
|
||||
assign m_apb.pwuser = PWUSER_EN ? s_apb.pwuser : '0;
|
||||
assign s_apb.pruser = PRUSER_EN ? m_apb.pruser : '0;
|
||||
assign s_apb.pbuser = PBUSER_EN ? m_apb.pbuser : '0;
|
||||
|
||||
endmodule
|
||||
|
||||
`resetall
|
||||
Reference in New Issue
Block a user