mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
took first match out of pmpadrdec
This commit is contained in:
parent
50e9b6ac53
commit
01e6d69a67
@ -39,7 +39,6 @@ module pmpadrdec (
|
|||||||
input logic [7:0] PMPCfg,
|
input logic [7:0] PMPCfg,
|
||||||
input logic [`XLEN-1:0] PMPAdr,
|
input logic [`XLEN-1:0] PMPAdr,
|
||||||
input logic PAgePMPAdrIn,
|
input logic PAgePMPAdrIn,
|
||||||
input logic FirstMatch,
|
|
||||||
output logic PAgePMPAdrOut,
|
output logic PAgePMPAdrOut,
|
||||||
output logic Match, Active,
|
output logic Match, Active,
|
||||||
output logic L, X, W, R
|
output logic L, X, W, R
|
||||||
@ -83,10 +82,10 @@ module pmpadrdec (
|
|||||||
(AdrMode == NA4 | AdrMode == NAPOT) ? NAMatch :
|
(AdrMode == NA4 | AdrMode == NAPOT) ? NAMatch :
|
||||||
0;
|
0;
|
||||||
|
|
||||||
assign L = PMPCfg[7] & FirstMatch;
|
assign L = PMPCfg[7];
|
||||||
assign X = PMPCfg[2] & FirstMatch;
|
assign X = PMPCfg[2];
|
||||||
assign W = PMPCfg[1] & FirstMatch;
|
assign W = PMPCfg[1];
|
||||||
assign R = PMPCfg[0] & FirstMatch;
|
assign R = PMPCfg[0];
|
||||||
assign Active = |PMPCfg[4:3];
|
assign Active = |PMPCfg[4:3];
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
@ -67,16 +67,16 @@ module pmpchecker (
|
|||||||
.PMPAdr(PMPADDR_ARRAY_REGW),
|
.PMPAdr(PMPADDR_ARRAY_REGW),
|
||||||
.PAgePMPAdrIn({PAgePMPAdr[`PMP_ENTRIES-2:0], 1'b1}),
|
.PAgePMPAdrIn({PAgePMPAdr[`PMP_ENTRIES-2:0], 1'b1}),
|
||||||
.PAgePMPAdrOut(PAgePMPAdr),
|
.PAgePMPAdrOut(PAgePMPAdr),
|
||||||
.FirstMatch, .Match, .Active, .L, .X, .W, .R);
|
.Match, .Active, .L, .X, .W, .R);
|
||||||
|
|
||||||
priorityonehot #(`PMP_ENTRIES) pmppriority(.a(Match), .y(FirstMatch)); // combine the match signal from all the adress decoders to find the first one that matches.
|
priorityonehot #(`PMP_ENTRIES) pmppriority(.a(Match), .y(FirstMatch)); // combine the match signal from all the adress decoders to find the first one that matches.
|
||||||
|
|
||||||
// Only enforce PMP checking for S and U modes when at least one PMP is active or in Machine mode when L bit is set in selected region
|
// Only enforce PMP checking for S and U modes when at least one PMP is active or in Machine mode when L bit is set in selected region
|
||||||
assign EnforcePMP = (PrivilegeModeW == `M_MODE) ? |L : |Active;
|
assign EnforcePMP = (PrivilegeModeW == `M_MODE) ? |(L & FirstMatch) : |Active;
|
||||||
|
|
||||||
assign PMPInstrAccessFaultF = EnforcePMP & ExecuteAccessF & ~|X;
|
assign PMPInstrAccessFaultF = EnforcePMP & ExecuteAccessF & ~|(X & FirstMatch) ;
|
||||||
assign PMPStoreAmoAccessFaultM = EnforcePMP & WriteAccessM & ~|W;
|
assign PMPStoreAmoAccessFaultM = EnforcePMP & WriteAccessM & ~|(W & FirstMatch) ;
|
||||||
assign PMPLoadAccessFaultM = EnforcePMP & ReadAccessM & ~|R;
|
assign PMPLoadAccessFaultM = EnforcePMP & ReadAccessM & ~|(R & FirstMatch) ;
|
||||||
end else begin: pmpchecker // no checker
|
end else begin: pmpchecker // no checker
|
||||||
assign PMPInstrAccessFaultF = 0;
|
assign PMPInstrAccessFaultF = 0;
|
||||||
assign PMPLoadAccessFaultM = 0;
|
assign PMPLoadAccessFaultM = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user