mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
hptw: FSM simplification
This commit is contained in:
parent
6d28f3fe08
commit
36a8d23222
@ -206,12 +206,10 @@ module pagetablewalker
|
|||||||
assign TerapageMisaligned = |(CurrentPPN[26:0]); // must have zero PPN2, PPN1, PPN0
|
assign TerapageMisaligned = |(CurrentPPN[26:0]); // must have zero PPN2, PPN1, PPN0
|
||||||
assign GigapageMisaligned = |(CurrentPPN[17:0]); // must have zero PPN1 and PPN0
|
assign GigapageMisaligned = |(CurrentPPN[17:0]); // must have zero PPN1 and PPN0
|
||||||
assign MegapageMisaligned = |(CurrentPPN[8:0]); // must have zero PPN0
|
assign MegapageMisaligned = |(CurrentPPN[8:0]); // must have zero PPN0
|
||||||
end
|
assign HPTWPAdrE = {{(`XLEN-`PA_BITS){1'b0}}, TranslationPAdr[`PA_BITS-1:0]};
|
||||||
|
end
|
||||||
// generate
|
// generate
|
||||||
if (`XLEN == 32) begin
|
if (`XLEN == 32) begin
|
||||||
|
|
||||||
// A megapage is a Level 1 leaf page. This page must have zero PPN[0].
|
|
||||||
|
|
||||||
// State transition logic
|
// State transition logic
|
||||||
always_comb begin
|
always_comb begin
|
||||||
case (WalkerState)
|
case (WalkerState)
|
||||||
@ -234,7 +232,7 @@ module pagetablewalker
|
|||||||
LEAF: NextWalkerState = IDLE;
|
LEAF: NextWalkerState = IDLE;
|
||||||
FAULT: NextWalkerState = IDLE;
|
FAULT: NextWalkerState = IDLE;
|
||||||
default: begin
|
default: begin
|
||||||
$error("Default state in HPTW should be unreachable")
|
$error("Default state in HPTW should be unreachable");
|
||||||
NextWalkerState = IDLE; // should never be reached
|
NextWalkerState = IDLE; // should never be reached
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
@ -248,47 +246,43 @@ module pagetablewalker
|
|||||||
|
|
||||||
always_comb begin
|
always_comb begin
|
||||||
case (WalkerState)
|
case (WalkerState)
|
||||||
IDLE: if (AnyTLBMissM) NextWalkerState = (SvMode == `SV48) ? LEVEL3_SET_ADRE : LEVEL2_SET_ADRE;
|
IDLE: if (AnyTLBMissM)
|
||||||
else NextWalkerState = IDLE;
|
if (`XLEN == 64) NextWalkerState = (SvMode == `SV48) ? LEVEL3_SET_ADRE : LEVEL2_SET_ADRE;
|
||||||
LEVEL3_SET_ADRE: NextWalkerState = LEVEL3_WDV;
|
else NextWalkerState = LEVEL1_SET_ADRE;
|
||||||
LEVEL3_WDV: if (HPTWStall) NextWalkerState = LEVEL3_WDV;
|
else NextWalkerState = IDLE;
|
||||||
else NextWalkerState = LEVEL3;
|
LEVEL3_SET_ADRE: NextWalkerState = LEVEL3_WDV;
|
||||||
LEVEL3:
|
LEVEL3_WDV: if (HPTWStall) NextWalkerState = LEVEL3_WDV;
|
||||||
if (ValidPTE && LeafPTE && ~(TerapageMisaligned || ADPageFault)) NextWalkerState = LEAF;
|
else NextWalkerState = LEVEL3;
|
||||||
else if (ValidPTE && ~LeafPTE) NextWalkerState = LEVEL2_SET_ADRE;
|
LEVEL3: if (ValidPTE && LeafPTE && ~(TerapageMisaligned || ADPageFault)) NextWalkerState = LEAF;
|
||||||
else NextWalkerState = FAULT;
|
else if (ValidPTE && ~LeafPTE) NextWalkerState = LEVEL2_SET_ADRE;
|
||||||
LEVEL2_SET_ADRE: NextWalkerState = LEVEL2_WDV;
|
else NextWalkerState = FAULT;
|
||||||
LEVEL2_WDV: if (HPTWStall) NextWalkerState = LEVEL2_WDV;
|
LEVEL2_SET_ADRE: NextWalkerState = LEVEL2_WDV;
|
||||||
else NextWalkerState = LEVEL2;
|
LEVEL2_WDV: if (HPTWStall) NextWalkerState = LEVEL2_WDV;
|
||||||
LEVEL2:
|
else NextWalkerState = LEVEL2;
|
||||||
if (ValidPTE && LeafPTE && ~(GigapageMisaligned || ADPageFault)) NextWalkerState = LEAF;
|
LEVEL2: if (ValidPTE && LeafPTE && ~(GigapageMisaligned || ADPageFault)) NextWalkerState = LEAF;
|
||||||
else if (ValidPTE && ~LeafPTE) NextWalkerState = LEVEL1_SET_ADRE;
|
else if (ValidPTE && ~LeafPTE) NextWalkerState = LEVEL1_SET_ADRE;
|
||||||
else NextWalkerState = FAULT;
|
else NextWalkerState = FAULT;
|
||||||
LEVEL1_SET_ADRE: NextWalkerState = LEVEL1_WDV;
|
LEVEL1_SET_ADRE: NextWalkerState = LEVEL1_WDV;
|
||||||
LEVEL1_WDV: if (HPTWStall) NextWalkerState = LEVEL1_WDV;
|
LEVEL1_WDV: if (HPTWStall) NextWalkerState = LEVEL1_WDV;
|
||||||
else NextWalkerState = LEVEL1;
|
else NextWalkerState = LEVEL1;
|
||||||
LEVEL1:
|
LEVEL1: if (ValidPTE && LeafPTE && ~(MegapageMisaligned || ADPageFault)) NextWalkerState = LEAF;
|
||||||
if (ValidPTE && LeafPTE && ~(MegapageMisaligned || ADPageFault)) NextWalkerState = LEAF;
|
else if (ValidPTE && ~LeafPTE) NextWalkerState = LEVEL0_SET_ADRE;
|
||||||
else if (ValidPTE && ~LeafPTE) NextWalkerState = LEVEL0_SET_ADRE;
|
else NextWalkerState = FAULT;
|
||||||
else NextWalkerState = FAULT;
|
LEVEL0_SET_ADRE: NextWalkerState = LEVEL0_WDV;
|
||||||
LEVEL0_SET_ADRE: NextWalkerState = LEVEL0_WDV;
|
LEVEL0_WDV: if (HPTWStall) NextWalkerState = LEVEL0_WDV;
|
||||||
LEVEL0_WDV:
|
else NextWalkerState = LEVEL0;
|
||||||
if (HPTWStall) NextWalkerState = LEVEL0_WDV;
|
LEVEL0: if (ValidPTE && LeafPTE && ~ADPageFault) NextWalkerState = LEAF;
|
||||||
else NextWalkerState = LEVEL0;
|
else NextWalkerState = FAULT;
|
||||||
LEVEL0:
|
LEAF: NextWalkerState = IDLE;
|
||||||
if (ValidPTE && LeafPTE && ~ADPageFault) NextWalkerState = LEAF;
|
FAULT: NextWalkerState = IDLE;
|
||||||
else NextWalkerState = FAULT;
|
|
||||||
LEAF: NextWalkerState = IDLE;
|
|
||||||
FAULT: NextWalkerState = IDLE;
|
|
||||||
default: begin
|
default: begin
|
||||||
$error("Default state in HPTW should be unreachable")
|
$error("Default state in HPTW should be unreachable");
|
||||||
NextWalkerState = IDLE; // should never be reached
|
NextWalkerState = IDLE; // should never be reached
|
||||||
end
|
end
|
||||||
|
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
assign HPTWPAdrE = {{(`XLEN-`PA_BITS){1'b0}}, TranslationPAdr[`PA_BITS-1:0]};
|
end
|
||||||
end
|
|
||||||
end else begin
|
end else begin
|
||||||
assign HPTWPAdrE = 0;
|
assign HPTWPAdrE = 0;
|
||||||
assign HPTWRead = 0;
|
assign HPTWRead = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user