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"
|
||||
|
||||
/* ***
|
||||
TO-DO:
|
||||
- Implement faults on accessed/dirty behavior
|
||||
*/
|
||||
|
||||
module pagetablewalker
|
||||
(
|
||||
// Control signals
|
||||
@ -152,6 +147,7 @@ module pagetablewalker
|
||||
assign PageType = (PreviousWalkerState == LEVEL3) ? 2'b11 : // *** not sure about this mux?
|
||||
((PreviousWalkerState == LEVEL2) ? 2'b10 :
|
||||
((PreviousWalkerState == LEVEL1) ? 2'b01 : 2'b00));
|
||||
assign PRegEn = (NextWalkerState == LEVEL3) | (NextWalkerState == LEVEL2) | (NextWalkerState == LEVEL1) | (NextWalkerState == LEVEL0);
|
||||
|
||||
// *** 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].
|
||||
assign MegapageMisaligned = |(CurrentPPN[9:0]);
|
||||
|
||||
|
||||
// State transition logic
|
||||
always_comb begin
|
||||
PRegEn = 1'b0;
|
||||
//PRegEn = 1'b0;
|
||||
HPTWRead = 1'b0;
|
||||
|
||||
case (WalkerState)
|
||||
@ -220,7 +215,7 @@ module pagetablewalker
|
||||
if (HPTWStall) NextWalkerState = LEVEL1_WDV;
|
||||
else begin
|
||||
NextWalkerState = LEVEL1;
|
||||
PRegEn = 1'b1;
|
||||
//PRegEn = 1'b1;
|
||||
end
|
||||
end
|
||||
LEVEL1: begin
|
||||
@ -236,7 +231,7 @@ module pagetablewalker
|
||||
if (HPTWStall) NextWalkerState = LEVEL0_WDV;
|
||||
else begin
|
||||
NextWalkerState = LEVEL0;
|
||||
PRegEn = 1'b1;
|
||||
//PRegEn = 1'b1;
|
||||
end
|
||||
end
|
||||
LEVEL0: if (ValidPTE & LeafPTE & ~ADPageFault) NextWalkerState = LEAF;
|
||||
@ -265,7 +260,7 @@ module pagetablewalker
|
||||
assign MegapageMisaligned = |(CurrentPPN[8:0]);
|
||||
|
||||
always_comb begin
|
||||
PRegEn = 1'b0;
|
||||
//PRegEn = 1'b0;
|
||||
HPTWRead = 1'b0;
|
||||
|
||||
case (WalkerState)
|
||||
@ -277,7 +272,7 @@ module pagetablewalker
|
||||
if (HPTWStall) NextWalkerState = LEVEL3_WDV;
|
||||
else begin
|
||||
NextWalkerState = LEVEL3;
|
||||
PRegEn = 1'b1;
|
||||
//PRegEn = 1'b1;
|
||||
end
|
||||
end
|
||||
LEVEL3:
|
||||
@ -290,7 +285,7 @@ module pagetablewalker
|
||||
if (HPTWStall) NextWalkerState = LEVEL2_WDV;
|
||||
else begin
|
||||
NextWalkerState = LEVEL2;
|
||||
PRegEn = 1'b1;
|
||||
//PRegEn = 1'b1;
|
||||
end
|
||||
end
|
||||
LEVEL2:
|
||||
@ -303,7 +298,7 @@ module pagetablewalker
|
||||
if (HPTWStall) NextWalkerState = LEVEL1_WDV;
|
||||
else begin
|
||||
NextWalkerState = LEVEL1;
|
||||
PRegEn = 1'b1;
|
||||
//PRegEn = 1'b1;
|
||||
end
|
||||
end
|
||||
LEVEL1:
|
||||
@ -316,7 +311,7 @@ module pagetablewalker
|
||||
if (HPTWStall) NextWalkerState = LEVEL0_WDV;
|
||||
else begin
|
||||
NextWalkerState = LEVEL0;
|
||||
PRegEn = 1'b1;
|
||||
//PRegEn = 1'b1;
|
||||
end
|
||||
end
|
||||
LEVEL0:
|
||||
|
@ -746,6 +746,7 @@ module riscvassertions();
|
||||
initial begin
|
||||
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 (`XLEN == 64 || ~`D_SUPPORTED) else $error("Wally does not yet support D extensions on RV32");
|
||||
end
|
||||
endmodule
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user