From 01e6d69a67234f82eef6b0abbf16ab9f5bf036d5 Mon Sep 17 00:00:00 2001 From: Madeleine Masser-Frye <51804758+mmasserfrye@users.noreply.github.com> Date: Wed, 6 Jul 2022 00:02:01 +0000 Subject: [PATCH] took first match out of pmpadrdec --- pipelined/src/mmu/pmpadrdec.sv | 9 ++++----- pipelined/src/mmu/pmpchecker.sv | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/pipelined/src/mmu/pmpadrdec.sv b/pipelined/src/mmu/pmpadrdec.sv index f895ce77..fc65a68c 100644 --- a/pipelined/src/mmu/pmpadrdec.sv +++ b/pipelined/src/mmu/pmpadrdec.sv @@ -39,7 +39,6 @@ module pmpadrdec ( input logic [7:0] PMPCfg, input logic [`XLEN-1:0] PMPAdr, input logic PAgePMPAdrIn, - input logic FirstMatch, output logic PAgePMPAdrOut, output logic Match, Active, output logic L, X, W, R @@ -83,10 +82,10 @@ module pmpadrdec ( (AdrMode == NA4 | AdrMode == NAPOT) ? NAMatch : 0; - assign L = PMPCfg[7] & FirstMatch; - assign X = PMPCfg[2] & FirstMatch; - assign W = PMPCfg[1] & FirstMatch; - assign R = PMPCfg[0] & FirstMatch; + assign L = PMPCfg[7]; + assign X = PMPCfg[2]; + assign W = PMPCfg[1]; + assign R = PMPCfg[0]; assign Active = |PMPCfg[4:3]; endmodule diff --git a/pipelined/src/mmu/pmpchecker.sv b/pipelined/src/mmu/pmpchecker.sv index 1bf85507..33de9b30 100644 --- a/pipelined/src/mmu/pmpchecker.sv +++ b/pipelined/src/mmu/pmpchecker.sv @@ -67,16 +67,16 @@ module pmpchecker ( .PMPAdr(PMPADDR_ARRAY_REGW), .PAgePMPAdrIn({PAgePMPAdr[`PMP_ENTRIES-2:0], 1'b1}), .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. // 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 PMPStoreAmoAccessFaultM = EnforcePMP & WriteAccessM & ~|W; - assign PMPLoadAccessFaultM = EnforcePMP & ReadAccessM & ~|R; + assign PMPInstrAccessFaultF = EnforcePMP & ExecuteAccessF & ~|(X & FirstMatch) ; + assign PMPStoreAmoAccessFaultM = EnforcePMP & WriteAccessM & ~|(W & FirstMatch) ; + assign PMPLoadAccessFaultM = EnforcePMP & ReadAccessM & ~|(R & FirstMatch) ; end else begin: pmpchecker // no checker assign PMPInstrAccessFaultF = 0; assign PMPLoadAccessFaultM = 0;