mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Adds FSM to LSU which will handle the interactions between the hptw and dcache. This will dramatically simplify the dcache by removing all walker states.
This commit is contained in:
parent
1126135b80
commit
cd3c1032b7
@ -129,6 +129,107 @@ module lsu
|
|||||||
|
|
||||||
assign AnyCPUReqM = (|MemRWM) | (|AtomicM);
|
assign AnyCPUReqM = (|MemRWM) | (|AtomicM);
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {STATE_T0_READY,
|
||||||
|
STATE_T0_REPLAY,
|
||||||
|
STATE_T0_FAULT_REPLAY,
|
||||||
|
STATE_T3_DTLB_MISS,
|
||||||
|
STATE_T4_ITLB_MISS,
|
||||||
|
STATE_T5_ITLB_MISS,
|
||||||
|
STATE_T7_DITLB_MISS} statetype;
|
||||||
|
|
||||||
|
statetype CurrState, NextState;
|
||||||
|
logic InterlockStall;
|
||||||
|
logic SelReplayCPURequest;
|
||||||
|
logic SelPTW2;
|
||||||
|
logic WalkerInstrPageFaultRaw;
|
||||||
|
|
||||||
|
|
||||||
|
always_ff @(posedge clk)
|
||||||
|
if (reset) CurrState <= #1 STATE_T0_READY;
|
||||||
|
else CurrState <= #1 NextState;
|
||||||
|
|
||||||
|
always_comb begin
|
||||||
|
case(CurrState)
|
||||||
|
STATE_T0_READY: begin
|
||||||
|
if(~ITLBMissF & DTLBMissM & AnyCPUReqM) begin
|
||||||
|
NextState = STATE_T3_DTLB_MISS;
|
||||||
|
end
|
||||||
|
else if(ITLBMissF & ~DTLBMissM & ~AnyCPUReqM) begin
|
||||||
|
NextState = STATE_T4_ITLB_MISS;
|
||||||
|
end
|
||||||
|
else if(ITLBMissF & ~DTLBMissM & AnyCPUReqM) begin
|
||||||
|
NextState = STATE_T5_ITLB_MISS;
|
||||||
|
end
|
||||||
|
else if(ITLBMissF & DTLBMissM & AnyCPUReqM) begin
|
||||||
|
NextState = STATE_T7_DITLB_MISS;
|
||||||
|
end else begin
|
||||||
|
NextState = STATE_T0_READY;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
STATE_T0_REPLAY: begin
|
||||||
|
if(DCacheStall) begin
|
||||||
|
NextState = STATE_T0_REPLAY;
|
||||||
|
end else begin
|
||||||
|
NextState = STATE_T0_READY;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
STATE_T3_DTLB_MISS: begin
|
||||||
|
if(WalkerLoadPageFaultM | WalkerStorePageFaultM) begin
|
||||||
|
NextState = STATE_T0_READY;
|
||||||
|
end else if(DTLBWriteM) begin
|
||||||
|
NextState = STATE_T0_REPLAY;
|
||||||
|
end else begin
|
||||||
|
NextState = STATE_T3_DTLB_MISS;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
STATE_T4_ITLB_MISS: begin
|
||||||
|
if(WalkerInstrPageFaultRaw | ITLBWriteF) begin
|
||||||
|
NextState = STATE_T0_READY;
|
||||||
|
end else begin
|
||||||
|
NextState = STATE_T4_ITLB_MISS;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
STATE_T5_ITLB_MISS: begin
|
||||||
|
if(ITLBWriteF) begin
|
||||||
|
NextState = STATE_T0_REPLAY;
|
||||||
|
end else if(WalkerInstrPageFaultRaw) begin
|
||||||
|
NextState = STATE_T0_FAULT_REPLAY;
|
||||||
|
end else begin
|
||||||
|
NextState = STATE_T5_ITLB_MISS;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
STATE_T0_FAULT_REPLAY: begin
|
||||||
|
if(DCacheStall) begin
|
||||||
|
NextState = STATE_T0_FAULT_REPLAY;
|
||||||
|
end else begin
|
||||||
|
NextState = STATE_T0_READY;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
STATE_T7_DITLB_MISS: begin
|
||||||
|
if(WalkerStorePageFaultM | WalkerLoadPageFaultM) begin
|
||||||
|
NextState = STATE_T0_READY;
|
||||||
|
end else if(DTLBWriteM) begin
|
||||||
|
NextState = STATE_T5_ITLB_MISS;
|
||||||
|
end else begin
|
||||||
|
NextState = STATE_T7_DITLB_MISS;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
default: begin
|
||||||
|
NextState = STATE_T0_READY;
|
||||||
|
end
|
||||||
|
endcase
|
||||||
|
end // always_comb
|
||||||
|
|
||||||
|
// signal to CPU it needs to wait on HPTW.
|
||||||
|
assign InterlockStall = (NextState != STATE_T0_READY) | (NextState != STATE_T0_FAULT_REPLAY) | (NextState != STATE_T0_READY);
|
||||||
|
// When replaying CPU memory request after PTW select the IEUAdrM for correct address.
|
||||||
|
assign SelReplayCPURequest = NextState == STATE_T0_READY;
|
||||||
|
assign SelPTW2 = (CurrState == STATE_T3_DTLB_MISS) | (CurrState == STATE_T4_ITLB_MISS) |
|
||||||
|
(CurrState == STATE_T5_ITLB_MISS) | (CurrState == STATE_T7_DITLB_MISS);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
flopenrc #(`XLEN) AddressMReg(clk, reset, FlushM, ~StallM, IEUAdrE, MemAdrM);
|
flopenrc #(`XLEN) AddressMReg(clk, reset, FlushM, ~StallM, IEUAdrE, MemAdrM);
|
||||||
|
|
||||||
// *** add generate to conditionally create hptw, lsuArb, and mmu
|
// *** add generate to conditionally create hptw, lsuArb, and mmu
|
||||||
|
Loading…
Reference in New Issue
Block a user