mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Merge branch 'main' of https://github.com/davidharrishmc/riscv-wally into main
This commit is contained in:
		
						commit
						b4028899fe
					
				| @ -129,6 +129,8 @@ | |||||||
| `define BPRED_ENABLED 1 | `define BPRED_ENABLED 1 | ||||||
| `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 1 | `define HPTW_WRITES_SUPPORTED 1 | ||||||
|  | |||||||
| @ -137,6 +137,8 @@ | |||||||
| `define BPRED_ENABLED 1 | `define BPRED_ENABLED 1 | ||||||
| `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define TESTSBP 1 | `define TESTSBP 1 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 1 | `define HPTW_WRITES_SUPPORTED 1 | ||||||
|  | |||||||
| @ -134,6 +134,7 @@ | |||||||
| `define BPRED_ENABLED 0 | `define BPRED_ENABLED 0 | ||||||
| `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 0 | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -132,6 +132,7 @@ | |||||||
| `define BPRED_ENABLED 1 | `define BPRED_ENABLED 1 | ||||||
| `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 0 | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -134,6 +134,8 @@ | |||||||
| `define BPRED_ENABLED 1 | `define BPRED_ENABLED 1 | ||||||
| `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 0 | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -132,6 +132,8 @@ | |||||||
| `define BPRED_ENABLED 1 | `define BPRED_ENABLED 1 | ||||||
| `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 0 | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -135,6 +135,8 @@ | |||||||
| //`define BPTYPE "BPGSHARE" // BPGLOBAL or BPTWOBIT or BPGSHARE | //`define BPTYPE "BPGSHARE" // BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define BPTYPE "BPGSHARE" // BPTWOBIT or "BPGLOBAL"  or BPLOCALPAg or BPGSHARE | `define BPTYPE "BPGSHARE" // BPTWOBIT or "BPGLOBAL"  or BPLOCALPAg or BPGSHARE | ||||||
| `define TESTSBP 1 | `define TESTSBP 1 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 0 | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -133,6 +133,8 @@ | |||||||
| `define BPRED_ENABLED 1 | `define BPRED_ENABLED 1 | ||||||
| `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 0 | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -135,6 +135,7 @@ | |||||||
| `define BPRED_ENABLED 1 | `define BPRED_ENABLED 1 | ||||||
| `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 0 | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -135,6 +135,7 @@ | |||||||
| `define BPRED_ENABLED 1 | `define BPRED_ENABLED 1 | ||||||
| `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 0 | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -135,6 +135,7 @@ | |||||||
| `define BPRED_ENABLED 1 | `define BPRED_ENABLED 1 | ||||||
| `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | `define BPTYPE "BPGSHARE" // BPLOCALPAg or BPGLOBAL or BPTWOBIT or BPGSHARE | ||||||
| `define TESTSBP 0 | `define TESTSBP 0 | ||||||
|  | `define BPRED_SIZE 10 | ||||||
| 
 | 
 | ||||||
| `define REPLAY 0 | `define REPLAY 0 | ||||||
| `define HPTW_WRITES_SUPPORTED 0 | `define HPTW_WRITES_SUPPORTED 0 | ||||||
|  | |||||||
| @ -31,10 +31,7 @@ | |||||||
| ////////////////////////////////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
| 
 | 
 | ||||||
| `include "wally-config.vh" | `include "wally-config.vh" | ||||||
| 
 |  | ||||||
| module gsharePredictor | module gsharePredictor | ||||||
|   #(parameter int k = 10 |  | ||||||
|     ) |  | ||||||
|   (input logic             clk, |   (input logic             clk, | ||||||
|    input logic             reset, |    input logic             reset, | ||||||
|    input logic             StallF, StallE, |    input logic             StallF, StallE, | ||||||
| @ -52,8 +49,8 @@ module gsharePredictor | |||||||
|    input logic [1:0]       UpdateBPPredE |    input logic [1:0]       UpdateBPPredE | ||||||
|    |    | ||||||
|    ); |    ); | ||||||
|   logic [k+1:0]            GHR, GHRNext; |   logic [`BPRED_SIZE+1:0]  GHR, GHRNext; | ||||||
|   logic [k-1:0]            PHTUpdateAdr, PHTUpdateAdr0, PHTUpdateAdr1; |   logic [`BPRED_SIZE-1:0]  PHTUpdateAdr, PHTUpdateAdr0, PHTUpdateAdr1; | ||||||
|   logic                    PHTUpdateEN; |   logic                    PHTUpdateEN; | ||||||
|   logic                    BPClassWrongNonCFI; |   logic                    BPClassWrongNonCFI; | ||||||
|   logic                    BPClassWrongCFI; |   logic                    BPClassWrongCFI; | ||||||
| @ -63,7 +60,7 @@ module gsharePredictor | |||||||
| 
 | 
 | ||||||
|   logic [6:0]              GHRMuxSel; |   logic [6:0]              GHRMuxSel; | ||||||
|   logic                    GHRUpdateEN; |   logic                    GHRUpdateEN; | ||||||
|   logic [k-1:0]            GHRLookup; |   logic [`BPRED_SIZE-1:0]            GHRLookup; | ||||||
| 
 | 
 | ||||||
|   assign BPClassRightNonCFI = ~BPInstrClassE[0] & ~InstrClassE[0]; |   assign BPClassRightNonCFI = ~BPInstrClassE[0] & ~InstrClassE[0]; | ||||||
|   assign BPClassWrongCFI = ~BPInstrClassE[0] & InstrClassE[0]; |   assign BPClassWrongCFI = ~BPInstrClassE[0] & InstrClassE[0]; | ||||||
| @ -85,18 +82,18 @@ module gsharePredictor | |||||||
|   // hoping this created a AND-OR mux.
 |   // hoping this created a AND-OR mux.
 | ||||||
|   always_comb begin |   always_comb begin | ||||||
|     case (GHRMuxSel)  |     case (GHRMuxSel)  | ||||||
|       7'b000_0001: GHRNext = GHR[k-1+2:0];  // no change
 |       7'b000_0001: GHRNext = GHR[`BPRED_SIZE-1+2:0];  // no change
 | ||||||
|       7'b000_0010: GHRNext = {GHR[k-2+2:0], PCSrcE}; // branch update
 |       7'b000_0010: GHRNext = {GHR[`BPRED_SIZE-2+2:0], PCSrcE}; // branch update
 | ||||||
|       7'b000_0100: GHRNext = {1'b0, GHR[k+1:1]}; // repair 1
 |       7'b000_0100: GHRNext = {1'b0, GHR[`BPRED_SIZE+1:1]}; // repair 1
 | ||||||
|       7'b000_1000: GHRNext = {GHR[k-1+2:1], PCSrcE}; // branch update with mis prediction correction
 |       7'b000_1000: GHRNext = {GHR[`BPRED_SIZE-1+2:1], PCSrcE}; // branch update with mis prediction correction
 | ||||||
|       7'b001_0000: GHRNext = {2'b00, GHR[k+1:2]}; // repair 2
 |       7'b001_0000: GHRNext = {2'b00, GHR[`BPRED_SIZE+1:2]}; // repair 2
 | ||||||
|       7'b010_0000: GHRNext = {1'b0, GHR[k+1:2], PCSrcE}; // branch update + repair 1
 |       7'b010_0000: GHRNext = {1'b0, GHR[`BPRED_SIZE+1:2], PCSrcE}; // branch update + repair 1
 | ||||||
|       7'b100_0000: GHRNext = {GHR[k-2+2:0], BPPredF[1]}; // speculative update
 |       7'b100_0000: GHRNext = {GHR[`BPRED_SIZE-2+2:0], BPPredF[1]}; // speculative update
 | ||||||
|       default: GHRNext = GHR[k-1+2:0]; |       default: GHRNext = GHR[`BPRED_SIZE-1+2:0]; | ||||||
|     endcase |     endcase | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   flopenr #(k+2) GlobalHistoryRegister(.clk(clk), |   flopenr #(`BPRED_SIZE+2) GlobalHistoryRegister(.clk(clk), | ||||||
|            .reset(reset), |            .reset(reset), | ||||||
|            .en((GHRUpdateEN)), |            .en((GHRUpdateEN)), | ||||||
|            .d(GHRNext), |            .d(GHRNext), | ||||||
| @ -105,21 +102,21 @@ module gsharePredictor | |||||||
|   // if actively updating the GHR at the time of prediction we want to us
 |   // if actively updating the GHR at the time of prediction we want to us
 | ||||||
|   // GHRNext as the lookup rather than GHR.
 |   // GHRNext as the lookup rather than GHR.
 | ||||||
| 
 | 
 | ||||||
|   assign PHTUpdateAdr0 = InstrClassE[0] ? GHR[k:1] : GHR[k-1:0]; |   assign PHTUpdateAdr0 = InstrClassE[0] ? GHR[`BPRED_SIZE:1] : GHR[`BPRED_SIZE-1:0]; | ||||||
|   assign PHTUpdateAdr1 = InstrClassE[0] ? GHR[k+1:2] : GHR[k:1];   |   assign PHTUpdateAdr1 = InstrClassE[0] ? GHR[`BPRED_SIZE+1:2] : GHR[`BPRED_SIZE:1];   | ||||||
|   assign PHTUpdateAdr = BPInstrClassD[0] ? PHTUpdateAdr1 : PHTUpdateAdr0; |   assign PHTUpdateAdr = BPInstrClassD[0] ? PHTUpdateAdr1 : PHTUpdateAdr0; | ||||||
|   assign PHTUpdateEN = InstrClassE[0] & ~StallE; |   assign PHTUpdateEN = InstrClassE[0] & ~StallE; | ||||||
| 
 | 
 | ||||||
|   assign GHRLookup = |GHRMuxSel[6:1] ? GHRNext[k-1:0] : GHR[k-1:0]; |   assign GHRLookup = |GHRMuxSel[6:1] ? GHRNext[`BPRED_SIZE-1:0] : GHR[`BPRED_SIZE-1:0]; | ||||||
|    |    | ||||||
|   // Make Prediction by reading the correct address in the PHT and also update the new address in the PHT 
 |   // Make Prediction by reading the correct address in the PHT and also update the new address in the PHT 
 | ||||||
|   SRAM2P1R1W #(k, 2) PHT(.clk(clk), |   SRAM2P1R1W #(`BPRED_SIZE, 2) PHT(.clk(clk), | ||||||
|     .reset(reset), |     .reset(reset), | ||||||
|     //.RA1(GHR[k-1:0]),
 |     //.RA1(GHR[`BPRED_SIZE-1:0]),
 | ||||||
|     .RA1(GHRLookup ^ PCNextF[k:1]), |     .RA1(GHRLookup ^ PCNextF[`BPRED_SIZE:1]), | ||||||
|     .RD1(BPPredF), |     .RD1(BPPredF), | ||||||
|     .REN1(~StallF), |     .REN1(~StallF), | ||||||
|     .WA1(PHTUpdateAdr ^ PCE[k:1]), |     .WA1(PHTUpdateAdr ^ PCE[`BPRED_SIZE:1]), | ||||||
|     .WD1(UpdateBPPredE), |     .WD1(UpdateBPPredE), | ||||||
|     .WEN1(PHTUpdateEN), |     .WEN1(PHTUpdateEN), | ||||||
|     .BitWEN1(2'b11)); |     .BitWEN1(2'b11)); | ||||||
|  | |||||||
| @ -146,7 +146,7 @@ module gpio ( | |||||||
| 
 | 
 | ||||||
|   // chip i/o
 |   // chip i/o
 | ||||||
|   // connect OUT to IN for loopback testing
 |   // connect OUT to IN for loopback testing
 | ||||||
|   if (`GPIO_LOOPBACK_TEST) assign input0d = GPIOPinsOut & input_en & output_en; |   if (`GPIO_LOOPBACK_TEST) assign input0d = GPIOPinsOut & output_en | (GPIOPinsIn  & input_en); | ||||||
|   else                     assign input0d = GPIOPinsIn  & input_en; |   else                     assign input0d = GPIOPinsIn  & input_en; | ||||||
|   flop #(32) sync1(HCLK,input0d,input1d); |   flop #(32) sync1(HCLK,input0d,input1d); | ||||||
|   flop #(32) sync2(HCLK,input1d,input2d); |   flop #(32) sync2(HCLK,input1d,input2d); | ||||||
|  | |||||||
| @ -1471,7 +1471,7 @@ string imperas32f[] = '{ | |||||||
| //    "rv64i_m/privilege/WALLY-SCAUSE", "002090", | //    "rv64i_m/privilege/WALLY-SCAUSE", "002090", | ||||||
| //    "rv64i_m/privilege/WALLY-scratch-01", "0040a0", | //    "rv64i_m/privilege/WALLY-scratch-01", "0040a0", | ||||||
| //    "rv64i_m/privilege/WALLY-sscratch-s-01", "0040a0", | //    "rv64i_m/privilege/WALLY-sscratch-s-01", "0040a0", | ||||||
| //    "rv64i_m/privilege/WALLY-trap-01", "0050a0", |     "rv64i_m/privilege/WALLY-trap-01", "0050a0", | ||||||
|     "rv64i_m/privilege/WALLY-MIE-01", "0050a0", |     "rv64i_m/privilege/WALLY-MIE-01", "0050a0", | ||||||
|     "rv64i_m/privilege/WALLY-mtvec-01", "0050a0", |     "rv64i_m/privilege/WALLY-mtvec-01", "0050a0", | ||||||
|     "rv64i_m/privilege/WALLY-stvec-01", "0050a0", |     "rv64i_m/privilege/WALLY-stvec-01", "0050a0", | ||||||
|  | |||||||
| @ -24,9 +24,11 @@ export SAIFPOWER ?= 0 | |||||||
| CONFIGDIR ?= ${WALLY}/pipelined/config | CONFIGDIR ?= ${WALLY}/pipelined/config | ||||||
| CONFIGFILES	?= $(shell find $(CONFIGDIR) -name rv*_*) | CONFIGFILES	?= $(shell find $(CONFIGDIR) -name rv*_*) | ||||||
| CONFIGFILESTRIM = $(notdir $(CONFIGFILES)) | CONFIGFILESTRIM = $(notdir $(CONFIGFILES)) | ||||||
|  | FREQS = 25 50 100 150 200 250 300 350 400 | ||||||
|  | k = 3 6  | ||||||
| print: | print: | ||||||
|  | 	echo $(k) | ||||||
| 	echo $(CONFIGFILESTRIM) | 	echo $(CONFIGFILESTRIM) | ||||||
| 	echo $(DIRS) |  | ||||||
| 
 | 
 | ||||||
| default: | default: | ||||||
| 	@echo "Basic synthesis procedure for Wally:" | 	@echo "Basic synthesis procedure for Wally:" | ||||||
| @ -39,24 +41,25 @@ rv%.log: rv% | |||||||
| 	echo $< | 	echo $< | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| DIRS = rv32e #rv32gc rv64ic rv64gc rv32ic | DIRS = rv32e rv32gc rv64ic rv32ic rv64gc | ||||||
| # DELDIRS = rv32e rv32gc rv64ic rv64gc rv32ic
 | # DELDIRS = rv32e rv32gc rv64ic rv64gc rv32ic
 | ||||||
| # CONFIGSUBDIRS = _FPUoff _noMulDiv _noVirtMem _PMP0 _PMP16 _orig
 | # CONFIGSUBDIRS = _FPUoff _noMulDiv _noVirtMem _PMP0 _PMP16 _orig
 | ||||||
| 
 | bpred: | ||||||
|  | 	@$(foreach kval, $(k), rm -rf $(CONFIGDIR)/rv64gc_bpred_$(kval);) | ||||||
|  | 	@$(foreach kval, $(k), cp -r $(CONFIGDIR)/rv64gc $(CONFIGDIR)/rv64gc_bpred_$(kval);) | ||||||
|  | 	@$(foreach kval, $(k), sed -i 's/BPRED_SIZE.*/BPRED_SIZE $(kval)/g' $(CONFIGDIR)/rv64gc_bpred_$(kval)/wally-config.vh;) | ||||||
|  | 	@$(foreach kval, $(k), make synth DESIGN=wallypipelinedcore CONFIG=rv64gc_bpred_$(kval) TECH=sky90 FREQ=500 MAXCORES=4 --jobs;) | ||||||
| copy:  | copy:  | ||||||
| 	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_orig;) | 	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_orig;) | ||||||
| 	@$(foreach dir, $(DIRS), cp -r $(CONFIGDIR)/$(dir) $(CONFIGDIR)/$(dir)_orig;) | 	@$(foreach dir, $(DIRS), cp -r $(CONFIGDIR)/$(dir) $(CONFIGDIR)/$(dir)_orig;) | ||||||
| 	@$(foreach dir, $(DIRS), sed -i 's/WAYSIZEINBYTES.*/WAYSIZEINBYTES 512/g' $(CONFIGDIR)/$(dir)_orig/wally-config.vh;) | 	@$(foreach dir, $(DIRS), sed -i 's/WAYSIZEINBYTES.*/WAYSIZEINBYTES 512/g' $(CONFIGDIR)/$(dir)_orig/wally-config.vh;) | ||||||
| 	@$(foreach dir, $(DIRS), sed -i 's/NUMWAYS.*/NUMWAYS 1/g' $(CONFIGDIR)/$(dir)_orig/wally-config.vh;) | 	@$(foreach dir, $(DIRS), sed -i 's/NUMWAYS.*/NUMWAYS 1/g' $(CONFIGDIR)/$(dir)_orig/wally-config.vh;) | ||||||
| 	@$(foreach dir, $(DIRS), sed -i "s/RAM_RANGE.*/RAM_RANGE	 34\'h01FF/g" $(CONFIGDIR)/$(dir)_orig/wally-config.vh ;) | 	@$(foreach dir, $(DIRS), sed -i "s/RAM_RANGE.*/RAM_RANGE	 34\'h01FF/g" $(CONFIGDIR)/$(dir)_orig/wally-config.vh ;) | ||||||
|  | 	@$(foreach dir, $(DIRS), sed -i 's/BPRED_SIZE.*/BPRED_SIZE 5/g' $(CONFIGDIR)/$(dir)_orig/wally-config.vh;) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| del: | del: | ||||||
| 	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_orig;) | 	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_*;) | ||||||
| 	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_FPUoff;) |  | ||||||
| 	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_PMP16;) |  | ||||||
| 	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_PMP0;) |  | ||||||
| 	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_noVirtMem;) |  | ||||||
| 	@$(foreach dir, $(DIRS), rm -rf $(CONFIGDIR)/$(dir)_noMulDiv;) |  | ||||||
| 
 | 
 | ||||||
| configs: $(DIRS) | configs: $(DIRS) | ||||||
| $(DIRS):  | $(DIRS):  | ||||||
| @ -76,21 +79,23 @@ $(DIRS): | |||||||
| 	cp -r $(CONFIGDIR)/$@_FPUoff $(CONFIGDIR)/$@_PMP0 | 	cp -r $(CONFIGDIR)/$@_FPUoff $(CONFIGDIR)/$@_PMP0 | ||||||
| 	sed -i 's/PMP_ENTRIES \(64\|16\|0\)/PMP_ENTRIES 0/' $(CONFIGDIR)/$@_PMP0/wally-config.vh | 	sed -i 's/PMP_ENTRIES \(64\|16\|0\)/PMP_ENTRIES 0/' $(CONFIGDIR)/$@_PMP0/wally-config.vh | ||||||
| 	 | 	 | ||||||
| 	# No Virtual Memory  |  | ||||||
| 	rm -rf $(CONFIGDIR)/$@_noVirtMem |  | ||||||
| 	cp -r $(CONFIGDIR)/$@_PMP0 $(CONFIGDIR)/$@_noVirtMem |  | ||||||
| 	sed -i 's/VIRTMEM_SUPPORTED 1/VIRTMEM_SUPPORTED 0/' $(CONFIGDIR)/$@_noVirtMem/wally-config.vh |  | ||||||
| 
 |  | ||||||
| 	#no muldiv | 	#no muldiv | ||||||
| 	rm -rf $(CONFIGDIR)/$@_noMulDiv | 	rm -rf $(CONFIGDIR)/$@_noMulDiv | ||||||
| 	cp -r $(CONFIGDIR)/$@_noVirtMem $(CONFIGDIR)/$@_noMulDiv | 	cp -r $(CONFIGDIR)/$@_PMP0 $(CONFIGDIR)/$@_noMulDiv | ||||||
| 	sed -i 's/1 *<< *12/0 << 12/' $(CONFIGDIR)/$@_noMulDiv/wally-config.vh | 	sed -i 's/1 *<< *12/0 << 12/' $(CONFIGDIR)/$@_noMulDiv/wally-config.vh | ||||||
| 
 | 
 | ||||||
|  | 	#no priv | ||||||
|  | 	rm -rf $(CONFIGDIR)/$@_noPriv | ||||||
|  | 	cp -r $(CONFIGDIR)/$@_noMulDiv $(CONFIGDIR)/$@_noPriv | ||||||
|  | 	sed -i 's/ZICSR_SUPPORTED *1/ZICSR_SUPPORTED 0/' $(CONFIGDIR)/$@_noPriv/wally-config.vh | ||||||
|  | 
 | ||||||
|  | freqs:  | ||||||
|  | 	@$(foreach freq, $(FREQS), make synth DESIGN=wallypipelinedcore CONFIG=rv32e TECH=sky130 FREQ=$(freq) MAXCORES=1;) | ||||||
| 
 | 
 | ||||||
| allsynth: $(CONFIGFILESTRIM) | allsynth: $(CONFIGFILESTRIM) | ||||||
| 
 | 
 | ||||||
| $(CONFIGFILESTRIM): | $(CONFIGFILESTRIM): | ||||||
| 	make synth DESIGN=wallypipelinedcore CONFIG=$@ TECH=sky90 FREQ=500 MAXCORES=1 | 	make synth DESIGN=wallypipelinedcore CONFIG=$@ TECH=sky130 FREQ=1000 MAXCORES=1 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| synth: | synth: | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								synthDC/runSynth.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								synthDC/runSynth.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | rm -r runs/* | ||||||
|  | make clean | ||||||
|  | make freqs TECH=sky130 | ||||||
|  | python3 scripts/extractSummary.py | ||||||
							
								
								
									
										50
									
								
								synthDC/scripts/extractSummary.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										50
									
								
								synthDC/scripts/extractSummary.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,50 @@ | |||||||
|  | #!/usr/bin/python3 | ||||||
|  | # Shreya Sanghai (ssanghai@hmc.edu) 2/28/2022 | ||||||
|  | import glob  | ||||||
|  | import re | ||||||
|  | import csv | ||||||
|  | import linecache | ||||||
|  | import os  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     data = [] | ||||||
|  |     curr_dir = os.path.dirname(os.path.abspath(__file__)) | ||||||
|  |     output_file = os.path.join(curr_dir,"..","Summary.csv") | ||||||
|  |     runs_dir = os.path.join(curr_dir,"..","runs/*/reports/wallypipelinedcore_qor.rep") | ||||||
|  |     search_strings = [ | ||||||
|  |         "Critical Path Length:", "Cell Area:", "Overall Compile Time:", | ||||||
|  |         "Critical Path Clk Period:", "Critical Path Slack:" | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     for name in glob.glob(runs_dir):    | ||||||
|  |         f = open(name, 'r') | ||||||
|  |         trimName = re.search("wallypipelinedcore_(.*?)_2022",name).group(1) | ||||||
|  | 
 | ||||||
|  |         output = {'Name':trimName} | ||||||
|  |         num_lines = len(f.readlines()) | ||||||
|  |         curr_line_index = 0 | ||||||
|  | 
 | ||||||
|  |         while curr_line_index < num_lines: | ||||||
|  |             line = linecache.getline(name, curr_line_index) | ||||||
|  |             for search_string in search_strings: | ||||||
|  |                 if search_string in line: | ||||||
|  |                     val = getVal(name,search_string,line,curr_line_index) | ||||||
|  |                     output[search_string] = val | ||||||
|  |             curr_line_index +=1  | ||||||
|  |         data += [output] | ||||||
|  | 
 | ||||||
|  |     with open(output_file, 'w') as csvfile: | ||||||
|  |         writer = csv.DictWriter(csvfile, fieldnames=['Name'] + search_strings) | ||||||
|  |         writer.writeheader() | ||||||
|  |         writer.writerows(data) | ||||||
|  |          | ||||||
|  | def getVal(filename, search_string, line, line_index): | ||||||
|  |     data = re.search(f"{search_string} *(.*?)\\n", line).group(1) | ||||||
|  |     if data == '': #sometimes data is stored in two line | ||||||
|  |         data = linecache.getline(filename, line_index+1).strip() | ||||||
|  |     return data | ||||||
|  | 
 | ||||||
|  | if __name__=="__main__": | ||||||
|  |     main() | ||||||
|  |                  | ||||||
| @ -65,7 +65,7 @@ target_tests_nosim = \ | |||||||
|     WALLY-PIE-stack-01 \ |     WALLY-PIE-stack-01 \ | ||||||
|     WALLY-PIE-stack-s-01 \ |     WALLY-PIE-stack-s-01 \ | ||||||
|     WALLY-trap-sret-01 \ |     WALLY-trap-sret-01 \ | ||||||
|     #WALLY-trap-01 \ |     WALLY-trap-01 \ | ||||||
|     # Have all 0's in references! |     # Have all 0's in references! | ||||||
|     #WALLY-MEPC \ |     #WALLY-MEPC \ | ||||||
|     #WALLY-SEPC \ |     #WALLY-SEPC \ | ||||||
|  | |||||||
| @ -1,5 +1,11 @@ | |||||||
| 00000aaa # Test 5.3.1.4: readback value from writing mie to enable interrupts | 00000aaa # Test 5.3.1.4: readback value from writing mie to enable interrupts | ||||||
| 00000000 | 00000000 | ||||||
|  | 00000000 # mcause from instruction addr misaligned fault | ||||||
|  | 00000000 | ||||||
|  | 800003d2 # mtval of faulting instruction adress (0x800003d3) | ||||||
|  | 00000000  | ||||||
|  | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
|  | 00000000 | ||||||
| 00000001 # mcause from an instruction access fault | 00000001 # mcause from an instruction access fault | ||||||
| 00000000 | 00000000 | ||||||
| 00000000 # mtval of faulting instruction address (0x0) | 00000000 # mtval of faulting instruction address (0x0) | ||||||
| @ -14,13 +20,13 @@ | |||||||
| 00000000 | 00000000 | ||||||
| 00000003 # mcause from Breakpoint | 00000003 # mcause from Breakpoint | ||||||
| 00000000 | 00000000 | ||||||
| 800003ec # mtval of breakpoint instruction adress (0x800003ec) | 80000404 # mtval of breakpoint instruction adress (0x80000404) | ||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| 00000004 # mcause from load address misaligned | 00000004 # mcause from load address misaligned | ||||||
| 00000000 | 00000000 | ||||||
| 800003f5 # mtval of misaligned address (0x800003f5) | 8000040d # mtval of misaligned address (0x8000040d) | ||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| @ -32,7 +38,7 @@ | |||||||
| 00000000 | 00000000 | ||||||
| 00000006 # mcause from store misaligned | 00000006 # mcause from store misaligned | ||||||
| 00000000 | 00000000 | ||||||
| 80000411 # mtval of address with misaligned store instr (0x80000410) | 80000429 # mtval of address with misaligned store instr (0x80000429) | ||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| @ -60,7 +66,31 @@ | |||||||
| 00000000 | 00000000 | ||||||
| 00000880 # masked out mstatus.MPP = 01 (from S mode), mstatus.MPIE = 1, and mstatus.MIE = 0 | 00000880 # masked out mstatus.MPP = 01 (from S mode), mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| 000007ec # value to indicate a vectored interrupts | 0007ec01 # value to indicate successful vectoring on s soft interrupt  | ||||||
|  | 00000000 | ||||||
|  | 00000001 # mcause value from s soft interrupt | ||||||
|  | 80000000 | ||||||
|  | 00000000 # mtval for ssoft interrupt (0x0) | ||||||
|  | 00000000 | ||||||
|  | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
|  | 00000000 | ||||||
|  | 0007ec03 # value to indicate successful vectoring on m soft interrupt  | ||||||
|  | 00000000 | ||||||
|  | 00000003 # mcause value from m soft interrupt | ||||||
|  | 80000000 | ||||||
|  | 00000000 # mtval for msoft interrupt (0x0) | ||||||
|  | 00000000 | ||||||
|  | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
|  | 00000000 | ||||||
|  | 0007ec05 # value to indicate successful vectoring on s time interrupt  | ||||||
|  | 00000000 | ||||||
|  | 00000005 # mcause value from s time interrupt | ||||||
|  | 80000000 | ||||||
|  | 00000000 # mtval for stime interrupt (0x0) | ||||||
|  | 00000000 | ||||||
|  | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
|  | 00000000 | ||||||
|  | 0007ec07 # value to indicate successful vectoring on m time interrupt  | ||||||
| 00000000 | 00000000 | ||||||
| 00000007 # mcause value from m time interrupt | 00000007 # mcause value from m time interrupt | ||||||
| 80000000 | 80000000 | ||||||
| @ -68,15 +98,15 @@ | |||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| 000007ec # value to indicate a vectored interrupts | 0007ec09 # value to indicate successful vectoring on s ext interrupt  | ||||||
| 00000000 | 00000000 | ||||||
| 00000001 # mcause value from m soft interrupt | 00000009 # mcause value from s ext interrupt | ||||||
| 80000000 | 80000000 | ||||||
| 00000000 # mtval for msoft interrupt (0x0) | 00000000 # mtval for sext interrupt (0x0) | ||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| 000007ec # value to indicate a vectored interrupts | 0007ec0b # value to indicate successful vectoring on m ext interrupt  | ||||||
| 00000000 | 00000000 | ||||||
| 0000000b # mcause value from m ext interrupt | 0000000b # mcause value from m ext interrupt | ||||||
| 80000000 | 80000000 | ||||||
| @ -84,11 +114,17 @@ | |||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| 0000b309 # medeleg after attempted write of all 1's (only some bits are writeable) | fffff7ff # medeleg after attempted write of all 1's (only some bits are writeable) | ||||||
| 00000000 | ffffffff | ||||||
| 00000222 # mideleg after attempted write of all 1's (only some bits are writeable) | 00000222 # mideleg after attempted write of all 1's (only some bits are writeable) | ||||||
| 00000000 | 00000000 | ||||||
| 00000001 # Test 5.3.1.4: mcause from an instruction access fault | 00000000 # mcause from instruction addr misaligned fault | ||||||
|  | 00000000 | ||||||
|  | 800003d2 # mtval of faulting instruction adress (0x800003d3) | ||||||
|  | 00000000  | ||||||
|  | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
|  | 00000000 | ||||||
|  | 00000001 # mcause from an instruction access fault | ||||||
| 00000000 | 00000000 | ||||||
| 00000000 # mtval of faulting instruction address (0x0) | 00000000 # mtval of faulting instruction address (0x0) | ||||||
| 00000000 | 00000000 | ||||||
| @ -102,13 +138,13 @@ | |||||||
| 00000000 | 00000000 | ||||||
| 00000003 # mcause from Breakpoint | 00000003 # mcause from Breakpoint | ||||||
| 00000000 | 00000000 | ||||||
| 800003ec # mtval of breakpoint instruction adress (0x800003ec) | 80000404 # mtval of breakpoint instruction adress (0x80000404) | ||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| 00000004 # mcause from load address misaligned | 00000004 # mcause from load address misaligned | ||||||
| 00000000 | 00000000 | ||||||
| 800003f5 # mtval of misaligned address (0x800003f5) | 8000040d # mtval of misaligned address (0x8000040d) | ||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| @ -120,7 +156,7 @@ | |||||||
| 00000000 | 00000000 | ||||||
| 00000006 # mcause from store misaligned | 00000006 # mcause from store misaligned | ||||||
| 00000000 | 00000000 | ||||||
| 80000411 # mtval of address with misaligned store instr (0x80000410) | 80000429 # mtval of address with misaligned store instr (0x80000429) | ||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| @ -136,23 +172,23 @@ | |||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| 000007ec # value to indicate a vectored interrupts | 0007ec03 # value to indicate successful vectoring on m soft interrupt  | ||||||
| 00000000 | 00000000 | ||||||
| 00000007 # mcause value from  time interrupt | 00000003 # mcause value from m soft interrupt | ||||||
| 80000000 |  | ||||||
| 00000000 # mtval for mtime interrupt (0x0) |  | ||||||
| 00000000 |  | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 |  | ||||||
| 00000000 |  | ||||||
| 000007ec # value to indicate a vectored interrupts |  | ||||||
| 00000000 |  | ||||||
| 00000001 # mcause value from m soft interrupt |  | ||||||
| 80000000 | 80000000 | ||||||
| 00000000 # mtval for msoft interrupt (0x0) | 00000000 # mtval for msoft interrupt (0x0) | ||||||
| 00000000 | 00000000 | ||||||
| 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
| 00000000 | 00000000 | ||||||
| 000007ec # value to indicate a vectored interrupts | 0007ec07 # value to indicate successful vectoring on m time interrupt  | ||||||
|  | 00000000 | ||||||
|  | 00000007 # mcause value from m time interrupt | ||||||
|  | 80000000 | ||||||
|  | 00000000 # mtval for mtime interrupt (0x0) | ||||||
|  | 00000000 | ||||||
|  | 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 | ||||||
|  | 00000000 | ||||||
|  | 0007ec0b # value to indicate successful vectoring on m ext interrupt  | ||||||
| 00000000 | 00000000 | ||||||
| 0000000b # mcause value from m ext interrupt | 0000000b # mcause value from m ext interrupt | ||||||
| 80000000 | 80000000 | ||||||
| @ -978,97 +1014,3 @@ deadbeef | |||||||
| deadbeef | deadbeef | ||||||
| deadbeef | deadbeef | ||||||
| deadbeef | deadbeef | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
| deadbeef |  | ||||||
|  | |||||||
| @ -157,17 +157,17 @@ cause_s_soft_interrupt: | |||||||
| cause_m_ext_interrupt: | cause_m_ext_interrupt: | ||||||
|     # ========== Configure PLIC ========== |     # ========== Configure PLIC ========== | ||||||
|     # m priority threshold = 0 |     # m priority threshold = 0 | ||||||
|     li t0, 0xC200000 |     li x28, 0xC200000 | ||||||
|     li t1, 0 |     li x29, 0 | ||||||
|     sw t1, 0(t0) |     sw x29, 0(x28) | ||||||
|     # source 3 (GPIO) priority = 1 |     # source 3 (GPIO) priority = 1 | ||||||
|     li t0, 0xC000000 |     li x28, 0xC000000 | ||||||
|     li t1, 1 |     li x29, 1 | ||||||
|     sw t1, 0x0C(t0) |     sw x29, 0x0C(x28) | ||||||
|     # enable source 3 |     # enable source 3 in M Mode | ||||||
|     li t0, 0x0C002000 |     li x28, 0x0C002000 | ||||||
|     li t1, 0b1000  |     li x29, 0b1000  | ||||||
|     sw t1, 0(t0) |     sw x29, 0(x28) | ||||||
| 
 | 
 | ||||||
|     li x28, 0x10060000 // load base GPIO memory location
 |     li x28, 0x10060000 // load base GPIO memory location
 | ||||||
|     li x29, 0x1 |     li x29, 0x1 | ||||||
| @ -178,7 +178,7 @@ cause_m_ext_interrupt: | |||||||
|     sw x0, 0x2C(x28) // clear high_ip
 |     sw x0, 0x2C(x28) // clear high_ip
 | ||||||
|     sw x0, 0x34(x28) // clear low_ip
 |     sw x0, 0x34(x28) // clear low_ip
 | ||||||
| 
 | 
 | ||||||
|     sw x29, 0x28(x28)  // set first to interrupt on a rising value
 |     sw x29, 0x28(x28)  // set first pin to interrupt on a rising value
 | ||||||
|     sw x29, 0x0C(x28)  // write a 1 to the first output pin (cause interrupt)
 |     sw x29, 0x0C(x28)  // write a 1 to the first output pin (cause interrupt)
 | ||||||
| m_ext_loop: | m_ext_loop: | ||||||
|     wfi |     wfi | ||||||
| @ -189,21 +189,21 @@ m_ext_loop: | |||||||
| cause_s_ext_interrupt_GPIO: | cause_s_ext_interrupt_GPIO: | ||||||
|     # ========== Configure PLIC ========== |     # ========== Configure PLIC ========== | ||||||
|     # s priority threshold = 0 |     # s priority threshold = 0 | ||||||
|     li t0, 0xC201000 |     li x28, 0xC201000 | ||||||
|     li t1, 0 |     li x29, 0 | ||||||
|     sw t1, 0(t0) |     sw x29, 0(x28) | ||||||
|     # m priority threshold = 7 |     # m priority threshold = 7 | ||||||
|     li t0, 0xC200000 |     li x28, 0xC200000 | ||||||
|     li t1, 7 |     li x29, 7 | ||||||
|     sw t1, 0(t0) |     sw x29, 0(x28) | ||||||
|     # source 3 (GPIO) priority = 1 |     # source 3 (GPIO) priority = 1 | ||||||
|     li t0, 0xC000000 |     li x28, 0xC000000 | ||||||
|     li t1, 1 |     li x29, 1 | ||||||
|     sw t1, 0x0C(t0) |     sw x29, 0x0C(x28) | ||||||
|     # enable source 3 |     # enable source 3 in S mode | ||||||
|     li t0, 0x0C002000 |     li x28, 0x0C002080 | ||||||
|     li t1, 0b1000  |     li x29, 0b1000  | ||||||
|     sw t1, 0(t0) |     sw x29, 0(x28) | ||||||
| 
 | 
 | ||||||
|     li x28, 0x10060000 // load base GPIO memory location
 |     li x28, 0x10060000 // load base GPIO memory location
 | ||||||
|     li x29, 0x1 |     li x29, 0x1 | ||||||
| @ -214,7 +214,7 @@ cause_s_ext_interrupt_GPIO: | |||||||
|     sw x0, 0x2C(x28) // clear high_ip
 |     sw x0, 0x2C(x28) // clear high_ip
 | ||||||
|     sw x0, 0x34(x28) // clear low_ip
 |     sw x0, 0x34(x28) // clear low_ip
 | ||||||
| 
 | 
 | ||||||
|     sw x29, 0x28(x28)  // set first to interrupt on a rising value
 |     sw x29, 0x28(x28)  // set first pin to interrupt on a rising value
 | ||||||
|     sw x29, 0x0C(x28)  // write a 1 to the first output pin (cause interrupt)
 |     sw x29, 0x0C(x28)  // write a 1 to the first output pin (cause interrupt)
 | ||||||
| s_ext_loop: | s_ext_loop: | ||||||
|     wfi |     wfi | ||||||
| @ -224,7 +224,7 @@ s_ext_loop: | |||||||
| 
 | 
 | ||||||
| cause_s_ext_interrupt_IP: | cause_s_ext_interrupt_IP: | ||||||
|     li x28, 0x200 |     li x28, 0x200 | ||||||
|     csrs mip, x28 // set supervisor external interrupt pending. SIP is a subset of MIP, so writing this should also change MIP.
 |     csrs mip, x28 // set supervisor external interrupt pending.
 | ||||||
|     ret |     ret | ||||||
| 
 | 
 | ||||||
| end_trap_triggers: | end_trap_triggers: | ||||||
| @ -521,18 +521,19 @@ soft_interrupt_\MODE\(): | |||||||
|     la x5, 0x02000000 // Reset by clearing MSIP interrupt from CLINT
 |     la x5, 0x02000000 // Reset by clearing MSIP interrupt from CLINT
 | ||||||
|     sw x0, 0(x5) |     sw x0, 0(x5) | ||||||
| 
 | 
 | ||||||
|     csrci sip, 0x2 // clear supervisor software interrupt pending bit 
 |     csrci \MODE\()ip, 0x2 // clear supervisor software interrupt pending bit 
 | ||||||
|     ld x1, -8(sp) // load return address from stack into ra (the address to return to after causing this interrupt)
 |     ld x1, -8(sp) // load return address from stack into ra (the address to return to after causing this interrupt)
 | ||||||
|     // Note: we do this because the mepc loads in the address of the instruction after the sw that causes the interrupt
 |     // Note: we do this because the mepc loads in the address of the instruction after the sw that causes the interrupt
 | ||||||
|     //  This means that this trap handler will return to the next address after that one, which might be unpredictable behavior.
 |     //  This means that this trap handler will return to the next address after that one, which might be unpredictable behavior.
 | ||||||
|     j trapreturn_finished_\MODE\() // return to the code at ra value from before trap
 |     j trapreturn_finished_\MODE\() // return to the code at ra value from before trap
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| time_interrupt_\MODE\(): | time_interrupt_\MODE\(): | ||||||
|     la x5, 0x02004000    // MTIMECMP register in CLINT
 |     la x5, 0x02004000    // MTIMECMP register in CLINT
 | ||||||
|     li x7, 0xFFFFFFFF |     li x7, 0xFFFFFFFF | ||||||
|     sd x7, 0(x5) // reset interrupt by setting mtimecmp to 0xFFFFFFFF
 |     sd x7, 0(x5) // reset interrupt by setting mtimecmp to 0xFFFFFFFF
 | ||||||
|      |      | ||||||
|  |     li x5, 0x20 | ||||||
|  |     csrc \MODE\()ip, x5 | ||||||
|     ld x1, -8(sp) // load return address from stack into ra (the address to return to after the loop is complete)
 |     ld x1, -8(sp) // load return address from stack into ra (the address to return to after the loop is complete)
 | ||||||
|     j trapreturn_finished_\MODE\() // return to the code at ra value from before trap
 |     j trapreturn_finished_\MODE\() // return to the code at ra value from before trap
 | ||||||
| 
 | 
 | ||||||
| @ -543,18 +544,26 @@ ext_interrupt_\MODE\(): | |||||||
| 
 | 
 | ||||||
|     # reset PLIC to turn off external interrupts |     # reset PLIC to turn off external interrupts | ||||||
|     # priority threshold = 7 |     # priority threshold = 7 | ||||||
|     li t0, 0xC200000 |     li x28, 0xC200000 | ||||||
|     li t1, 0x7 |     li x5, 0x7 | ||||||
|     sw t1, 0(t0) |     sw x5, 0(x28) | ||||||
|     # source 3 (GPIO) priority = 0 |     # source 3 (GPIO) priority = 0 | ||||||
|     li t0, 0xC000000 |     li x28, 0xC000000 | ||||||
|     li t1, 0 |     li x5, 0 | ||||||
|     sw t1, 0x0C(t0) |     sw x5, 0x0C(x28) | ||||||
|     # disable source 3 |     # disable source 3 | ||||||
|     li t0, 0x0C002000 |     li x28, 0x0C002000 | ||||||
|     li t1, 0b0000  |     li x5, 0b0000 | ||||||
|     sw t1, 0(t0) |     sw x5, 0(x28) | ||||||
|     j trapreturn_\MODE\() | 
 | ||||||
|  |     li x5, 0x200 | ||||||
|  |     csrc \MODE\()ip, x5 | ||||||
|  | 
 | ||||||
|  |     ld x1, -8(sp) // load return address from stack into ra (the address to return to after the loop is complete)
 | ||||||
|  |     j trapreturn_finished_\MODE\() // return to the code at ra value from before trap
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|     // Table of trap behavior
 |     // Table of trap behavior
 | ||||||
|     // lists what to do on each exception (not interrupts)
 |     // lists what to do on each exception (not interrupts)
 | ||||||
|  | |||||||
| @ -35,7 +35,7 @@ WRITE_READ_CSR mie, 0xFFF // Enable interrupts from all sources // *** commented | |||||||
| 
 | 
 | ||||||
| // test 5.3.1.4 Basic trap tests  | // test 5.3.1.4 Basic trap tests  | ||||||
| 
 | 
 | ||||||
| // jal cause_instr_addr_misaligned //skipped becuase this exception may be impossible when compressed instructions are enabled) | jal cause_instr_addr_misaligned | ||||||
| jal cause_instr_access | jal cause_instr_access | ||||||
| jal cause_illegal_instr | jal cause_illegal_instr | ||||||
| jal cause_breakpnt | jal cause_breakpnt | ||||||
| @ -47,16 +47,23 @@ GOTO_U_MODE // Causes M mode ecall | |||||||
| GOTO_S_MODE // Causes U mode ecall | GOTO_S_MODE // Causes U mode ecall | ||||||
| GOTO_M_MODE // Causes S mode ecall | GOTO_M_MODE // Causes S mode ecall | ||||||
| 
 | 
 | ||||||
| jal cause_time_interrupt // *** intentionally causing this trap seems difficult in spike. although it is possible for it to accidentally happen.  | 
 | ||||||
| jal cause_soft_interrupt // *** exiting out of the trap handler after these is current;y broken
 | jal cause_s_soft_interrupt  | ||||||
| jal cause_ext_interrupt | jal cause_m_soft_interrupt | ||||||
|  | jal cause_s_time_interrupt | ||||||
|  | jal cause_m_time_interrupt | ||||||
|  | //jal cause_s_ext_interrupt_GPIO | ||||||
|  | jal cause_s_ext_interrupt_IP // cause external interrupt with both sip register and GPIO. | ||||||
|  | jal cause_m_ext_interrupt | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| // try the traps again with mideleg = medeleg = all 1's to ensure traps still go to M mode from M mode | // try the traps again with mideleg = medeleg = all 1's to ensure traps still go to M mode from M mode | ||||||
| 
 | 
 | ||||||
| WRITE_READ_CSR medeleg, 0xFFFFFFFFFFFFFFFF | WRITE_READ_CSR medeleg, 0xFFFFFFFFFFFFFFFF | ||||||
| WRITE_READ_CSR mideleg, 0xFFFFFFFFFFFFFFFF | WRITE_READ_CSR mideleg, 0xFFFFFFFFFFFFFFFF | ||||||
| 
 | 
 | ||||||
| // jal cause_instr_addr_misaligned //skipped becuase this exception may be impossible when compressed instructions are enabled) | jal cause_instr_addr_misaligned | ||||||
| jal cause_instr_access | jal cause_instr_access | ||||||
| jal cause_illegal_instr | jal cause_illegal_instr | ||||||
| jal cause_breakpnt | jal cause_breakpnt | ||||||
| @ -66,9 +73,14 @@ jal cause_store_addr_misaligned | |||||||
| jal cause_store_acc | jal cause_store_acc | ||||||
| jal cause_ecall // M mode ecall | jal cause_ecall // M mode ecall | ||||||
| 
 | 
 | ||||||
| jal cause_time_interrupt // *** intentionally causing this trap seems difficult in spike. although it is possible for it to accidentally happen.  | jal cause_s_soft_interrupt // The delegated S mode interrupts should not fire since we're running in M mode. | ||||||
| jal cause_soft_interrupt // *** exiting out of the trap handler after these is current;y broken
 | jal cause_m_soft_interrupt | ||||||
| jal cause_ext_interrupt | jal cause_s_time_interrupt | ||||||
|  | jal cause_m_time_interrupt | ||||||
|  | //jal cause_s_ext_interrupt_GPIO | ||||||
|  | jal cause_s_ext_interrupt_IP // cause external interrupt with both sip register and GPIO. | ||||||
|  | jal cause_m_ext_interrupt | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| END_TESTS | END_TESTS | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user