120 lines
4.5 KiB
Systemverilog
120 lines
4.5 KiB
Systemverilog
// Generated by CIRCT firtool-1.139.0
|
|
module LSU(
|
|
input clock,
|
|
reset,
|
|
io_reqValid,
|
|
input [63:0] io_req_addr,
|
|
io_req_data,
|
|
input io_req_isStore,
|
|
io_req_isSigned,
|
|
io_req_isAmo,
|
|
input [4:0] io_req_amoOp,
|
|
input [2:0] io_req_size,
|
|
output io_reqReady,
|
|
input [63:0] io_satp,
|
|
output io_dmemReqValid,
|
|
output [63:0] io_dmemReq_addr,
|
|
io_dmemReq_data,
|
|
output io_dmemReq_isStore,
|
|
output [2:0] io_dmemReq_size,
|
|
input io_dmemRespValid,
|
|
input [63:0] io_dmemRespData,
|
|
output io_respValid,
|
|
output [63:0] io_respData,
|
|
output io_pageFault
|
|
);
|
|
|
|
wire _dcache_io_reqReady;
|
|
wire _dcache_io_memReqValid;
|
|
wire [63:0] _dcache_io_memReq_addr;
|
|
wire [63:0] _dcache_io_memReq_data;
|
|
wire _dcache_io_memReq_isStore;
|
|
wire [2:0] _dcache_io_memReq_size;
|
|
wire _dcache_io_respValid;
|
|
wire _mmu_io_resp_pageFault;
|
|
wire _mmu_io_ptwMemReq_valid;
|
|
wire [63:0] _mmu_io_ptwMemReq_addr;
|
|
wire _mmu_io_refill_valid;
|
|
wire [26:0] _mmu_io_refill_vpn;
|
|
wire [43:0] _mmu_io_refill_ppn;
|
|
wire [7:0] _mmu_io_refill_flags;
|
|
wire _dtlb_io_resp_hit;
|
|
wire _dtlb_io_resp_miss;
|
|
wire [63:0] _dtlb_io_resp_paddr;
|
|
wire _dtlb_io_resp_pageFault;
|
|
reg ptwOutstanding;
|
|
wire translationFault = _dtlb_io_resp_pageFault | _mmu_io_resp_pageFault;
|
|
always @(posedge clock) begin
|
|
if (reset)
|
|
ptwOutstanding <= 1'h0;
|
|
else
|
|
ptwOutstanding <=
|
|
_mmu_io_ptwMemReq_valid | ~(io_dmemRespValid & ptwOutstanding) & ptwOutstanding;
|
|
end // always @(posedge)
|
|
DTLB dtlb (
|
|
.clock (clock),
|
|
.reset (reset),
|
|
.io_req_valid (io_reqValid & (|(io_satp[63:60]))),
|
|
.io_req_vaddr (io_req_addr),
|
|
.io_req_isStore (io_req_isStore),
|
|
.io_resp_hit (_dtlb_io_resp_hit),
|
|
.io_resp_miss (_dtlb_io_resp_miss),
|
|
.io_resp_paddr (_dtlb_io_resp_paddr),
|
|
.io_resp_pageFault (_dtlb_io_resp_pageFault),
|
|
.io_refill_valid (_mmu_io_refill_valid),
|
|
.io_refill_vpn (_mmu_io_refill_vpn),
|
|
.io_refill_ppn (_mmu_io_refill_ppn),
|
|
.io_refill_flags (_mmu_io_refill_flags)
|
|
);
|
|
MMU mmu (
|
|
.clock (clock),
|
|
.reset (reset),
|
|
.io_satp (io_satp),
|
|
.io_req_valid (io_reqValid & (|(io_satp[63:60])) & _dtlb_io_resp_miss),
|
|
.io_req_vaddr (io_req_addr),
|
|
.io_req_isStore (io_req_isStore),
|
|
.io_resp_pageFault (_mmu_io_resp_pageFault),
|
|
.io_ptwMemReq_valid (_mmu_io_ptwMemReq_valid),
|
|
.io_ptwMemReq_addr (_mmu_io_ptwMemReq_addr),
|
|
.io_ptwMemResp_valid (io_dmemRespValid & ptwOutstanding),
|
|
.io_ptwMemResp_data (io_dmemRespData),
|
|
.io_refill_valid (_mmu_io_refill_valid),
|
|
.io_refill_vpn (_mmu_io_refill_vpn),
|
|
.io_refill_ppn (_mmu_io_refill_ppn),
|
|
.io_refill_flags (_mmu_io_refill_flags)
|
|
);
|
|
DCache dcache (
|
|
.clock (clock),
|
|
.reset (reset),
|
|
.io_reqValid
|
|
(io_reqValid & (~(|(io_satp[63:60])) | _dtlb_io_resp_hit) & ~translationFault),
|
|
.io_req_addr ((|(io_satp[63:60])) ? _dtlb_io_resp_paddr : io_req_addr),
|
|
.io_req_data (io_req_data),
|
|
.io_req_isStore (io_req_isStore),
|
|
.io_req_isSigned (io_req_isSigned),
|
|
.io_req_isAmo (io_req_isAmo),
|
|
.io_req_amoOp (io_req_amoOp),
|
|
.io_req_size (io_req_size),
|
|
.io_reqReady (_dcache_io_reqReady),
|
|
.io_memReqValid (_dcache_io_memReqValid),
|
|
.io_memReq_addr (_dcache_io_memReq_addr),
|
|
.io_memReq_data (_dcache_io_memReq_data),
|
|
.io_memReq_isStore (_dcache_io_memReq_isStore),
|
|
.io_memReq_size (_dcache_io_memReq_size),
|
|
.io_memRespValid (io_dmemRespValid & ~ptwOutstanding),
|
|
.io_memRespData (io_dmemRespData),
|
|
.io_respValid (_dcache_io_respValid),
|
|
.io_respData (io_respData)
|
|
);
|
|
assign io_reqReady = _dcache_io_reqReady & ~ptwOutstanding;
|
|
assign io_dmemReqValid = _mmu_io_ptwMemReq_valid | _dcache_io_memReqValid;
|
|
assign io_dmemReq_addr =
|
|
_mmu_io_ptwMemReq_valid ? _mmu_io_ptwMemReq_addr : _dcache_io_memReq_addr;
|
|
assign io_dmemReq_data = _mmu_io_ptwMemReq_valid ? 64'h0 : _dcache_io_memReq_data;
|
|
assign io_dmemReq_isStore = ~_mmu_io_ptwMemReq_valid & _dcache_io_memReq_isStore;
|
|
assign io_dmemReq_size = _mmu_io_ptwMemReq_valid ? 3'h3 : _dcache_io_memReq_size;
|
|
assign io_respValid = _dcache_io_respValid | translationFault;
|
|
assign io_pageFault = translationFault;
|
|
endmodule
|
|
|