mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
hptw: factored pregen
This commit is contained in:
parent
880aa1c03a
commit
ef63e1ab52
@ -29,11 +29,6 @@
|
|||||||
|
|
||||||
`include "wally-config.vh"
|
`include "wally-config.vh"
|
||||||
|
|
||||||
/* ***
|
|
||||||
TO-DO:
|
|
||||||
- Implement faults on accessed/dirty behavior
|
|
||||||
*/
|
|
||||||
|
|
||||||
module pagetablewalker
|
module pagetablewalker
|
||||||
(
|
(
|
||||||
// Control signals
|
// Control signals
|
||||||
@ -152,6 +147,7 @@ module pagetablewalker
|
|||||||
assign PageType = (PreviousWalkerState == LEVEL3) ? 2'b11 : // *** not sure about this mux?
|
assign PageType = (PreviousWalkerState == LEVEL3) ? 2'b11 : // *** not sure about this mux?
|
||||||
((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);
|
||||||
|
|
||||||
// *** is there a way to speed up HPTW?
|
// *** is there a way to speed up HPTW?
|
||||||
|
|
||||||
@ -205,10 +201,9 @@ module pagetablewalker
|
|||||||
// A megapage is a Level 1 leaf page. This page must have zero PPN[0].
|
// A megapage is a Level 1 leaf page. This page must have zero PPN[0].
|
||||||
assign MegapageMisaligned = |(CurrentPPN[9:0]);
|
assign MegapageMisaligned = |(CurrentPPN[9:0]);
|
||||||
|
|
||||||
|
|
||||||
// State transition logic
|
// State transition logic
|
||||||
always_comb begin
|
always_comb begin
|
||||||
PRegEn = 1'b0;
|
//PRegEn = 1'b0;
|
||||||
HPTWRead = 1'b0;
|
HPTWRead = 1'b0;
|
||||||
|
|
||||||
case (WalkerState)
|
case (WalkerState)
|
||||||
@ -220,7 +215,7 @@ module pagetablewalker
|
|||||||
if (HPTWStall) NextWalkerState = LEVEL1_WDV;
|
if (HPTWStall) NextWalkerState = LEVEL1_WDV;
|
||||||
else begin
|
else begin
|
||||||
NextWalkerState = LEVEL1;
|
NextWalkerState = LEVEL1;
|
||||||
PRegEn = 1'b1;
|
//PRegEn = 1'b1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
LEVEL1: begin
|
LEVEL1: begin
|
||||||
@ -236,7 +231,7 @@ module pagetablewalker
|
|||||||
if (HPTWStall) NextWalkerState = LEVEL0_WDV;
|
if (HPTWStall) NextWalkerState = LEVEL0_WDV;
|
||||||
else begin
|
else begin
|
||||||
NextWalkerState = LEVEL0;
|
NextWalkerState = LEVEL0;
|
||||||
PRegEn = 1'b1;
|
//PRegEn = 1'b1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
LEVEL0: if (ValidPTE & LeafPTE & ~ADPageFault) NextWalkerState = LEAF;
|
LEVEL0: if (ValidPTE & LeafPTE & ~ADPageFault) NextWalkerState = LEAF;
|
||||||
@ -265,7 +260,7 @@ module pagetablewalker
|
|||||||
assign MegapageMisaligned = |(CurrentPPN[8:0]);
|
assign MegapageMisaligned = |(CurrentPPN[8:0]);
|
||||||
|
|
||||||
always_comb begin
|
always_comb begin
|
||||||
PRegEn = 1'b0;
|
//PRegEn = 1'b0;
|
||||||
HPTWRead = 1'b0;
|
HPTWRead = 1'b0;
|
||||||
|
|
||||||
case (WalkerState)
|
case (WalkerState)
|
||||||
@ -277,7 +272,7 @@ module pagetablewalker
|
|||||||
if (HPTWStall) NextWalkerState = LEVEL3_WDV;
|
if (HPTWStall) NextWalkerState = LEVEL3_WDV;
|
||||||
else begin
|
else begin
|
||||||
NextWalkerState = LEVEL3;
|
NextWalkerState = LEVEL3;
|
||||||
PRegEn = 1'b1;
|
//PRegEn = 1'b1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
LEVEL3:
|
LEVEL3:
|
||||||
@ -290,7 +285,7 @@ module pagetablewalker
|
|||||||
if (HPTWStall) NextWalkerState = LEVEL2_WDV;
|
if (HPTWStall) NextWalkerState = LEVEL2_WDV;
|
||||||
else begin
|
else begin
|
||||||
NextWalkerState = LEVEL2;
|
NextWalkerState = LEVEL2;
|
||||||
PRegEn = 1'b1;
|
//PRegEn = 1'b1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
LEVEL2:
|
LEVEL2:
|
||||||
@ -303,7 +298,7 @@ module pagetablewalker
|
|||||||
if (HPTWStall) NextWalkerState = LEVEL1_WDV;
|
if (HPTWStall) NextWalkerState = LEVEL1_WDV;
|
||||||
else begin
|
else begin
|
||||||
NextWalkerState = LEVEL1;
|
NextWalkerState = LEVEL1;
|
||||||
PRegEn = 1'b1;
|
//PRegEn = 1'b1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
LEVEL1:
|
LEVEL1:
|
||||||
@ -316,7 +311,7 @@ module pagetablewalker
|
|||||||
if (HPTWStall) NextWalkerState = LEVEL0_WDV;
|
if (HPTWStall) NextWalkerState = LEVEL0_WDV;
|
||||||
else begin
|
else begin
|
||||||
NextWalkerState = LEVEL0;
|
NextWalkerState = LEVEL0;
|
||||||
PRegEn = 1'b1;
|
//PRegEn = 1'b1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
LEVEL0:
|
LEVEL0:
|
||||||
|
@ -746,6 +746,7 @@ module riscvassertions();
|
|||||||
initial begin
|
initial begin
|
||||||
assert (`PMP_ENTRIES == 0 || `PMP_ENTRIES==16 || `PMP_ENTRIES==64) else $error("Illegal number of PMP entries");
|
assert (`PMP_ENTRIES == 0 || `PMP_ENTRIES==16 || `PMP_ENTRIES==64) else $error("Illegal number of PMP entries");
|
||||||
assert (`F_SUPPORTED || ~`D_SUPPORTED) else $error("Can't support double without supporting float");
|
assert (`F_SUPPORTED || ~`D_SUPPORTED) else $error("Can't support double without supporting float");
|
||||||
|
assert (`XLEN == 64 || ~`D_SUPPORTED) else $error("Wally does not yet support D extensions on RV32");
|
||||||
end
|
end
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user