hptw: factored HPTWRead

This commit is contained in:
David Harris 2021-07-17 11:25:52 -04:00
parent 37cc2ca30f
commit 1bbc932bfd

View File

@ -144,10 +144,18 @@ module pagetablewalker
assign WalkerLoadPageFaultM = (WalkerState == FAULT) & DTLBMissMQ & ~MemStore; assign WalkerLoadPageFaultM = (WalkerState == FAULT) & DTLBMissMQ & ~MemStore;
assign WalkerStorePageFaultM = (WalkerState == FAULT) & DTLBMissMQ & MemStore; assign WalkerStorePageFaultM = (WalkerState == FAULT) & DTLBMissMQ & MemStore;
assign PageType = (PreviousWalkerState == LEVEL3) ? 2'b11 : // *** not sure about this mux? always_comb // determine type of page being walked:
case (PreviousWalkerState)
LEVEL3: PageType = 2'b11; // terapage
LEVEL2: PageType = 2'b10; // gigapage
LEVEL1: PageType = 2'b01; // megapage
default: PageType = 2'b00; // kilopage
endcase
/* assign PageType = (PreviousWalkerState == LEVEL3) ? 2'b11 : // is
((PreviousWalkerState == LEVEL2) ? 2'b10 : ((PreviousWalkerState == LEVEL2) ? 2'b10 :
((PreviousWalkerState == LEVEL1) ? 2'b01 : 2'b00)); ((PreviousWalkerState == LEVEL1) ? 2'b01 : 2'b00));*/
assign PRegEn = (NextWalkerState == LEVEL3) | (NextWalkerState == LEVEL2) | (NextWalkerState == LEVEL1) | (NextWalkerState == LEVEL0); assign PRegEn = (NextWalkerState == LEVEL3) | (NextWalkerState == LEVEL2) | (NextWalkerState == LEVEL1) | (NextWalkerState == LEVEL0);
assign HPTWRead = (WalkerState == LEVEL3_WDV) | (WalkerState == LEVEL2_WDV) | (WalkerState == LEVEL1_WDV) | (WalkerState == LEVEL0_WDV); // is this really necessary?
// *** is there a way to speed up HPTW? // *** is there a way to speed up HPTW?
@ -203,36 +211,29 @@ module pagetablewalker
// State transition logic // State transition logic
always_comb begin always_comb begin
//PRegEn = 1'b0; //HPTWRead = 1'b0;
HPTWRead = 1'b0;
case (WalkerState) case (WalkerState)
IDLE: if (AnyTLBMissM & SvMode == `SV32) NextWalkerState = LEVEL1_SET_ADRE; IDLE: if (AnyTLBMissM & SvMode == `SV32) NextWalkerState = LEVEL1_SET_ADRE;
else NextWalkerState = IDLE; else NextWalkerState = IDLE;
LEVEL1_SET_ADRE: NextWalkerState = LEVEL1_WDV; LEVEL1_SET_ADRE: NextWalkerState = LEVEL1_WDV;
LEVEL1_WDV: begin LEVEL1_WDV: begin
HPTWRead = 1'b1; //HPTWRead = 1'b1;
if (HPTWStall) NextWalkerState = LEVEL1_WDV; if (HPTWStall) NextWalkerState = LEVEL1_WDV;
else begin else NextWalkerState = LEVEL1;
NextWalkerState = LEVEL1;
//PRegEn = 1'b1;
end
end end
LEVEL1: begin LEVEL1: begin
if (ValidPTE && LeafPTE && ~(MegapageMisaligned | ADPageFault)) NextWalkerState = LEAF; if (ValidPTE && LeafPTE && ~(MegapageMisaligned | ADPageFault)) NextWalkerState = LEAF;
else if (ValidPTE && ~LeafPTE) begin else if (ValidPTE && ~LeafPTE) begin
NextWalkerState = LEVEL0_SET_ADRE; NextWalkerState = LEVEL0_SET_ADRE;
HPTWRead = 1'b1; //HPTWRead = 1'b1; // *** seems this shouldn't be asserted here
end else NextWalkerState = FAULT; end else NextWalkerState = FAULT;
end end
LEVEL0_SET_ADRE: NextWalkerState = LEVEL0_WDV; LEVEL0_SET_ADRE: NextWalkerState = LEVEL0_WDV;
LEVEL0_WDV: begin LEVEL0_WDV: begin
HPTWRead = 1'b1; //HPTWRead = 1'b1;
if (HPTWStall) NextWalkerState = LEVEL0_WDV; if (HPTWStall) NextWalkerState = LEVEL0_WDV;
else begin else NextWalkerState = LEVEL0;
NextWalkerState = LEVEL0;
//PRegEn = 1'b1;
end
end end
LEVEL0: if (ValidPTE & LeafPTE & ~ADPageFault) NextWalkerState = LEAF; LEVEL0: if (ValidPTE & LeafPTE & ~ADPageFault) NextWalkerState = LEAF;
else NextWalkerState = FAULT; else NextWalkerState = FAULT;
@ -260,20 +261,16 @@ module pagetablewalker
assign MegapageMisaligned = |(CurrentPPN[8:0]); assign MegapageMisaligned = |(CurrentPPN[8:0]);
always_comb begin always_comb begin
//PRegEn = 1'b0; //HPTWRead = 1'b0;
HPTWRead = 1'b0;
case (WalkerState) case (WalkerState)
IDLE: if (AnyTLBMissM) NextWalkerState = (SvMode == `SV48) ? LEVEL3_SET_ADRE : LEVEL2_SET_ADRE; IDLE: if (AnyTLBMissM) NextWalkerState = (SvMode == `SV48) ? LEVEL3_SET_ADRE : LEVEL2_SET_ADRE;
else NextWalkerState = IDLE; else NextWalkerState = IDLE;
LEVEL3_SET_ADRE: NextWalkerState = LEVEL3_WDV; LEVEL3_SET_ADRE: NextWalkerState = LEVEL3_WDV;
LEVEL3_WDV: begin LEVEL3_WDV: begin
HPTWRead = 1'b1; //HPTWRead = 1'b1;
if (HPTWStall) NextWalkerState = LEVEL3_WDV; if (HPTWStall) NextWalkerState = LEVEL3_WDV;
else begin else NextWalkerState = LEVEL3;
NextWalkerState = LEVEL3;
//PRegEn = 1'b1;
end
end end
LEVEL3: LEVEL3:
if (ValidPTE && LeafPTE && ~(TerapageMisaligned || ADPageFault)) NextWalkerState = LEAF; if (ValidPTE && LeafPTE && ~(TerapageMisaligned || ADPageFault)) NextWalkerState = LEAF;
@ -281,12 +278,9 @@ module pagetablewalker
else NextWalkerState = FAULT; else NextWalkerState = FAULT;
LEVEL2_SET_ADRE: NextWalkerState = LEVEL2_WDV; LEVEL2_SET_ADRE: NextWalkerState = LEVEL2_WDV;
LEVEL2_WDV: begin LEVEL2_WDV: begin
HPTWRead = 1'b1; //HPTWRead = 1'b1;
if (HPTWStall) NextWalkerState = LEVEL2_WDV; if (HPTWStall) NextWalkerState = LEVEL2_WDV;
else begin else NextWalkerState = LEVEL2;
NextWalkerState = LEVEL2;
//PRegEn = 1'b1;
end
end end
LEVEL2: LEVEL2:
if (ValidPTE && LeafPTE && ~(GigapageMisaligned || ADPageFault)) NextWalkerState = LEAF; if (ValidPTE && LeafPTE && ~(GigapageMisaligned || ADPageFault)) NextWalkerState = LEAF;
@ -294,12 +288,9 @@ module pagetablewalker
else NextWalkerState = FAULT; else NextWalkerState = FAULT;
LEVEL1_SET_ADRE: NextWalkerState = LEVEL1_WDV; LEVEL1_SET_ADRE: NextWalkerState = LEVEL1_WDV;
LEVEL1_WDV: begin LEVEL1_WDV: begin
HPTWRead = 1'b1; //HPTWRead = 1'b1;
if (HPTWStall) NextWalkerState = LEVEL1_WDV; if (HPTWStall) NextWalkerState = LEVEL1_WDV;
else begin else NextWalkerState = LEVEL1;
NextWalkerState = LEVEL1;
//PRegEn = 1'b1;
end
end end
LEVEL1: LEVEL1:
if (ValidPTE && LeafPTE && ~(MegapageMisaligned || ADPageFault)) NextWalkerState = LEAF; if (ValidPTE && LeafPTE && ~(MegapageMisaligned || ADPageFault)) NextWalkerState = LEAF;
@ -307,12 +298,9 @@ module pagetablewalker
else NextWalkerState = FAULT; else NextWalkerState = FAULT;
LEVEL0_SET_ADRE: NextWalkerState = LEVEL0_WDV; LEVEL0_SET_ADRE: NextWalkerState = LEVEL0_WDV;
LEVEL0_WDV: begin LEVEL0_WDV: begin
HPTWRead = 1'b1; //HPTWRead = 1'b1;
if (HPTWStall) NextWalkerState = LEVEL0_WDV; if (HPTWStall) NextWalkerState = LEVEL0_WDV;
else begin else NextWalkerState = LEVEL0;
NextWalkerState = LEVEL0;
//PRegEn = 1'b1;
end
end end
LEVEL0: LEVEL0:
if (ValidPTE && LeafPTE && ~ADPageFault) NextWalkerState = LEAF; if (ValidPTE && LeafPTE && ~ADPageFault) NextWalkerState = LEAF;