mirror of
https://github.com/openhwgroup/cvw.git
synced 2025-06-28 09:36:01 -04:00
Fixed cvw-arch-verif Issue #553 about misaligned lr/sc needs to throw access fault
This commit is contained in:
parent
25dbebb75c
commit
e9ea1f59c4
1 changed files with 7 additions and 9 deletions
|
@ -74,8 +74,7 @@ module mmu import cvw::*; #(parameter cvw_t P,
|
||||||
logic TLBPageFault; // Page fault from TLB
|
logic TLBPageFault; // Page fault from TLB
|
||||||
logic ReadNoAmoAccessM; // Read that is not part of atomic operation causes Load faults. Otherwise StoreAmo faults
|
logic ReadNoAmoAccessM; // Read that is not part of atomic operation causes Load faults. Otherwise StoreAmo faults
|
||||||
logic [1:0] PBMemoryType; // PBMT field of PTE during TLB hit, or 00 otherwise
|
logic [1:0] PBMemoryType; // PBMT field of PTE during TLB hit, or 00 otherwise
|
||||||
logic AmoMisalignedCausesAccessFaultM; // Misaligned AMO is not handled by hardware even with ZICCLSM, so it throws an access fault instead of misaligned with ZICCLSM
|
logic AtomicMisalignedCausesAccessFaultM; // Misaligned atomics are not handled by hardware even with ZICCLSM, so it throws an access fault instead of misaligned with ZICCLSM
|
||||||
logic AmoAccessM; // AMO access detected when ReadAccessM and WriteAccessM are simultaneously asserted
|
|
||||||
|
|
||||||
// only instantiate TLB if Virtual Memory is supported
|
// only instantiate TLB if Virtual Memory is supported
|
||||||
if (P.VIRTMEM_SUPPORTED) begin:tlb
|
if (P.VIRTMEM_SUPPORTED) begin:tlb
|
||||||
|
@ -127,7 +126,6 @@ module mmu import cvw::*; #(parameter cvw_t P,
|
||||||
end
|
end
|
||||||
|
|
||||||
assign ReadNoAmoAccessM = ReadAccessM & ~WriteAccessM;// AMO causes StoreAmo rather than Load fault
|
assign ReadNoAmoAccessM = ReadAccessM & ~WriteAccessM;// AMO causes StoreAmo rather than Load fault
|
||||||
assign AmoAccessM = ReadAccessM & WriteAccessM;
|
|
||||||
|
|
||||||
// Misaligned faults
|
// Misaligned faults
|
||||||
always_comb // exclusion-tag: immu-wordaccess
|
always_comb // exclusion-tag: immu-wordaccess
|
||||||
|
@ -141,15 +139,15 @@ module mmu import cvw::*; #(parameter cvw_t P,
|
||||||
assign LoadMisalignedFaultM = DataMisalignedM & ReadNoAmoAccessM & ~(P.ZICCLSM_SUPPORTED & Cacheable) & ~TLBMiss;
|
assign LoadMisalignedFaultM = DataMisalignedM & ReadNoAmoAccessM & ~(P.ZICCLSM_SUPPORTED & Cacheable) & ~TLBMiss;
|
||||||
assign StoreAmoMisalignedFaultM = DataMisalignedM & WriteAccessM & ~(P.ZICCLSM_SUPPORTED & Cacheable) & ~TLBMiss; // Store and AMO both assert WriteAccess
|
assign StoreAmoMisalignedFaultM = DataMisalignedM & WriteAccessM & ~(P.ZICCLSM_SUPPORTED & Cacheable) & ~TLBMiss; // Store and AMO both assert WriteAccess
|
||||||
|
|
||||||
|
// a misaligned Atomic causes an access fault rather than a misaligned fault if a misaligned load/store is handled in hardware
|
||||||
|
// this is subtle - see privileged spec 3.6.3.3
|
||||||
|
assign AtomicMisalignedCausesAccessFaultM = DataMisalignedM & AtomicAccessM & (P.ZICCLSM_SUPPORTED & Cacheable);
|
||||||
|
|
||||||
// Access faults
|
// Access faults
|
||||||
// If TLB miss and translating we want to not have faults from the PMA and PMP checkers.
|
// If TLB miss and translating we want to not have faults from the PMA and PMP checkers.
|
||||||
assign InstrAccessFaultF = (PMAInstrAccessFaultF | PMPInstrAccessFaultF) & ~TLBMiss;
|
assign InstrAccessFaultF = (PMAInstrAccessFaultF | PMPInstrAccessFaultF) & ~TLBMiss;
|
||||||
assign LoadAccessFaultM = (PMALoadAccessFaultM | PMPLoadAccessFaultM) & ~TLBMiss;
|
assign LoadAccessFaultM = (PMALoadAccessFaultM | PMPLoadAccessFaultM | AtomicMisalignedCausesAccessFaultM & ReadNoAmoAccessM) & ~TLBMiss;
|
||||||
// a misaligned AMO causes an access fault rather than a misaligned fault if a misaligned load/store is handled in hardware
|
assign StoreAmoAccessFaultM = (PMAStoreAmoAccessFaultM | PMPStoreAmoAccessFaultM | AtomicMisalignedCausesAccessFaultM & WriteAccessM) & ~TLBMiss;
|
||||||
// this is subtle - see privileged spec 3.6.3.3
|
|
||||||
// AMO is detected as ReadAccess & WriteAccess
|
|
||||||
assign AmoMisalignedCausesAccessFaultM = DataMisalignedM & AmoAccessM & (P.ZICCLSM_SUPPORTED & Cacheable);
|
|
||||||
assign StoreAmoAccessFaultM = (PMAStoreAmoAccessFaultM | PMPStoreAmoAccessFaultM | AmoMisalignedCausesAccessFaultM) & ~TLBMiss;
|
|
||||||
|
|
||||||
// Specify which type of page fault is occurring
|
// Specify which type of page fault is occurring
|
||||||
assign InstrPageFaultF = TLBPageFault & ExecuteAccessF;
|
assign InstrPageFaultF = TLBPageFault & ExecuteAccessF;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue