PMP plugin passes regression tests
This commit is contained in:
parent
763eebeeba
commit
f2ce2eab00
|
@ -211,6 +211,7 @@ class success : public std::exception { };
|
||||||
#define MCYCLEH 0xB80 // MRW Upper 32 bits of mcycle, RV32I only.
|
#define MCYCLEH 0xB80 // MRW Upper 32 bits of mcycle, RV32I only.
|
||||||
#define MINSTRETH 0xB82 // MRW Upper 32 bits of minstret, RV32I only.
|
#define MINSTRETH 0xB82 // MRW Upper 32 bits of minstret, RV32I only.
|
||||||
|
|
||||||
|
|
||||||
#define SSTATUS 0x100
|
#define SSTATUS 0x100
|
||||||
#define SIE 0x104
|
#define SIE 0x104
|
||||||
#define STVEC 0x105
|
#define STVEC 0x105
|
||||||
|
@ -373,25 +374,9 @@ public:
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
bool lrscReserved;
|
bool lrscReserved;
|
||||||
|
|
||||||
struct pmpcfg_s {
|
|
||||||
uint32_t r : 1;
|
|
||||||
uint32_t w : 1;
|
|
||||||
uint32_t x : 1;
|
|
||||||
uint32_t a : 2;
|
|
||||||
uint32_t _dummy : 2;
|
|
||||||
uint32_t l : 1;
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
union pmpcfg_u {
|
|
||||||
uint32_t raw;
|
|
||||||
pmpcfg_s reg[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
pmpcfg_u pmpcfg[4];
|
|
||||||
uint32_t pmpaddr[16];
|
|
||||||
|
|
||||||
RiscvGolden() {
|
RiscvGolden() {
|
||||||
pc = 0x80000000;
|
pc = 0x80000000;
|
||||||
regs[0] = 0;
|
regs[0] = 0;
|
||||||
|
@ -416,10 +401,6 @@ public:
|
||||||
ipInput = 0;
|
ipInput = 0;
|
||||||
stepCounter = 0;
|
stepCounter = 0;
|
||||||
lrscReserved = false;
|
lrscReserved = false;
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
pmpcfg[i].raw = 0;
|
|
||||||
for (int i = 0; i < 16; i++)
|
|
||||||
pmpaddr[i] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void rfWrite(int32_t address, int32_t data) {
|
virtual void rfWrite(int32_t address, int32_t data) {
|
||||||
|
@ -444,10 +425,8 @@ public:
|
||||||
|
|
||||||
enum AccessKind {READ,WRITE,EXECUTE,READ_WRITE};
|
enum AccessKind {READ,WRITE,EXECUTE,READ_WRITE};
|
||||||
virtual bool isMmuRegion(uint32_t v) = 0;
|
virtual bool isMmuRegion(uint32_t v) = 0;
|
||||||
|
bool v2p(uint32_t v, uint32_t *p, AccessKind kind){
|
||||||
|
uint32_t effectivePrivilege = status.mprv && kind != EXECUTE ? status.mpp : privilege;
|
||||||
bool v2p(uint32_t v, uint32_t *p, AccessKind kind) {
|
|
||||||
uint32_t effectivePrivilege = status.mprv && kind != EXECUTE ? status.mpp : privilege;
|
|
||||||
if(effectivePrivilege == 3 || satp.mode == 0 || !isMmuRegion(v)){
|
if(effectivePrivilege == 3 || satp.mode == 0 || !isMmuRegion(v)){
|
||||||
*p = v;
|
*p = v;
|
||||||
} else {
|
} else {
|
||||||
|
@ -549,7 +528,7 @@ public:
|
||||||
|
|
||||||
virtual bool csrRead(int32_t csr, uint32_t *value){
|
virtual bool csrRead(int32_t csr, uint32_t *value){
|
||||||
if(((csr >> 8) & 0x3) > privilege) return true;
|
if(((csr >> 8) & 0x3) > privilege) return true;
|
||||||
switch(csr) {
|
switch(csr){
|
||||||
case MSTATUS: *value = status.raw & MSTATUS_READ_MASK; break;
|
case MSTATUS: *value = status.raw & MSTATUS_READ_MASK; break;
|
||||||
case MIP: *value = getIp().raw; break;
|
case MIP: *value = getIp().raw; break;
|
||||||
case MIE: *value = ie.raw; break;
|
case MIE: *value = ie.raw; break;
|
||||||
|
@ -571,7 +550,6 @@ public:
|
||||||
case SEPC: *value = sepc; break;
|
case SEPC: *value = sepc; break;
|
||||||
case SSCRATCH: *value = sscratch; break;
|
case SSCRATCH: *value = sscratch; break;
|
||||||
case SATP: *value = satp.raw; break;
|
case SATP: *value = satp.raw; break;
|
||||||
|
|
||||||
default: return true; break;
|
default: return true; break;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -610,6 +588,8 @@ public:
|
||||||
case SCAUSE: scause.raw = value; break;
|
case SCAUSE: scause.raw = value; break;
|
||||||
case STVAL: sbadaddr = value; break;
|
case STVAL: sbadaddr = value; break;
|
||||||
case SEPC: sepc = value; break;
|
case SEPC: sepc = value; break;
|
||||||
|
case SSCRATCH: sscratch = value; break;
|
||||||
|
case SATP: satp.raw = value; break;
|
||||||
|
|
||||||
default: ilegalInstruction(); return true; break;
|
default: ilegalInstruction(); return true; break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ CSR_SKIP_TEST?=no
|
||||||
EBREAK?=no
|
EBREAK?=no
|
||||||
FENCEI?=no
|
FENCEI?=no
|
||||||
MMU?=yes
|
MMU?=yes
|
||||||
PMP?=yes
|
PMP?=no
|
||||||
SEED?=no
|
SEED?=no
|
||||||
LRSC?=no
|
LRSC?=no
|
||||||
AMO?=no
|
AMO?=no
|
||||||
|
|
|
@ -46,6 +46,7 @@ abstract class VexRiscvPosition(name: String) extends ConfigPosition[VexRiscvCo
|
||||||
class VexRiscvUniverse extends ConfigUniverse
|
class VexRiscvUniverse extends ConfigUniverse
|
||||||
|
|
||||||
object VexRiscvUniverse{
|
object VexRiscvUniverse{
|
||||||
|
val CACHE_ALL = new VexRiscvUniverse
|
||||||
val CATCH_ALL = new VexRiscvUniverse
|
val CATCH_ALL = new VexRiscvUniverse
|
||||||
val MMU = new VexRiscvUniverse
|
val MMU = new VexRiscvUniverse
|
||||||
val PMP = new VexRiscvUniverse
|
val PMP = new VexRiscvUniverse
|
||||||
|
@ -322,9 +323,10 @@ class IBusDimension(rvcRate : Double) extends VexRiscvDimension("IBus") {
|
||||||
|
|
||||||
override def randomPositionImpl(universes: Seq[ConfigUniverse], r: Random) = {
|
override def randomPositionImpl(universes: Seq[ConfigUniverse], r: Random) = {
|
||||||
val catchAll = universes.contains(VexRiscvUniverse.CATCH_ALL)
|
val catchAll = universes.contains(VexRiscvUniverse.CATCH_ALL)
|
||||||
|
val cacheAll = universes.contains(VexRiscvUniverse.CACHE_ALL)
|
||||||
val mmuConfig = if(universes.contains(VexRiscvUniverse.MMU)) MmuPortConfig( portTlbSize = 4) else null
|
val mmuConfig = if(universes.contains(VexRiscvUniverse.MMU)) MmuPortConfig( portTlbSize = 4) else null
|
||||||
|
|
||||||
if(r.nextDouble() < 0.5){
|
if(r.nextDouble() < 0.5 && !cacheAll){
|
||||||
val latency = r.nextInt(5) + 1
|
val latency = r.nextInt(5) + 1
|
||||||
val compressed = r.nextDouble() < rvcRate
|
val compressed = r.nextDouble() < rvcRate
|
||||||
val injectorStage = r.nextBoolean() || latency == 1
|
val injectorStage = r.nextBoolean() || latency == 1
|
||||||
|
@ -403,13 +405,14 @@ class DBusDimension extends VexRiscvDimension("DBus") {
|
||||||
|
|
||||||
override def randomPositionImpl(universes: Seq[ConfigUniverse], r: Random) = {
|
override def randomPositionImpl(universes: Seq[ConfigUniverse], r: Random) = {
|
||||||
val catchAll = universes.contains(VexRiscvUniverse.CATCH_ALL)
|
val catchAll = universes.contains(VexRiscvUniverse.CATCH_ALL)
|
||||||
|
val cacheAll = universes.contains(VexRiscvUniverse.CACHE_ALL)
|
||||||
val mmuConfig = if(universes.contains(VexRiscvUniverse.MMU)) MmuPortConfig( portTlbSize = 4) else null
|
val mmuConfig = if(universes.contains(VexRiscvUniverse.MMU)) MmuPortConfig( portTlbSize = 4) else null
|
||||||
val noMemory = universes.contains(VexRiscvUniverse.NO_MEMORY)
|
val noMemory = universes.contains(VexRiscvUniverse.NO_MEMORY)
|
||||||
val noWriteBack = universes.contains(VexRiscvUniverse.NO_WRITEBACK)
|
val noWriteBack = universes.contains(VexRiscvUniverse.NO_WRITEBACK)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(r.nextDouble() < 0.4 || noMemory){
|
if((r.nextDouble() < 0.4 || noMemory) && !cacheAll){
|
||||||
val withLrSc = catchAll
|
val withLrSc = catchAll
|
||||||
val earlyInjection = r.nextBoolean() && !universes.contains(VexRiscvUniverse.NO_WRITEBACK)
|
val earlyInjection = r.nextBoolean() && !universes.contains(VexRiscvUniverse.NO_WRITEBACK)
|
||||||
new VexRiscvPosition("Simple" + (if(earlyInjection) "Early" else "Late")) {
|
new VexRiscvPosition("Simple" + (if(earlyInjection) "Early" else "Late")) {
|
||||||
|
@ -760,18 +763,15 @@ class TestIndividualFeatures extends MultithreadedFunSuite {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(machineOsRate > rand.nextDouble()) {
|
if(machineOsRate > rand.nextDouble()) {
|
||||||
|
universe += VexRiscvUniverse.CACHE_ALL
|
||||||
universe += VexRiscvUniverse.CATCH_ALL
|
universe += VexRiscvUniverse.CATCH_ALL
|
||||||
universe += VexRiscvUniverse.PMP
|
universe += VexRiscvUniverse.PMP
|
||||||
if(demwRate < rand.nextDouble()){
|
if(demwRate < rand.nextDouble()){
|
||||||
universe += VexRiscvUniverse.NO_WRITEBACK
|
universe += VexRiscvUniverse.NO_WRITEBACK
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(demwRate > rand.nextDouble()){
|
if(demRate > rand.nextDouble()){
|
||||||
}else if(demRate > rand.nextDouble()){
|
|
||||||
universe += VexRiscvUniverse.NO_WRITEBACK
|
universe += VexRiscvUniverse.NO_WRITEBACK
|
||||||
} else {
|
|
||||||
universe += VexRiscvUniverse.NO_WRITEBACK
|
|
||||||
universe += VexRiscvUniverse.NO_MEMORY
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue