blob: 8225b3e4118da66e687926b5266577e521a1c785 [file] [log] [blame]
`include "../params.vh"
module leaf_pte_check
#(
parameter PTE_SIZE_IN_BIT = 64
)
(
input [1:0] access_mode_i,
input csr_sstatus_mxr_i,
input csr_sstatus_sum_i,
input [1:0] priviledge_level_i,
input [1:0] page_table_level_i,
input pte_active_i,
input [PTE_SIZE_IN_BIT - 1 : 0] pte_i,
input pte_is_leaf_i,
output pte_valid_o,
output page_fault_valid_o
);
reg page_fault_valid;
initial begin
page_fault_valid = 0;
end
always @(*) begin
if (pte_active_i && pte_is_leaf_i) begin
// Step 5: Check access mode
if ((access_mode_i == ACCESS_MODE_READ)
&& (!pte_i[`pte_r] && !(pte_i[`pte_x] && csr_sstatus_mxr_i)))begin
page_fault_valid = 1;
$display("cause : 1");
end
else if ((access_mode_i == ACCESS_MODE_WRITE)
&& (!pte_i[`pte_w]))begin
page_fault_valid = 1;
$display("cause : 2");
end
else if ((access_mode_i == ACCESS_MODE_EXECUTE)
&& (!pte_i[`pte_x]))begin
page_fault_valid = 1;
$display("cause : 3");
end
// Step 5: Check priviledge level
else if ((priviledge_level_i == U_MODE) && !pte_i[`pte_u])begin
page_fault_valid = 1;
$display("cause : 4");
end
else if ((priviledge_level_i == S_MODE) && pte_i[`pte_u] && !csr_sstatus_sum_i)begin
page_fault_valid = 1;
$display("cause : 5");
end
// Step 6: misaligned superpage check
else if (((pte_i[`pte_ppn0] != 0) && (page_table_level_i > 0)) ||
((pte_i[`pte_ppn1]!= 0) && (page_table_level_i > 1)))begin
page_fault_valid = 1;
$display("cause : 6");
end
// Step 7:
else if (!pte_i[`pte_a] || ((access_mode_i == ACCESS_MODE_WRITE) && !pte_i[`pte_d]))begin
page_fault_valid = 1;
$display("cause : 7");
end
else
page_fault_valid = 0;
end else begin
page_fault_valid = 0;
end
end
assign pte_valid_o = ~page_fault_valid;
assign page_fault_valid_o = page_fault_valid;
endmodule : leaf_pte_check