mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-03 10:15:19 +00:00
Removed all possilbe paths to PreSelAdr from TrapM.
This commit is contained in:
parent
459cd3c450
commit
911ee36b22
6
pipelined/src/cache/cache.sv
vendored
6
pipelined/src/cache/cache.sv
vendored
@ -49,7 +49,8 @@ module cache #(parameter LINELEN, NUMLINES, NUMWAYS, DCACHE = 1) (
|
|||||||
output logic CacheAccess,
|
output logic CacheAccess,
|
||||||
output logic save, restore,
|
output logic save, restore,
|
||||||
// lsu control
|
// lsu control
|
||||||
input logic IgnoreRequest,
|
input logic IgnoreRequestTLB,
|
||||||
|
input logic IgnoreRequestTrapM,
|
||||||
// Bus fsm interface
|
// Bus fsm interface
|
||||||
output logic CacheFetchLine,
|
output logic CacheFetchLine,
|
||||||
output logic CacheWriteLine,
|
output logic CacheWriteLine,
|
||||||
@ -182,6 +183,7 @@ module cache #(parameter LINELEN, NUMLINES, NUMWAYS, DCACHE = 1) (
|
|||||||
// Write Path: Write Enables
|
// Write Path: Write Enables
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// *** change to structural
|
||||||
assign SelectedWay = SelFlush ? FlushWay : (FSMLineWriteEn ? VictimWay : WayHit);
|
assign SelectedWay = SelFlush ? FlushWay : (FSMLineWriteEn ? VictimWay : WayHit);
|
||||||
assign SetValidWay = SetValid ? SelectedWay : '0;
|
assign SetValidWay = SetValid ? SelectedWay : '0;
|
||||||
assign ClearValidWay = ClearValid ? SelectedWay : '0;
|
assign ClearValidWay = ClearValid ? SelectedWay : '0;
|
||||||
@ -196,7 +198,7 @@ module cache #(parameter LINELEN, NUMLINES, NUMWAYS, DCACHE = 1) (
|
|||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
cachefsm cachefsm(.clk, .reset, .CacheFetchLine, .CacheWriteLine, .CacheBusAck,
|
cachefsm cachefsm(.clk, .reset, .CacheFetchLine, .CacheWriteLine, .CacheBusAck,
|
||||||
.RW, .Atomic, .CPUBusy, .IgnoreRequest,
|
.RW, .Atomic, .CPUBusy, .IgnoreRequestTLB, .IgnoreRequestTrapM,
|
||||||
.CacheHit, .VictimDirty, .CacheStall, .CacheCommitted,
|
.CacheHit, .VictimDirty, .CacheStall, .CacheCommitted,
|
||||||
.CacheMiss, .CacheAccess, .SelAdr, .SetValid,
|
.CacheMiss, .CacheAccess, .SelAdr, .SetValid,
|
||||||
.ClearValid, .SetDirty, .ClearDirty, .FSMWordWriteEn,
|
.ClearValid, .SetDirty, .ClearDirty, .FSMWordWriteEn,
|
||||||
|
51
pipelined/src/cache/cachefsm.sv
vendored
51
pipelined/src/cache/cachefsm.sv
vendored
@ -40,7 +40,8 @@ module cachefsm
|
|||||||
// hazard inputs
|
// hazard inputs
|
||||||
input logic CPUBusy,
|
input logic CPUBusy,
|
||||||
// interlock fsm
|
// interlock fsm
|
||||||
input logic IgnoreRequest,
|
input logic IgnoreRequestTLB,
|
||||||
|
input logic IgnoreRequestTrapM,
|
||||||
// Bus inputs
|
// Bus inputs
|
||||||
input logic CacheBusAck,
|
input logic CacheBusAck,
|
||||||
// dcache internals
|
// dcache internals
|
||||||
@ -79,6 +80,7 @@ module cachefsm
|
|||||||
|
|
||||||
logic [1:0] PreSelAdr;
|
logic [1:0] PreSelAdr;
|
||||||
logic resetDelay;
|
logic resetDelay;
|
||||||
|
logic Read, Write, AMO;
|
||||||
logic DoAMO, DoRead, DoWrite, DoFlush;
|
logic DoAMO, DoRead, DoWrite, DoFlush;
|
||||||
logic DoAMOHit, DoReadHit, DoWriteHit;
|
logic DoAMOHit, DoReadHit, DoWriteHit;
|
||||||
logic DoAMOMiss, DoReadMiss, DoWriteMiss;
|
logic DoAMOMiss, DoReadMiss, DoWriteMiss;
|
||||||
@ -104,15 +106,23 @@ module cachefsm
|
|||||||
STATE_FLUSH_CLEAR_DIRTY} statetype;
|
STATE_FLUSH_CLEAR_DIRTY} statetype;
|
||||||
|
|
||||||
(* mark_debug = "true" *) statetype CurrState, NextState;
|
(* mark_debug = "true" *) statetype CurrState, NextState;
|
||||||
|
logic IgnoreRequest;
|
||||||
|
assign IgnoreRequest = IgnoreRequestTLB | IgnoreRequestTrapM;
|
||||||
|
|
||||||
assign DoFlush = FlushCache & ~IgnoreRequest; // *** have to fix ignorerequest timing path
|
// if the command is used in the READY state then the cache needs to be able to supress
|
||||||
assign DoAMO = Atomic[1] & (&RW) & ~IgnoreRequest; // ***
|
// using both IgnoreRequestTLB and IgnoreRequestTrapM. Otherwise we can just use IgnoreRequestTLB.
|
||||||
|
|
||||||
|
assign DoFlush = FlushCache & ~IgnoreRequest;
|
||||||
|
assign AMO = Atomic[1] & (&RW);
|
||||||
|
assign DoAMO = AMO & ~IgnoreRequest; // ***
|
||||||
assign DoAMOHit = DoAMO & CacheHit;
|
assign DoAMOHit = DoAMO & CacheHit;
|
||||||
assign DoAMOMiss = DoAMO & ~CacheHit;
|
assign DoAMOMiss = DoAMO & ~CacheHit;
|
||||||
assign DoRead = RW[1] & ~IgnoreRequest; // ***
|
assign Read = RW[1];
|
||||||
|
assign DoRead = Read & ~IgnoreRequest; // ***
|
||||||
assign DoReadHit = DoRead & CacheHit;
|
assign DoReadHit = DoRead & CacheHit;
|
||||||
assign DoReadMiss = DoRead & ~CacheHit;
|
assign DoReadMiss = DoRead & ~CacheHit;
|
||||||
assign DoWrite = RW[0] & ~IgnoreRequest; // ***
|
assign Write = RW[0];
|
||||||
|
assign DoWrite = Write & ~IgnoreRequest; // ***
|
||||||
assign DoWriteHit = DoWrite & CacheHit;
|
assign DoWriteHit = DoWrite & CacheHit;
|
||||||
assign DoWriteMiss = DoWrite & ~CacheHit;
|
assign DoWriteMiss = DoWrite & ~CacheHit;
|
||||||
|
|
||||||
@ -135,20 +145,21 @@ module cachefsm
|
|||||||
always_comb begin
|
always_comb begin
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
case (CurrState)
|
case (CurrState)
|
||||||
STATE_READY: if(DoFlush) NextState = STATE_FLUSH;
|
STATE_READY: if(IgnoreRequest) NextState = STATE_READY;
|
||||||
else if(DoAMOHit & CPUBusy) NextState = STATE_CPU_BUSY_FINISH_AMO;
|
else if(DoFlush) NextState = STATE_FLUSH;
|
||||||
|
else if(DoAMOHit & CPUBusy) NextState = STATE_CPU_BUSY_FINISH_AMO; // change
|
||||||
else if(DoReadHit & CPUBusy) NextState = STATE_CPU_BUSY;
|
else if(DoReadHit & CPUBusy) NextState = STATE_CPU_BUSY;
|
||||||
else if (DoWriteHit & CPUBusy) NextState = STATE_CPU_BUSY;
|
else if(DoWriteHit & CPUBusy) NextState = STATE_CPU_BUSY;
|
||||||
else if(DoReadMiss | DoWriteMiss | DoAMOMiss) NextState = STATE_MISS_FETCH_WDV;
|
else if(DoReadMiss | DoWriteMiss | DoAMOMiss) NextState = STATE_MISS_FETCH_WDV; // change
|
||||||
else NextState = STATE_READY;
|
else NextState = STATE_READY;
|
||||||
STATE_MISS_FETCH_WDV: if (CacheBusAck) NextState = STATE_MISS_FETCH_DONE;
|
STATE_MISS_FETCH_WDV: if (CacheBusAck) NextState = STATE_MISS_FETCH_DONE;
|
||||||
else NextState = STATE_MISS_FETCH_WDV;
|
else NextState = STATE_MISS_FETCH_WDV;
|
||||||
STATE_MISS_FETCH_DONE: if(VictimDirty) NextState = STATE_MISS_EVICT_DIRTY;
|
STATE_MISS_FETCH_DONE: if(VictimDirty) NextState = STATE_MISS_EVICT_DIRTY;
|
||||||
else NextState = STATE_MISS_WRITE_CACHE_LINE;
|
else NextState = STATE_MISS_WRITE_CACHE_LINE;
|
||||||
STATE_MISS_WRITE_CACHE_LINE: NextState = STATE_MISS_READ_WORD;
|
STATE_MISS_WRITE_CACHE_LINE: NextState = STATE_MISS_READ_WORD;
|
||||||
STATE_MISS_READ_WORD: if (DoWrite & ~DoAMO) NextState = STATE_MISS_WRITE_WORD;
|
STATE_MISS_READ_WORD: if (Write & ~AMO) NextState = STATE_MISS_WRITE_WORD;
|
||||||
else NextState = STATE_MISS_READ_WORD_DELAY;
|
else NextState = STATE_MISS_READ_WORD_DELAY;
|
||||||
STATE_MISS_READ_WORD_DELAY: if(DoAMO & CPUBusy) NextState = STATE_CPU_BUSY_FINISH_AMO;
|
STATE_MISS_READ_WORD_DELAY: if(AMO & CPUBusy) NextState = STATE_CPU_BUSY_FINISH_AMO;
|
||||||
else if(CPUBusy) NextState = STATE_CPU_BUSY;
|
else if(CPUBusy) NextState = STATE_CPU_BUSY;
|
||||||
else NextState = STATE_READY;
|
else NextState = STATE_READY;
|
||||||
STATE_MISS_WRITE_WORD: if(CPUBusy) NextState = STATE_CPU_BUSY;
|
STATE_MISS_WRITE_WORD: if(CPUBusy) NextState = STATE_CPU_BUSY;
|
||||||
@ -192,12 +203,12 @@ module cachefsm
|
|||||||
assign ClearValid = '0;
|
assign ClearValid = '0;
|
||||||
assign SetDirty = (CurrState == STATE_READY & DoAMO) |
|
assign SetDirty = (CurrState == STATE_READY & DoAMO) |
|
||||||
(CurrState == STATE_READY & DoWrite) |
|
(CurrState == STATE_READY & DoWrite) |
|
||||||
(CurrState == STATE_MISS_READ_WORD_DELAY & DoAMO) |
|
(CurrState == STATE_MISS_READ_WORD_DELAY & AMO) |
|
||||||
(CurrState == STATE_MISS_WRITE_WORD);
|
(CurrState == STATE_MISS_WRITE_WORD);
|
||||||
assign ClearDirty = (CurrState == STATE_MISS_WRITE_CACHE_LINE) |
|
assign ClearDirty = (CurrState == STATE_MISS_WRITE_CACHE_LINE) |
|
||||||
(CurrState == STATE_FLUSH_CLEAR_DIRTY);
|
(CurrState == STATE_FLUSH_CLEAR_DIRTY);
|
||||||
assign FSMWordWriteEn = (CurrState == STATE_READY & (DoAMOHit | DoWriteHit)) |
|
assign FSMWordWriteEn = (CurrState == STATE_READY & (DoAMOHit | DoWriteHit)) |
|
||||||
(CurrState == STATE_MISS_READ_WORD_DELAY & DoAMO) |
|
(CurrState == STATE_MISS_READ_WORD_DELAY & AMO) |
|
||||||
(CurrState == STATE_MISS_WRITE_WORD);
|
(CurrState == STATE_MISS_WRITE_WORD);
|
||||||
assign FSMLineWriteEn = (CurrState == STATE_MISS_WRITE_CACHE_LINE);
|
assign FSMLineWriteEn = (CurrState == STATE_MISS_WRITE_CACHE_LINE);
|
||||||
assign LRUWriteEn = (CurrState == STATE_READY & (DoAMOHit | DoReadHit | DoWriteHit)) |
|
assign LRUWriteEn = (CurrState == STATE_READY & (DoAMOHit | DoReadHit | DoWriteHit)) |
|
||||||
@ -221,19 +232,19 @@ module cachefsm
|
|||||||
// handle cpu stall.
|
// handle cpu stall.
|
||||||
assign restore = ((CurrState == STATE_CPU_BUSY) | (CurrState == STATE_CPU_BUSY_FINISH_AMO)) & ~`REPLAY;
|
assign restore = ((CurrState == STATE_CPU_BUSY) | (CurrState == STATE_CPU_BUSY_FINISH_AMO)) & ~`REPLAY;
|
||||||
assign save = ((CurrState == STATE_READY & (DoAMOHit | DoReadHit | DoWriteHit) & CPUBusy) |
|
assign save = ((CurrState == STATE_READY & (DoAMOHit | DoReadHit | DoWriteHit) & CPUBusy) |
|
||||||
(CurrState == STATE_MISS_READ_WORD_DELAY & (DoAMO | DoRead) & CPUBusy) |
|
(CurrState == STATE_MISS_READ_WORD_DELAY & (AMO | Read) & CPUBusy) |
|
||||||
(CurrState == STATE_MISS_WRITE_WORD & DoWrite & CPUBusy)) & ~`REPLAY;
|
(CurrState == STATE_MISS_WRITE_WORD & DoWrite & CPUBusy)) & ~`REPLAY;
|
||||||
|
|
||||||
// **** can this be simplified?
|
// **** can this be simplified?
|
||||||
assign PreSelAdr = ((CurrState == STATE_READY & IgnoreRequest) | // *** ignorerequest comes from TrapM. Have to fix. why is ignorerequest here anyway?
|
assign PreSelAdr = ((CurrState == STATE_READY & IgnoreRequestTLB) | // Ignore Request is needed on TLB miss.
|
||||||
(CurrState == STATE_READY & DoAMOHit) | //<opHit> also depends on ignorerequest
|
(CurrState == STATE_READY & (AMO & CacheHit)) | // change
|
||||||
(CurrState == STATE_READY & DoReadHit & (CPUBusy & `REPLAY)) |
|
(CurrState == STATE_READY & (Read & CacheHit) & (CPUBusy & `REPLAY)) |
|
||||||
(CurrState == STATE_READY & DoWriteHit) |
|
(CurrState == STATE_READY & (Write & CacheHit)) |
|
||||||
(CurrState == STATE_MISS_FETCH_WDV) |
|
(CurrState == STATE_MISS_FETCH_WDV) |
|
||||||
(CurrState == STATE_MISS_FETCH_DONE) |
|
(CurrState == STATE_MISS_FETCH_DONE) |
|
||||||
(CurrState == STATE_MISS_WRITE_CACHE_LINE) |
|
(CurrState == STATE_MISS_WRITE_CACHE_LINE) |
|
||||||
(CurrState == STATE_MISS_READ_WORD) |
|
(CurrState == STATE_MISS_READ_WORD) |
|
||||||
(CurrState == STATE_MISS_READ_WORD_DELAY & (DoAMO | (CPUBusy & `REPLAY))) | // ***
|
(CurrState == STATE_MISS_READ_WORD_DELAY & (AMO | (CPUBusy & `REPLAY))) | // ***
|
||||||
(CurrState == STATE_MISS_WRITE_WORD) |
|
(CurrState == STATE_MISS_WRITE_WORD) |
|
||||||
(CurrState == STATE_MISS_EVICT_DIRTY) |
|
(CurrState == STATE_MISS_EVICT_DIRTY) |
|
||||||
(CurrState == STATE_CPU_BUSY & (CPUBusy & `REPLAY)) |
|
(CurrState == STATE_CPU_BUSY & (CPUBusy & `REPLAY)) |
|
||||||
|
@ -210,7 +210,7 @@ module ifu (
|
|||||||
cache #(.LINELEN(`ICACHE_LINELENINBITS),
|
cache #(.LINELEN(`ICACHE_LINELENINBITS),
|
||||||
.NUMLINES(`ICACHE_WAYSIZEINBYTES*8/`ICACHE_LINELENINBITS),
|
.NUMLINES(`ICACHE_WAYSIZEINBYTES*8/`ICACHE_LINELENINBITS),
|
||||||
.NUMWAYS(`ICACHE_NUMWAYS), .DCACHE(0))
|
.NUMWAYS(`ICACHE_NUMWAYS), .DCACHE(0))
|
||||||
icache(.clk, .reset, .CPUBusy, .IgnoreRequest(ITLBMissF),
|
icache(.clk, .reset, .CPUBusy, .IgnoreRequestTLB(ITLBMissF), .IgnoreRequestTrapM('0),
|
||||||
.CacheMemWriteData(ICacheMemWriteData), .CacheBusAck(ICacheBusAck),
|
.CacheMemWriteData(ICacheMemWriteData), .CacheBusAck(ICacheBusAck),
|
||||||
.CacheBusAdr(ICacheBusAdr), .CacheStall(ICacheStallF),
|
.CacheBusAdr(ICacheBusAdr), .CacheStall(ICacheStallF),
|
||||||
.CacheFetchLine(ICacheFetchLine),
|
.CacheFetchLine(ICacheFetchLine),
|
||||||
|
@ -45,73 +45,75 @@ module interlockfsm
|
|||||||
output logic InterlockStall,
|
output logic InterlockStall,
|
||||||
output logic SelReplayCPURequest,
|
output logic SelReplayCPURequest,
|
||||||
output logic SelHPTW,
|
output logic SelHPTW,
|
||||||
output logic IgnoreRequest);
|
output logic IgnoreRequestTLB,
|
||||||
|
output logic IgnoreRequestTrapM);
|
||||||
|
|
||||||
|
|
||||||
typedef enum {STATE_T0_READY,
|
typedef enum {STATE_T0_READY,
|
||||||
STATE_T0_REPLAY,
|
STATE_T0_REPLAY,
|
||||||
STATE_T3_DTLB_MISS,
|
STATE_T3_DTLB_MISS,
|
||||||
STATE_T4_ITLB_MISS,
|
STATE_T4_ITLB_MISS,
|
||||||
STATE_T5_ITLB_MISS,
|
STATE_T5_ITLB_MISS,
|
||||||
STATE_T7_DITLB_MISS} statetype;
|
STATE_T7_DITLB_MISS} statetype;
|
||||||
|
|
||||||
(* mark_debug = "true" *) statetype InterlockCurrState, InterlockNextState;
|
(* mark_debug = "true" *) statetype InterlockCurrState, InterlockNextState;
|
||||||
|
|
||||||
|
|
||||||
always_ff @(posedge clk)
|
always_ff @(posedge clk)
|
||||||
if (reset) InterlockCurrState <= #1 STATE_T0_READY;
|
if (reset) InterlockCurrState <= #1 STATE_T0_READY;
|
||||||
else InterlockCurrState <= #1 InterlockNextState;
|
else InterlockCurrState <= #1 InterlockNextState;
|
||||||
|
|
||||||
always_comb begin
|
always_comb begin
|
||||||
case(InterlockCurrState)
|
case(InterlockCurrState)
|
||||||
STATE_T0_READY: if (TrapM) InterlockNextState = STATE_T0_READY;
|
STATE_T0_READY: if (TrapM) InterlockNextState = STATE_T0_READY;
|
||||||
else if(~ITLBMissF & DTLBMissM & AnyCPUReqM) InterlockNextState = STATE_T3_DTLB_MISS;
|
else if(~ITLBMissF & DTLBMissM & AnyCPUReqM) InterlockNextState = STATE_T3_DTLB_MISS;
|
||||||
else if(ITLBMissF & ~DTLBMissM & ~AnyCPUReqM) InterlockNextState = STATE_T4_ITLB_MISS;
|
else if(ITLBMissF & ~DTLBMissM & ~AnyCPUReqM) InterlockNextState = STATE_T4_ITLB_MISS;
|
||||||
else if(ITLBMissF & ~DTLBMissM & AnyCPUReqM) InterlockNextState = STATE_T5_ITLB_MISS;
|
else if(ITLBMissF & ~DTLBMissM & AnyCPUReqM) InterlockNextState = STATE_T5_ITLB_MISS;
|
||||||
else if(ITLBMissF & DTLBMissM & AnyCPUReqM) InterlockNextState = STATE_T7_DITLB_MISS;
|
else if(ITLBMissF & DTLBMissM & AnyCPUReqM) InterlockNextState = STATE_T7_DITLB_MISS;
|
||||||
else InterlockNextState = STATE_T0_READY;
|
else InterlockNextState = STATE_T0_READY;
|
||||||
STATE_T0_REPLAY: if(DCacheStallM) InterlockNextState = STATE_T0_REPLAY;
|
STATE_T0_REPLAY: if(DCacheStallM) InterlockNextState = STATE_T0_REPLAY;
|
||||||
else InterlockNextState = STATE_T0_READY;
|
else InterlockNextState = STATE_T0_READY;
|
||||||
STATE_T3_DTLB_MISS: if(DTLBWriteM) InterlockNextState = STATE_T0_REPLAY;
|
STATE_T3_DTLB_MISS: if(DTLBWriteM) InterlockNextState = STATE_T0_REPLAY;
|
||||||
else InterlockNextState = STATE_T3_DTLB_MISS;
|
else InterlockNextState = STATE_T3_DTLB_MISS;
|
||||||
STATE_T4_ITLB_MISS: if(ITLBWriteF) InterlockNextState = STATE_T0_READY;
|
STATE_T4_ITLB_MISS: if(ITLBWriteF) InterlockNextState = STATE_T0_READY;
|
||||||
else InterlockNextState = STATE_T4_ITLB_MISS;
|
else InterlockNextState = STATE_T4_ITLB_MISS;
|
||||||
STATE_T5_ITLB_MISS: if(ITLBWriteF) InterlockNextState = STATE_T0_REPLAY;
|
STATE_T5_ITLB_MISS: if(ITLBWriteF) InterlockNextState = STATE_T0_REPLAY;
|
||||||
else InterlockNextState = STATE_T5_ITLB_MISS;
|
else InterlockNextState = STATE_T5_ITLB_MISS;
|
||||||
STATE_T7_DITLB_MISS: if(DTLBWriteM) InterlockNextState = STATE_T5_ITLB_MISS;
|
STATE_T7_DITLB_MISS: if(DTLBWriteM) InterlockNextState = STATE_T5_ITLB_MISS;
|
||||||
else InterlockNextState = STATE_T7_DITLB_MISS;
|
else InterlockNextState = STATE_T7_DITLB_MISS;
|
||||||
default: InterlockNextState = STATE_T0_READY;
|
default: InterlockNextState = STATE_T0_READY;
|
||||||
endcase
|
endcase
|
||||||
end // always_comb
|
end // always_comb
|
||||||
|
|
||||||
// signal to CPU it needs to wait on HPTW.
|
// signal to CPU it needs to wait on HPTW.
|
||||||
/* -----\/----- EXCLUDED -----\/-----
|
/* -----\/----- EXCLUDED -----\/-----
|
||||||
// this code has a problem with imperas64mmu as it reads in an invalid uninitalized instruction. InterlockStall becomes x and it propagates
|
// this code has a problem with imperas64mmu as it reads in an invalid uninitalized instruction. InterlockStall becomes x and it propagates
|
||||||
// everywhere. The case statement below implements the same logic but any x on the inputs will resolve to 0.
|
// everywhere. The case statement below implements the same logic but any x on the inputs will resolve to 0.
|
||||||
// Note this will cause a problem for post synthesis gate simulation.
|
// Note this will cause a problem for post synthesis gate simulation.
|
||||||
assign InterlockStall = (InterlockCurrState == STATE_T0_READY & (DTLBMissM | ITLBMissF)) |
|
assign InterlockStall = (InterlockCurrState == STATE_T0_READY & (DTLBMissM | ITLBMissF)) |
|
||||||
(InterlockCurrState == STATE_T3_DTLB_MISS) | (InterlockCurrState == STATE_T4_ITLB_MISS) |
|
(InterlockCurrState == STATE_T3_DTLB_MISS) | (InterlockCurrState == STATE_T4_ITLB_MISS) |
|
||||||
(InterlockCurrState == STATE_T5_ITLB_MISS) | (InterlockCurrState == STATE_T7_DITLB_MISS);
|
(InterlockCurrState == STATE_T5_ITLB_MISS) | (InterlockCurrState == STATE_T7_DITLB_MISS);
|
||||||
|
|
||||||
-----/\----- EXCLUDED -----/\----- */
|
-----/\----- EXCLUDED -----/\----- */
|
||||||
|
|
||||||
always_comb begin
|
always_comb begin
|
||||||
InterlockStall = 1'b0;
|
InterlockStall = 1'b0;
|
||||||
case(InterlockCurrState)
|
case(InterlockCurrState)
|
||||||
STATE_T0_READY: if((DTLBMissM | ITLBMissF) & ~TrapM) InterlockStall = 1'b1;
|
STATE_T0_READY: if((DTLBMissM | ITLBMissF) & ~TrapM) InterlockStall = 1'b1;
|
||||||
STATE_T3_DTLB_MISS: InterlockStall = 1'b1;
|
STATE_T3_DTLB_MISS: InterlockStall = 1'b1;
|
||||||
STATE_T4_ITLB_MISS: InterlockStall = 1'b1;
|
STATE_T4_ITLB_MISS: InterlockStall = 1'b1;
|
||||||
STATE_T5_ITLB_MISS: InterlockStall = 1'b1;
|
STATE_T5_ITLB_MISS: InterlockStall = 1'b1;
|
||||||
STATE_T7_DITLB_MISS: InterlockStall = 1'b1;
|
STATE_T7_DITLB_MISS: InterlockStall = 1'b1;
|
||||||
default: InterlockStall = 1'b0;
|
default: InterlockStall = 1'b0;
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
assign SelReplayCPURequest = (InterlockNextState == STATE_T0_REPLAY);
|
assign SelReplayCPURequest = (InterlockNextState == STATE_T0_REPLAY);
|
||||||
assign SelHPTW = (InterlockCurrState == STATE_T3_DTLB_MISS) | (InterlockCurrState == STATE_T4_ITLB_MISS) |
|
assign SelHPTW = (InterlockCurrState == STATE_T3_DTLB_MISS) | (InterlockCurrState == STATE_T4_ITLB_MISS) |
|
||||||
(InterlockCurrState == STATE_T5_ITLB_MISS) | (InterlockCurrState == STATE_T7_DITLB_MISS);
|
(InterlockCurrState == STATE_T5_ITLB_MISS) | (InterlockCurrState == STATE_T7_DITLB_MISS);
|
||||||
assign IgnoreRequest = (InterlockCurrState == STATE_T0_READY & (ITLBMissF | DTLBMissM | TrapM)) |
|
assign IgnoreRequestTLB = (InterlockCurrState == STATE_T0_READY & (ITLBMissF | DTLBMissM));
|
||||||
((InterlockCurrState == STATE_T0_REPLAY) & (TrapM));
|
assign IgnoreRequestTrapM = (InterlockCurrState == STATE_T0_READY & (TrapM)) |
|
||||||
|
((InterlockCurrState == STATE_T0_REPLAY) & (TrapM));
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -98,7 +98,7 @@ module lsu (
|
|||||||
logic SelHPTW;
|
logic SelHPTW;
|
||||||
logic BusStall;
|
logic BusStall;
|
||||||
logic InterlockStall;
|
logic InterlockStall;
|
||||||
logic IgnoreRequest;
|
logic IgnoreRequestTLB, IgnoreRequestTrapM;
|
||||||
logic BusCommittedM, DCacheCommittedM;
|
logic BusCommittedM, DCacheCommittedM;
|
||||||
|
|
||||||
flopenrc #(`XLEN) AddressMReg(clk, reset, FlushM, ~StallM, IEUAdrE, IEUAdrM);
|
flopenrc #(`XLEN) AddressMReg(clk, reset, FlushM, ~StallM, IEUAdrE, IEUAdrM);
|
||||||
@ -116,11 +116,11 @@ module lsu (
|
|||||||
.ReadDataM, .Funct3M, .LSUFunct3M, .Funct7M, .LSUFunct7M, .IEUAdrM,
|
.ReadDataM, .Funct3M, .LSUFunct3M, .Funct7M, .LSUFunct7M, .IEUAdrM,
|
||||||
.IEUAdrExtM, .PTE, .PageType, .PreLSURWM, .LSUAtomicM, .IEUAdrE,
|
.IEUAdrExtM, .PTE, .PageType, .PreLSURWM, .LSUAtomicM, .IEUAdrE,
|
||||||
.LSUAdrE, .PreLSUPAdrM, .CPUBusy, .InterlockStall, .SelHPTW,
|
.LSUAdrE, .PreLSUPAdrM, .CPUBusy, .InterlockStall, .SelHPTW,
|
||||||
.IgnoreRequest);
|
.IgnoreRequestTLB, .IgnoreRequestTrapM);
|
||||||
|
|
||||||
end else begin
|
end else begin
|
||||||
assign {InterlockStall, SelHPTW, PTE, PageType, DTLBWriteM, ITLBWriteF} = '0;
|
assign {InterlockStall, SelHPTW, PTE, PageType, DTLBWriteM, ITLBWriteF, IgnoreRequestTLB} = '0;
|
||||||
assign IgnoreRequest = TrapM; assign CPUBusy = StallW; assign PreLSURWM = MemRWM;
|
assign IgnoreRequestTrapM = TrapM; assign CPUBusy = StallW; assign PreLSURWM = MemRWM;
|
||||||
assign LSUAdrE = PreLSUAdrE; assign PreLSUAdrE = IEUAdrE[11:0];
|
assign LSUAdrE = PreLSUAdrE; assign PreLSUAdrE = IEUAdrE[11:0];
|
||||||
assign PreLSUPAdrM = IEUAdrExtM[`PA_BITS-1:0];
|
assign PreLSUPAdrM = IEUAdrExtM[`PA_BITS-1:0];
|
||||||
assign LSUFunct3M = Funct3M; assign LSUFunct7M = Funct7M; assign LSUAtomicM = AtomicM;
|
assign LSUFunct3M = Funct3M; assign LSUFunct7M = Funct7M; assign LSUAtomicM = AtomicM;
|
||||||
@ -202,7 +202,7 @@ module lsu (
|
|||||||
.WordCount,
|
.WordCount,
|
||||||
.LSUFunct3M, .LSUBusAdr, .DCacheBusAdr, .DCacheFetchLine,
|
.LSUFunct3M, .LSUBusAdr, .DCacheBusAdr, .DCacheFetchLine,
|
||||||
.DCacheWriteLine, .DCacheBusAck, .DCacheMemWriteData, .LSUPAdrM, .FinalAMOWriteDataM,
|
.DCacheWriteLine, .DCacheBusAck, .DCacheMemWriteData, .LSUPAdrM, .FinalAMOWriteDataM,
|
||||||
.ReadDataWordM, .ReadDataWordMuxM, .IgnoreRequest, .LSURWM, .CPUBusy, .CacheableM,
|
.ReadDataWordM, .ReadDataWordMuxM, .IgnoreRequest(IgnoreRequestTLB | IgnoreRequestTrapM), .LSURWM, .CPUBusy, .CacheableM,
|
||||||
.BusStall, .BusCommittedM);
|
.BusStall, .BusCommittedM);
|
||||||
|
|
||||||
assign WordOffsetAddr = LSUBusWrite ? ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) : LSUPAdrM;
|
assign WordOffsetAddr = LSUBusWrite ? ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) : LSUPAdrM;
|
||||||
@ -217,7 +217,7 @@ module lsu (
|
|||||||
.save, .restore,
|
.save, .restore,
|
||||||
.FinalWriteData(FinalWriteDataM),
|
.FinalWriteData(FinalWriteDataM),
|
||||||
.CacheStall(DCacheStallM), .CacheMiss(DCacheMiss), .CacheAccess(DCacheAccess),
|
.CacheStall(DCacheStallM), .CacheMiss(DCacheMiss), .CacheAccess(DCacheAccess),
|
||||||
.IgnoreRequest, .CacheCommitted(DCacheCommittedM), .CacheBusAdr(DCacheBusAdr),
|
.IgnoreRequestTLB, .IgnoreRequestTrapM, .CacheCommitted(DCacheCommittedM), .CacheBusAdr(DCacheBusAdr),
|
||||||
.ReadDataLine(ReadDataLineM), .CacheMemWriteData(DCacheMemWriteData),
|
.ReadDataLine(ReadDataLineM), .CacheMemWriteData(DCacheMemWriteData),
|
||||||
.CacheFetchLine(DCacheFetchLine), .CacheWriteLine(DCacheWriteLine),
|
.CacheFetchLine(DCacheFetchLine), .CacheWriteLine(DCacheWriteLine),
|
||||||
.CacheBusAck(DCacheBusAck), .InvalidateCacheM(1'b0));
|
.CacheBusAck(DCacheBusAck), .InvalidateCacheM(1'b0));
|
||||||
@ -248,7 +248,7 @@ module lsu (
|
|||||||
|
|
||||||
if (`A_SUPPORTED) begin:atomic
|
if (`A_SUPPORTED) begin:atomic
|
||||||
atomic atomic(.clk, .reset, .FlushW, .CPUBusy, .ReadDataM, .WriteDataM, .LSUPAdrM,
|
atomic atomic(.clk, .reset, .FlushW, .CPUBusy, .ReadDataM, .WriteDataM, .LSUPAdrM,
|
||||||
.LSUFunct7M, .LSUFunct3M, .LSUAtomicM, .PreLSURWM, .IgnoreRequest,
|
.LSUFunct7M, .LSUFunct3M, .LSUAtomicM, .PreLSURWM, .IgnoreRequest(IgnoreRequestTLB | IgnoreRequestTrapM),
|
||||||
.DTLBMissM, .FinalAMOWriteDataM, .SquashSCW, .LSURWM);
|
.DTLBMissM, .FinalAMOWriteDataM, .SquashSCW, .LSURWM);
|
||||||
end else begin:lrsc
|
end else begin:lrsc
|
||||||
assign SquashSCW = 0; assign LSURWM = PreLSURWM; assign FinalAMOWriteDataM = WriteDataM;
|
assign SquashSCW = 0; assign LSURWM = PreLSURWM; assign FinalAMOWriteDataM = WriteDataM;
|
||||||
|
@ -59,7 +59,8 @@ module lsuvirtmem(
|
|||||||
output logic InterlockStall,
|
output logic InterlockStall,
|
||||||
output logic CPUBusy,
|
output logic CPUBusy,
|
||||||
output logic SelHPTW,
|
output logic SelHPTW,
|
||||||
output logic IgnoreRequest);
|
output logic IgnoreRequestTLB,
|
||||||
|
output logic IgnoreRequestTrapM);
|
||||||
|
|
||||||
|
|
||||||
logic AnyCPUReqM;
|
logic AnyCPUReqM;
|
||||||
@ -76,7 +77,7 @@ module lsuvirtmem(
|
|||||||
interlockfsm interlockfsm (
|
interlockfsm interlockfsm (
|
||||||
.clk, .reset, .AnyCPUReqM, .ITLBMissF, .ITLBWriteF,
|
.clk, .reset, .AnyCPUReqM, .ITLBMissF, .ITLBWriteF,
|
||||||
.DTLBMissM, .DTLBWriteM, .TrapM, .DCacheStallM,
|
.DTLBMissM, .DTLBWriteM, .TrapM, .DCacheStallM,
|
||||||
.InterlockStall, .SelReplayCPURequest, .SelHPTW, .IgnoreRequest);
|
.InterlockStall, .SelReplayCPURequest, .SelHPTW, .IgnoreRequestTLB, .IgnoreRequestTrapM);
|
||||||
hptw hptw( // *** remove logic from (), mention this in style guide CH3
|
hptw hptw( // *** remove logic from (), mention this in style guide CH3
|
||||||
.clk, .reset, .SATP_REGW, .PCF, .IEUAdrM,
|
.clk, .reset, .SATP_REGW, .PCF, .IEUAdrM,
|
||||||
.ITLBMissF(ITLBMissF & ~TrapM), .DTLBMissM(DTLBMissM & ~TrapM),
|
.ITLBMissF(ITLBMissF & ~TrapM), .DTLBMissM(DTLBMissM & ~TrapM),
|
||||||
|
Loading…
Reference in New Issue
Block a user