blob: e35b905cae955566f35380eeff0e0f29e31699f1 [file] [log] [blame]
module Top (
clk,
rst,
en,
OUT_halt
);
input wire clk;
input wire rst;
input wire en;
output wire OUT_halt;
wire [1:0] MC_DC_used;
wire [67:0] MC_DC_if [1:0];
wire MC_ce;
wire MC_we;
wire [0:0] MC_cacheID;
wire [9:0] MC_sramAddr;
wire [29:0] MC_extAddr;
wire [9:0] MC_progress;
wire MC_busy;
wire [31:0] DC_dataOut;
wire [31:0] EXTMEM_busOut;
wire EXTMEM_oen;
wire [31:0] EXTMEM_bus = (EXTMEM_oen ? EXTMEM_busOut : 32'bzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz);
wire EXTMEM_en;
MemoryController memc(
.clk(clk),
.rst(rst),
.IN_ce(MC_ce),
.IN_we(MC_we),
.IN_cacheID(MC_cacheID),
.IN_sramAddr(MC_sramAddr),
.IN_extAddr(MC_extAddr),
.OUT_progress(MC_progress),
.OUT_busy(MC_busy),
.OUT_CACHE_used(MC_DC_used),
.OUT_CACHE_we({MC_DC_if[1][66], MC_DC_if[0][66]}),
.OUT_CACHE_ce({MC_DC_if[1][67], MC_DC_if[0][67]}),
.OUT_CACHE_wm({MC_DC_if[1][65-:4], MC_DC_if[0][65-:4]}),
.OUT_CACHE_addr({MC_DC_if[1][41:32], MC_DC_if[0][41:32]}),
.OUT_CACHE_data({MC_DC_if[1][31-:32], MC_DC_if[0][31-:32]}),
.IN_CACHE_data({32'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, DC_dataOut}),
.OUT_EXT_oen(EXTMEM_oen),
.OUT_EXT_en(EXTMEM_en),
.OUT_EXT_bus(EXTMEM_busOut),
.IN_EXT_bus(EXTMEM_bus)
);
assign MC_DC_if[0][61:42] = 0;
ExternalMemorySim extMem(
.clk(clk),
.en(EXTMEM_en && !rst),
.bus(EXTMEM_bus)
);
reg [67:0] CORE_DC_if;
wire [29:0] CORE_writeAddr;
wire [31:0] CORE_writeData;
wire CORE_writeEnable;
wire [3:0] CORE_writeMask;
always @(*) begin
CORE_DC_if[67] = CORE_writeEnable;
CORE_DC_if[66] = CORE_writeEnable;
CORE_DC_if[65-:4] = CORE_writeMask;
CORE_DC_if[61-:30] = CORE_writeAddr;
CORE_DC_if[31-:32] = CORE_writeData;
end
wire CORE_readEnable;
wire [29:0] CORE_readAddr;
wire [31:0] CORE_readData;
wire CORE_instrReadEnable;
wire [27:0] CORE_instrReadAddress;
wire [127:0] CORE_instrReadData;
wire SPI_mosi;
wire SPI_clk;
Core core(
.clk(clk),
.rst(rst),
.en(en),
.IN_instrRaw(CORE_instrReadData),
.OUT_MEM_writeAddr(CORE_writeAddr),
.OUT_MEM_writeData(CORE_writeData),
.OUT_MEM_writeEnable(CORE_writeEnable),
.OUT_MEM_writeMask(CORE_writeMask),
.OUT_MEM_readEnable(CORE_readEnable),
.OUT_MEM_readAddr(CORE_readAddr),
.IN_MEM_readData(CORE_readData),
.OUT_instrAddr(CORE_instrReadAddress),
.OUT_instrReadEnable(CORE_instrReadEnable),
.OUT_halt(OUT_halt),
.OUT_SPI_clk(SPI_clk),
.OUT_SPI_mosi(SPI_mosi),
.IN_SPI_miso(1'b0),
.OUT_MC_ce(MC_ce),
.OUT_MC_we(MC_we),
.OUT_MC_cacheID(MC_cacheID),
.OUT_MC_sramAddr(MC_sramAddr),
.OUT_MC_extAddr(MC_extAddr),
.IN_MC_progress(MC_progress),
.IN_MC_busy(MC_busy)
);
integer spiCnt = 0;
reg [7:0] spiByte = 0;
always @(posedge SPI_clk) begin
spiByte = {spiByte[6:0], SPI_mosi};
spiCnt = spiCnt + 1;
if (spiCnt == 8) begin
$write("%c", spiByte);
spiCnt = 0;
end
end
wire [67:0] DC_if;
assign DC_if = (MC_DC_used[0] ? MC_DC_if[0] : CORE_DC_if);
MemRTL dcache(
.clk(clk),
.IN_nce(!(!DC_if[67] && (DC_if[61-:30] < 1024))),
.IN_nwe(DC_if[66]),
.IN_addr(DC_if[41:32]),
.IN_data(DC_if[31-:32]),
.IN_wm(DC_if[65-:4]),
.OUT_data(DC_dataOut),
.IN_nce1(!(!CORE_readEnable && (CORE_readAddr < 1024))),
.IN_addr1(CORE_readAddr[9:0]),
.OUT_data1(CORE_readData)
);
MemRTL #(
.WORD_SIZE(64),
.NUM_WORDS(512)
) icache(
.clk(clk),
.IN_nce((MC_DC_used[1] ? MC_DC_if[1][67] : CORE_instrReadEnable)),
.IN_nwe((MC_DC_used[1] ? MC_DC_if[1][66] : 1'b1)),
.IN_addr((MC_DC_used[1] ? MC_DC_if[1][41:33] : {CORE_instrReadAddress[7:0], 1'b1})),
.IN_data({MC_DC_if[1][31-:32], MC_DC_if[1][31-:32]}),
.IN_wm({{4 {MC_DC_if[1][32]}}, {4 {~MC_DC_if[1][32]}}}),
.OUT_data(CORE_instrReadData[127:64]),
.IN_nce1(CORE_instrReadEnable),
.IN_addr1({CORE_instrReadAddress[7:0], 1'b0}),
.OUT_data1(CORE_instrReadData[63:0])
);
endmodule