186 lines
7.3 KiB
Systemverilog
186 lines
7.3 KiB
Systemverilog
//==========================================================
|
|
// Module: alibaba_pcie_top_regs
|
|
// Description: CPU Interface Bus Decoder
|
|
// Author: PeakRDL-BusDecoder
|
|
// License: LGPL-3.0
|
|
// Date: 2025-11-22
|
|
// Version: 0.5.0
|
|
// Links:
|
|
// - https://github.com/arnavsacheti/PeakRDL-BusDecoder
|
|
//==========================================================
|
|
|
|
|
|
module alibaba_pcie_top_regs (
|
|
input logic s_apb_PCLK,
|
|
input logic s_apb_PRESETn,
|
|
input logic s_apb_PSEL,
|
|
input logic s_apb_PENABLE,
|
|
input logic s_apb_PWRITE,
|
|
input logic [8:0] s_apb_PADDR,
|
|
input logic [2:0] s_apb_PPROT,
|
|
input logic [31:0] s_apb_PWDATA,
|
|
input logic [3:0] s_apb_PSTRB,
|
|
output logic [31:0] s_apb_PRDATA,
|
|
output logic s_apb_PREADY,
|
|
output logic s_apb_PSLVERR,
|
|
output logic m_apb_pcie_top_regs_PCLK,
|
|
output logic m_apb_pcie_top_regs_PRESETn,
|
|
output logic m_apb_pcie_top_regs_PSEL,
|
|
output logic m_apb_pcie_top_regs_PENABLE,
|
|
output logic m_apb_pcie_top_regs_PWRITE,
|
|
output logic [5:0] m_apb_pcie_top_regs_PADDR,
|
|
output logic [2:0] m_apb_pcie_top_regs_PPROT,
|
|
output logic [31:0] m_apb_pcie_top_regs_PWDATA,
|
|
output logic [3:0] m_apb_pcie_top_regs_PSTRB,
|
|
input logic [31:0] m_apb_pcie_top_regs_PRDATA,
|
|
input logic m_apb_pcie_top_regs_PREADY,
|
|
input logic m_apb_pcie_top_regs_PSLVERR,
|
|
output logic m_apb_eth_dma_wrapper_regs_PCLK,
|
|
output logic m_apb_eth_dma_wrapper_regs_PRESETn,
|
|
output logic m_apb_eth_dma_wrapper_regs_PSEL,
|
|
output logic m_apb_eth_dma_wrapper_regs_PENABLE,
|
|
output logic m_apb_eth_dma_wrapper_regs_PWRITE,
|
|
output logic [7:0] m_apb_eth_dma_wrapper_regs_PADDR,
|
|
output logic [2:0] m_apb_eth_dma_wrapper_regs_PPROT,
|
|
output logic [31:0] m_apb_eth_dma_wrapper_regs_PWDATA,
|
|
output logic [3:0] m_apb_eth_dma_wrapper_regs_PSTRB,
|
|
input logic [31:0] m_apb_eth_dma_wrapper_regs_PRDATA,
|
|
input logic m_apb_eth_dma_wrapper_regs_PREADY,
|
|
input logic m_apb_eth_dma_wrapper_regs_PSLVERR
|
|
);
|
|
//--------------------------------------------------------------------------
|
|
// CPU Bus interface logic
|
|
//--------------------------------------------------------------------------
|
|
logic cpuif_req;
|
|
logic cpuif_wr_en;
|
|
logic cpuif_rd_en;
|
|
logic [8:0] cpuif_wr_addr;
|
|
logic [8:0] cpuif_rd_addr;
|
|
|
|
logic cpuif_wr_ack;
|
|
logic cpuif_wr_err;
|
|
logic [31:0] cpuif_wr_data;
|
|
logic [3:0] cpuif_wr_byte_en;
|
|
|
|
logic cpuif_rd_ack;
|
|
logic cpuif_rd_err;
|
|
logic [31:0] cpuif_rd_data;
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Child instance signals
|
|
//--------------------------------------------------------------------------
|
|
typedef struct {
|
|
logic pcie_top_regs;
|
|
logic eth_dma_wrapper_regs;
|
|
logic cpuif_err;
|
|
} cpuif_sel_t;
|
|
cpuif_sel_t cpuif_wr_sel;
|
|
cpuif_sel_t cpuif_rd_sel;
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Slave <-> Internal CPUIF <-> Master
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
assign cpuif_req = s_apb_PSEL;
|
|
assign cpuif_wr_en = s_apb_PWRITE;
|
|
assign cpuif_rd_en = !s_apb_PWRITE;
|
|
|
|
assign cpuif_wr_addr = s_apb_PADDR;
|
|
assign cpuif_rd_addr = s_apb_PADDR;
|
|
|
|
assign cpuif_wr_data = s_apb_PWDATA;
|
|
assign cpuif_wr_byte_en = s_apb_PSTRB;
|
|
|
|
assign s_apb_PRDATA = cpuif_rd_data;
|
|
assign s_apb_PREADY = cpuif_rd_ack;
|
|
assign s_apb_PSLVERR = cpuif_rd_err | cpuif_rd_sel.cpuif_err | cpuif_wr_sel.cpuif_err;
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Fanout CPU Bus interface signals
|
|
//--------------------------------------------------------------------------
|
|
assign m_apb_pcie_top_regs_PSEL = cpuif_wr_sel.pcie_top_regs|cpuif_rd_sel.pcie_top_regs;
|
|
assign m_apb_pcie_top_regs_PENABLE = s_apb_PENABLE;
|
|
assign m_apb_pcie_top_regs_PWRITE = cpuif_wr_sel.pcie_top_regs;
|
|
assign m_apb_pcie_top_regs_PADDR = s_apb_PADDR[5:0];
|
|
assign m_apb_pcie_top_regs_PPROT = s_apb_PPROT;
|
|
assign m_apb_pcie_top_regs_PWDATA = cpuif_wr_data;
|
|
assign m_apb_pcie_top_regs_PSTRB = cpuif_wr_byte_en;
|
|
assign m_apb_eth_dma_wrapper_regs_PSEL = cpuif_wr_sel.eth_dma_wrapper_regs|cpuif_rd_sel.eth_dma_wrapper_regs;
|
|
assign m_apb_eth_dma_wrapper_regs_PENABLE = s_apb_PENABLE;
|
|
assign m_apb_eth_dma_wrapper_regs_PWRITE = cpuif_wr_sel.eth_dma_wrapper_regs;
|
|
assign m_apb_eth_dma_wrapper_regs_PADDR = s_apb_PADDR[7:0];
|
|
assign m_apb_eth_dma_wrapper_regs_PPROT = s_apb_PPROT;
|
|
assign m_apb_eth_dma_wrapper_regs_PWDATA = cpuif_wr_data;
|
|
assign m_apb_eth_dma_wrapper_regs_PSTRB = cpuif_wr_byte_en;
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Fanin CPU Bus interface signals
|
|
//--------------------------------------------------------------------------
|
|
always_comb begin
|
|
cpuif_rd_ack = '0;
|
|
cpuif_rd_err = '0;
|
|
cpuif_rd_data = '0;
|
|
if (cpuif_rd_sel.pcie_top_regs || cpuif_wr_sel.pcie_top_regs) begin
|
|
cpuif_rd_ack = m_apb_pcie_top_regs_PREADY;
|
|
cpuif_rd_err = m_apb_pcie_top_regs_PSLVERR;
|
|
end
|
|
if (cpuif_rd_sel.pcie_top_regs) begin
|
|
cpuif_rd_data = m_apb_pcie_top_regs_PRDATA;
|
|
end
|
|
if (cpuif_rd_sel.eth_dma_wrapper_regs || cpuif_wr_sel.eth_dma_wrapper_regs) begin
|
|
cpuif_rd_ack = m_apb_eth_dma_wrapper_regs_PREADY;
|
|
cpuif_rd_err = m_apb_eth_dma_wrapper_regs_PSLVERR;
|
|
end
|
|
if (cpuif_rd_sel.eth_dma_wrapper_regs) begin
|
|
cpuif_rd_data = m_apb_eth_dma_wrapper_regs_PRDATA;
|
|
end
|
|
end
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Write Address Decoder
|
|
//--------------------------------------------------------------------------
|
|
always_comb begin
|
|
// Default all write select signals to 0
|
|
cpuif_wr_sel = '{default: '0};
|
|
|
|
if (cpuif_req && cpuif_wr_en) begin
|
|
// A write request is pending
|
|
if ((cpuif_wr_addr < (9'h38))) begin
|
|
cpuif_wr_sel.pcie_top_regs = 1'b1;
|
|
end
|
|
else if ((cpuif_wr_addr >= (9'h100)) && (cpuif_wr_addr < (9'h1b8))) begin
|
|
cpuif_wr_sel.eth_dma_wrapper_regs = 1'b1;
|
|
end
|
|
else begin
|
|
cpuif_wr_sel.cpuif_err = 1'b1;
|
|
end
|
|
end else begin
|
|
// No write request, all select signals remain 0
|
|
end
|
|
end
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Read Address Decoder
|
|
//--------------------------------------------------------------------------
|
|
always_comb begin
|
|
// Default all read select signals to 0
|
|
cpuif_rd_sel = '{default: '0};
|
|
|
|
if (cpuif_req && cpuif_rd_en) begin
|
|
// A read request is pending
|
|
if ((cpuif_rd_addr < (9'h38))) begin
|
|
cpuif_rd_sel.pcie_top_regs = 1'b1;
|
|
end
|
|
else if ((cpuif_rd_addr >= (9'h100)) && (cpuif_rd_addr < (9'h1b8))) begin
|
|
cpuif_rd_sel.eth_dma_wrapper_regs = 1'b1;
|
|
end
|
|
else begin
|
|
cpuif_rd_sel.cpuif_err = 1'b1;
|
|
end
|
|
end else begin
|
|
// No read request, all select signals remain 0
|
|
end
|
|
end
|
|
endmodule
|