blob: 90c3cfe7382e578ea3e24d85f5caeda4a87e885e [file] [log] [blame]
module LocalMemoryInterface #(
parameter SRAM_ADDRESS_SIZE = 9
)(
input wire clk,
// Core interface
input wire[23:0] coreAddress,
input wire[3:0] coreByteSelect,
input wire coreWriteEnable,
input wire coreReadEnable,
input wire[31:0] coreDataWrite,
output wire[31:0] coreDataRead,
output wire coreBusy,
// WB interface
input wire[23:0] wbAddress,
input wire[3:0] wbByteSelect,
input wire wbWriteEnable,
input wire wbReadEnable,
input wire[31:0] wbDataWrite,
output wire[31:0] wbDataRead,
output wire wbBusy,
// Flash interface
output wire[22:0] flashAddress,
output wire[3:0] flashByteSelect,
output wire flashWriteEnable,
output wire flashReadEnable,
output wire[31:0] flashDataWrite,
input wire[31:0] flashDataRead,
input wire flashBusy,
// SRAM rw port
output wire clk0, // Port clock
output wire[1:0] csb0, // active low chip select
output wire web0, // active low write control
output wire[3:0] wmask0, // write mask
output wire[SRAM_ADDRESS_SIZE-1:0] addr0,
output wire[31:0] din0,
input wire[63:0] dout0,
// SRAM r port
output wire clk1,
output wire[1:0] csb1,
output wire[SRAM_ADDRESS_SIZE-1:0] addr1,
input wire[63:0] dout1
);
assign coreBusy = 1'b0;
// SRAM
wire coreSRAMEnable = coreAddress[23:SRAM_ADDRESS_SIZE+3] == 'b0 && (coreWriteEnable || coreReadEnable);
wire coreSRAMWriteEnable = coreSRAMEnable && coreWriteEnable && !coreReadEnable;
wire wbSRAMEnable = wbAddress[23:SRAM_ADDRESS_SIZE+3] == 'b0 && (wbWriteEnable || wbReadEnable);
wire wbSRAMWriteEnable = wbSRAMEnable && wbWriteEnable && !wbReadEnable;
wire rwPortEnable = coreSRAMEnable || wbSRAMWriteEnable; // Core can perform reads and writes, but only writes are valid from wb
wire rwWriteEnable = coreSRAMWriteEnable || (!coreSRAMEnable && wbSRAMWriteEnable);
wire[SRAM_ADDRESS_SIZE+2:0] rwAddress = coreSRAMEnable ? coreAddress[SRAM_ADDRESS_SIZE+2:2] :
wbSRAMWriteEnable ? wbAddress[SRAM_ADDRESS_SIZE+2:2] : 'b0;
wire rwBankSelect = rwAddress[SRAM_ADDRESS_SIZE+2];
wire rPortEnable = wbSRAMEnable && !wbSRAMWriteEnable;
wire[SRAM_ADDRESS_SIZE+2:0] rAddress = wbAddress[SRAM_ADDRESS_SIZE+2:2];
wire rBankSelect = rAddress[SRAM_ADDRESS_SIZE+2];
assign clk0 = clk;
assign csb0 = { !(rwPortEnable && rwBankSelect), !(rwPortEnable && !rwBankSelect) };
assign web0 = !rwWriteEnable;
assign wmask0 = coreSRAMEnable ? coreByteSelect :
wbSRAMWriteEnable ? wbByteSelect : 4'b0;
assign addr0 = rwAddress[SRAM_ADDRESS_SIZE+1:2];
assign din0 = coreSRAMWriteEnable ? coreDataWrite :
wbSRAMWriteEnable ? wbDataWrite : 32'b0;
assign coreDataRead = rwBankSelect ? dout0[63:32] : dout0[31:0];
assign clk1 = clk;
assign csb1 = { !(rPortEnable && rBankSelect), !(rPortEnable && !rBankSelect) };
assign addr1 = rAddress[SRAM_ADDRESS_SIZE+1:2];
assign wbDataRead = rBankSelect ? dout1[63:32] : dout1[31:0];
assign wbBusy = wbSRAMEnable && wbSRAMWriteEnable;
endmodule