diff --git a/src/mmu/hptw.sv b/src/mmu/hptw.sv index 4e9003dc3..8cebd2d22 100644 --- a/src/mmu/hptw.sv +++ b/src/mmu/hptw.sv @@ -104,18 +104,21 @@ module hptw import cvw::*; #(parameter cvw_t P) ( logic HPTWAccessFaultDelay; logic TakeHPTWFault; logic PBMTFaultM; + logic DAUFaultM; + logic PBMTOrDAUFaultM; logic HPTWFaultM; logic ResetPTE; // map hptw access faults onto either the original LSU load/store fault or instruction access fault assign LSUAccessFaultM = LSULoadAccessFaultM | LSUStoreAmoAccessFaultM; - assign HPTWFaultM = LSUAccessFaultM | PBMTFaultM; + assign PBMTOrDAUFaultM = PBMTFaultM | DAUFaultM; + assign HPTWFaultM = LSUAccessFaultM | PBMTOrDAUFaultM; assign HPTWLoadAccessFault = LSUAccessFaultM & DTLBWalk & MemRWM[1] & ~MemRWM[0]; assign HPTWStoreAmoAccessFault = LSUAccessFaultM & DTLBWalk & MemRWM[0]; assign HPTWInstrAccessFault = LSUAccessFaultM & ~DTLBWalk; - assign HPTWLoadPageFault = PBMTFaultM & DTLBWalk & MemRWM[1] & ~MemRWM[0]; - assign HPTWStoreAmoPageFault = PBMTFaultM & DTLBWalk & MemRWM[0]; - assign HPTWInstrPageFault = PBMTFaultM & ~DTLBWalk; + assign HPTWLoadPageFault = PBMTOrDAUFaultM & DTLBWalk & MemRWM[1] & ~MemRWM[0]; + assign HPTWStoreAmoPageFault = PBMTOrDAUFaultM & DTLBWalk & MemRWM[0]; + assign HPTWInstrPageFault = PBMTOrDAUFaultM & ~DTLBWalk; flopr #(6) HPTWAccesFaultReg(clk, reset, {HPTWLoadAccessFault, HPTWStoreAmoAccessFault, HPTWInstrAccessFault, HPTWLoadPageFault, HPTWStoreAmoPageFault, HPTWInstrPageFault}, @@ -155,6 +158,7 @@ module hptw import cvw::*; #(parameter cvw_t P) ( assign ValidNonLeafPTE = Valid & ~LeafPTE; if(P.XLEN == 64) assign PBMTFaultM = ValidNonLeafPTE & (|PTE[62:61]); else assign PBMTFaultM = 1'b0; + assign DAUFaultM = ValidNonLeafPTE & (|PTE[7:6] | PTE[4]); if(P.SVADU_SUPPORTED) begin : hptwwrites logic ReadAccess, WriteAccess; diff --git a/tests/breker/Makefile b/tests/breker/Makefile index e21b6b3d5..4d41ad874 100644 --- a/tests/breker/Makefile +++ b/tests/breker/Makefile @@ -1,3 +1,6 @@ +NUM_TESTS ?= 1 # Number of tests to generate for each constraint file + +# General Makefile settings SHELL := /bin/bash # Breker/Trek paths and variables @@ -21,26 +24,29 @@ LINK_FLAGS := -nostartfiles CFLAGS := -Wa,-alhs -Wa,-L -mcmodel=medany -Og -DSINGLE_CPU WIDTH := 64 -# Find all constraint files and generate tests for each one -TESTS = $(patsubst $(CONSTRAINTS_DIR)/%.yaml,$(TESTDIR)/%,$(CONSTRAINT_FILES)) +# Find all constraint files and generate NUM_TESTS tests for each one +TESTS = $(foreach yaml,$(CONSTRAINT_FILES),$(foreach n,$(shell seq 1 $(NUM_TESTS)),$(patsubst $(CONSTRAINTS_DIR)/%.yaml,$(TESTDIR)/%_$(n),$(yaml)))) + .PHONY: all clean all: $(TESTS) # Generate c tests -$(TESTDIR)/%: $(CONSTRAINTS_DIR)/%.yaml | $(TESTDIR) - $(TREKSVIP) -p $< -p $(CUSTOMER_YAML) -o $@/$* -e pss_top.entry - $(MAKE) $@/$*.elf.memfile +$(TESTDIR)/%: | $(TESTDIR) + $(eval CONSTRAINT_FILE := $(shell echo $* | sed 's/_[0-9]*$$//')) + $(TREKSVIP) -p $(CONSTRAINTS_DIR)/$(CONSTRAINT_FILE).yaml -p $(CUSTOMER_YAML) -o $@/$* -e pss_top.entry + $(MAKE) $@/$*.elf # Compile c code -.PRECIOUS: %.elf -%.elf: %.c +.PRECIOUS: $(TESTDIR)/%.elf +$(TESTDIR)/%.elf: $(TESTDIR)/%.c riscv64-unknown-elf-gcc $(MARCH) $(MABI) $(CFLAGS) $(LINK_FLAGS) -T$(LINKER) -I$(START_LIB_DIR) $(START_LIB) -g -o $@ $< > /dev/null + $(MAKE) $@.objdump # Convert elf to hex -%.elf.memfile: %.elf - riscv64-unknown-elf-objdump -D $< > $<.objdump - riscv64-unknown-elf-elf2hex --bit-width $(WIDTH) --input $< --output $@ - extractFunctionRadix.sh $<.objdump +$(TESTDIR)/%.elf.objdump: $(TESTDIR)/%.elf + riscv64-unknown-elf-objdump -D $< > $@ +# riscv64-unknown-elf-elf2hex --bit-width $(WIDTH) --input $< --output $@ +# extractFunctionRadix.sh $<.objdump # View the model graph TODO: What does this do? Move to another makefile? %.view_graph: $(CONSTRAINTS_DIR)/%.yaml