Update behaviour of mstatus.mpp and mprv on mret to match priv-1.12 spec
This commit is contained in:
parent
a17b941e38
commit
156fbcd019
|
@ -158,6 +158,14 @@ reg mstatus_tw;
|
|||
|
||||
wire wen_m_mode = wen && (m_mode || debug_mode);
|
||||
|
||||
// Spec text from priv-1.12:
|
||||
// "An MRET or SRET instruction is used to return from a trap in M-mode or
|
||||
// S-mode respectively. When executing an xRET instruction, supposing xPP
|
||||
// holds the value y, xIE is set to xPIE; the privilege mode is changed to
|
||||
// y; xPIE is set to 1; and xPP is set to the least-privileged supported
|
||||
// mode (U if U-mode is implemented, else M). If xPP=M, xRET also sets
|
||||
// MPRV=0."
|
||||
|
||||
always @ (posedge clk or negedge rst_n) begin
|
||||
if (!rst_n) begin
|
||||
m_mode <= 1'b1;
|
||||
|
@ -173,6 +181,10 @@ always @ (posedge clk or negedge rst_n) begin
|
|||
mstatus_mie <= mstatus_mpie;
|
||||
if (U_MODE) begin
|
||||
m_mode <= mstatus_mpp;
|
||||
mstatus_mpp <= 1'b0;
|
||||
if (!mstatus_mpp) begin
|
||||
mstatus_mprv <= 1'b0;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
mstatus_mpie <= mstatus_mie;
|
||||
|
|
Loading…
Reference in New Issue