From af435ab59192e6f3cd5a7a013e6d5fe3edb0b6c6 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Wed, 23 Mar 2022 10:26:17 -0500 Subject: [PATCH 01/20] Another change required for forcing to work correctly with MIE/MIP and SIE/SIP. --- pipelined/src/privileged/csri.sv | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/pipelined/src/privileged/csri.sv b/pipelined/src/privileged/csri.sv index 8a3f42fd..b3f0f157 100644 --- a/pipelined/src/privileged/csri.sv +++ b/pipelined/src/privileged/csri.sv @@ -95,20 +95,22 @@ module csri #(parameter // else if (WriteUIEM) IE_REGW = (CSRWriteValM & 12'h111) | (IE_REGW & 12'hAAA); // only U field // restricted views of registers - // Add MEIP read-only signal - assign IP_REGW = {IntInM[11],1'b0,IP_REGW_writeable}; + assign IP_REGW = {IntInM[11],1'b0,IP_REGW_writeable}; + + always_comb begin:regs + // Add MEIP read-only signal // Machine Mode - assign MIP_REGW = IP_REGW; - assign MIE_REGW = IE_REGW; + MIP_REGW = IP_REGW; + MIE_REGW = IE_REGW; - // Supervisor mode - if (`S_SUPPORTED) begin - assign SIP_REGW = IP_REGW & MIDELEG_REGW[11:0] & 'h222; // only delegated interrupts visible - assign SIE_REGW = IE_REGW & MIDELEG_REGW[11:0] & 'h222; - end else begin - assign SIP_REGW = 12'b0; - assign SIE_REGW = 12'b0; + // Supervisor mode + if (`S_SUPPORTED) begin + SIP_REGW = IP_REGW & MIDELEG_REGW[11:0] & 'h222; // only delegated interrupts visible + SIE_REGW = IE_REGW & MIDELEG_REGW[11:0] & 'h222; + end else begin + SIP_REGW = 12'b0; + SIE_REGW = 12'b0; + end end - endmodule From 4b376e2834008b21c32afca1a27f39075dd8380b Mon Sep 17 00:00:00 2001 From: bbracker Date: Thu, 24 Mar 2022 17:08:10 -0700 Subject: [PATCH 02/20] 1st attempt at multiple channel PLIC --- linux/testvector-generation/genCheckpoint.sh | 6 +- linux/testvector-generation/parsePlicState.py | 24 +- pipelined/src/privileged/csr.sv | 14 +- pipelined/src/privileged/csri.sv | 30 +- pipelined/src/privileged/privileged.sv | 4 +- pipelined/src/uncore/plic.sv | 229 +++++++++------ pipelined/src/uncore/uncore.sv | 5 +- pipelined/src/wally/wallypipelinedcore.sv | 268 +++++++++--------- pipelined/src/wally/wallypipelinedsoc.sv | 6 +- pipelined/testbench/testbench-linux.sv | 4 +- 10 files changed, 325 insertions(+), 265 deletions(-) diff --git a/linux/testvector-generation/genCheckpoint.sh b/linux/testvector-generation/genCheckpoint.sh index 8f4d0a11..dea4d555 100755 --- a/linux/testvector-generation/genCheckpoint.sh +++ b/linux/testvector-generation/genCheckpoint.sh @@ -101,10 +101,12 @@ then set logging on # Priority Levels for sources 1 thru 63 x/63xw 0x0C000004 - # Interrupt Enables + # Interrupt Enables for sources 1 thru 63 for contexts 0 and 1 x/2xw 0x0C020000 - # Global Priority Threshold + x/2xw 0x0C020080 + # Global Priority Threshold for contexts 0 and 1 x/1xw 0x0C200000 + x/1xw 0x0C201000 set logging off shell echo \"GDB storing RAM to $rawRamFile\" dump binary memory $rawRamFile 0x80000000 0xffffffff diff --git a/linux/testvector-generation/parsePlicState.py b/linux/testvector-generation/parsePlicState.py index a3c3787c..35ef00b1 100755 --- a/linux/testvector-generation/parsePlicState.py +++ b/linux/testvector-generation/parsePlicState.py @@ -1,5 +1,6 @@ #! /usr/bin/python3 import sys, os +from functools import reduce ################ # Helper Funcs # @@ -21,6 +22,9 @@ def tokenize(string): token = token + char return tokens +def strip0x(num): + return num[2:] + def stripZeroes(num): num = num.strip('0') if num=='': @@ -42,7 +46,7 @@ if not os.path.exists(rawPlicStateFile): sys.exit('Error input file '+rawPlicStateFile+'not found') with open(rawPlicStateFile, 'r') as rawPlicStateFile: - plicIntPriorityArray=[] + plicIntPriorityArray = [] # iterates over number of different sources # 0x0C000004 thru 0x0C000010 plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:] # 0x0C000014 thru 0x0C000020 @@ -76,20 +80,30 @@ with open(rawPlicStateFile, 'r') as rawPlicStateFile: # 0x0C0000f4 thru 0x0C0000fc plicIntPriorityArray += tokenize(rawPlicStateFile.readline())[1:] + plicIntEnableArray = [] # iterates over number of different contexts # 0x0C020000 thru 0x0C020004 plicIntEnable = tokenize(rawPlicStateFile.readline())[1:] + plicIntEnable = map(strip0x,plicIntEnable) + plicIntEnableArray.append(reduce(lambda x,y: x+y,plicIntEnable)) + # 0x0C020080 thru 0x0C020084 + plicIntEnable = tokenize(rawPlicStateFile.readline())[1:] + plicIntEnable = map(strip0x,plicIntEnable) + plicIntEnableArray.append(reduce(lambda x,y: x+y,plicIntEnable)) + plicIntPriorityThresholdArray = [] # iterates over number of different contexts # 0x0C200000 - plicIntPriorityThreshold = tokenize(rawPlicStateFile.readline())[1:] + plicIntPriorityThresholdArray += tokenize(rawPlicStateFile.readline())[1:] + # 0x0C201000 + plicIntPriorityThresholdArray += tokenize(rawPlicStateFile.readline())[1:] with open(outDir+'checkpoint-PLIC_INT_PRIORITY', 'w') as outFile: for word in plicIntPriorityArray: outFile.write(stripZeroes(word[2:])+'\n') with open(outDir+'checkpoint-PLIC_INT_ENABLE', 'w') as outFile: - for word in plicIntEnable: - outFile.write(stripZeroes(word[2:])) + for word in plicIntEnableArray: + outFile.write(word+'\n') with open(outDir+'checkpoint-PLIC_THRESHOLD', 'w') as outFile: - for word in plicIntPriorityThreshold: + for word in plicIntPriorityThresholdArray: outFile.write(stripZeroes(word[2:])+'\n') print("Finished parsing PLIC state!") diff --git a/pipelined/src/privileged/csr.sv b/pipelined/src/privileged/csr.sv index cac7aa67..ecdcbe50 100644 --- a/pipelined/src/privileged/csr.sv +++ b/pipelined/src/privileged/csr.sv @@ -43,13 +43,13 @@ module csr #(parameter input logic [31:0] InstrM, input logic [`XLEN-1:0] PCM, SrcAM, input logic CSRReadM, CSRWriteM, TrapM, MTrapM, STrapM, UTrapM, mretM, sretM, - input logic TimerIntM, ExtIntM, SwIntM, + input logic TimerIntM, ExtIntM, ExtIntS, SwIntM, input logic [63:0] MTIME_CLINT, input logic InstrValidM, FRegWriteM, LoadStallD, - input logic BPPredDirWrongM, - input logic BTBPredPCWrongM, - input logic RASPredPCWrongM, - input logic BPPredClassNonCFIWrongM, + input logic BPPredDirWrongM, + input logic BTBPredPCWrongM, + input logic RASPredPCWrongM, + input logic BPPredClassNonCFIWrongM, input logic [4:0] InstrClassM, input logic DCacheMiss, input logic DCacheAccess, @@ -123,7 +123,7 @@ module csr #(parameter assign CSRUWriteM = CSRWriteM; csri csri(.clk, .reset, .InstrValidNotFlushedM, .StallW, .CSRMWriteM, .CSRSWriteM, - .CSRAdrM, .ExtIntM, .TimerIntM, .SwIntM, + .CSRAdrM, .ExtIntM, .ExtIntS, .TimerIntM, .SwIntM, .MIDELEG_REGW, .MIP_REGW, .MIE_REGW, .SIP_REGW, .SIE_REGW, .CSRWriteValM); csrsr csrsr(.clk, .reset, .StallW, .WriteMSTATUSM, .WriteSSTATUSM, @@ -167,7 +167,7 @@ module csr #(parameter // merge illegal accesses: illegal if none of the CSR addresses is legal or privilege is insufficient assign InsufficientCSRPrivilegeM = (CSRAdrM[9:8] == 2'b11 & PrivilegeModeW != `M_MODE) | - (CSRAdrM[9:8] == 2'b01 & PrivilegeModeW == `U_MODE); + (CSRAdrM[9:8] == 2'b01 & PrivilegeModeW == `U_MODE); assign IllegalCSRAccessM = ((IllegalCSRCAccessM & IllegalCSRMAccessM & IllegalCSRSAccessM & IllegalCSRUAccessM | InsufficientCSRPrivilegeM) & CSRReadM) | IllegalCSRMWriteReadonlyM; diff --git a/pipelined/src/privileged/csri.sv b/pipelined/src/privileged/csri.sv index 8a3f42fd..7eff9496 100644 --- a/pipelined/src/privileged/csri.sv +++ b/pipelined/src/privileged/csri.sv @@ -41,7 +41,7 @@ module csri #(parameter input logic InstrValidNotFlushedM, StallW, input logic CSRMWriteM, CSRSWriteM, input logic [11:0] CSRAdrM, - input logic ExtIntM, TimerIntM, SwIntM, + input logic ExtIntM, ExtIntS, TimerIntM, SwIntM, input logic [`XLEN-1:0] MIDELEG_REGW, output logic [11:0] MIP_REGW, MIE_REGW, SIP_REGW, SIE_REGW, input logic [`XLEN-1:0] CSRWriteValM @@ -57,12 +57,12 @@ module csri #(parameter always_comb begin IntInM = 0; - IntInM[11] = ExtIntM;; // MEIP - IntInM[9] = ExtIntM & MIDELEG_REGW[9]; // SEIP - IntInM[7] = TimerIntM; // MTIP - IntInM[5] = TimerIntM & MIDELEG_REGW[5]; // STIP - IntInM[3] = SwIntM; // MSIP - IntInM[1] = SwIntM & MIDELEG_REGW[1]; // SSIP + IntInM[11] = ExtIntM; // MEIP + IntInM[9] = ExtIntS | (ExtIntM & MIDELEG_REGW[9]); // SEIP + IntInM[7] = TimerIntM; // MTIP + IntInM[5] = TimerIntM & MIDELEG_REGW[5]; // STIP + IntInM[3] = SwIntM; // MSIP + IntInM[1] = SwIntM & MIDELEG_REGW[1]; // SSIP end // Interrupt Write Enables @@ -82,21 +82,19 @@ module csri #(parameter assign MIP_WRITE_MASK = 12'h000; assign SIP_WRITE_MASK = 12'h000; end - always @(posedge clk) //, posedge reset) begin // *** I strongly feel that IntInM should go directly to IP_REGW -- Ben 9/7/21 + always @(posedge clk) if (reset) IP_REGW_writeable <= 10'b0; - else if (WriteMIPM) IP_REGW_writeable <= (CSRWriteValM[9:0] & MIP_WRITE_MASK[9:0]) | IntInM[9:0]; // MTIP unclearable - else if (WriteSIPM) IP_REGW_writeable <= (CSRWriteValM[9:0] & SIP_WRITE_MASK[9:0]) | IntInM[9:0]; // MTIP unclearable -// else if (WriteUIPM) IP_REGW = (CSRWriteValM & 12'hBBB) | (NextIPM & 12'h080); // MTIP unclearable - else IP_REGW_writeable <= IP_REGW_writeable | IntInM[9:0]; // *** check this turns off interrupts properly even when MIDELEG changes - always @(posedge clk) //, posedge reset) begin + else if (WriteMIPM) IP_REGW_writeable <= (CSRWriteValM[9:0] & MIP_WRITE_MASK[9:0]) | {1'b0,IntInM[8:0]}; // MTIP unclearable + else if (WriteSIPM) IP_REGW_writeable <= (CSRWriteValM[9:0] & SIP_WRITE_MASK[9:0]) | {1'b0,IntInM[8:0]}; // MTIP unclearable + else IP_REGW_writeable <= IP_REGW_writeable | {1'b0, IntInM[8:0]}; // *** check this turns off interrupts properly even when MIDELEG changes + always @(posedge clk) if (reset) IE_REGW <= 12'b0; else if (WriteMIEM) IE_REGW <= (CSRWriteValM[11:0] & 12'hAAA); // MIE controls M and S fields else if (WriteSIEM) IE_REGW <= (CSRWriteValM[11:0] & 12'h222) | (IE_REGW & 12'h888); // only S fields -// else if (WriteUIEM) IE_REGW = (CSRWriteValM & 12'h111) | (IE_REGW & 12'hAAA); // only U field // restricted views of registers - // Add MEIP read-only signal - assign IP_REGW = {IntInM[11],1'b0,IP_REGW_writeable}; + // Add ExtIntM read-only signal + assign IP_REGW = {ExtIntM,1'b0,ExtIntS,9'b0} | {2'b0,IP_REGW_writeable}; // Machine Mode assign MIP_REGW = IP_REGW; diff --git a/pipelined/src/privileged/privileged.sv b/pipelined/src/privileged/privileged.sv index 8493a15b..9a8fb9f8 100644 --- a/pipelined/src/privileged/privileged.sv +++ b/pipelined/src/privileged/privileged.sv @@ -55,7 +55,7 @@ module privileged ( input logic InstrMisalignedFaultM, IllegalIEUInstrFaultD, IllegalFPUInstrD, input logic LoadMisalignedFaultM, input logic StoreAmoMisalignedFaultM, - input logic TimerIntM, ExtIntM, SwIntM, + input logic TimerIntM, ExtIntM, ExtIntS, SwIntM, input logic [63:0] MTIME_CLINT, input logic [`XLEN-1:0] InstrMisalignedAdrM, IEUAdrM, input logic [4:0] SetFflagsM, @@ -150,7 +150,7 @@ module privileged ( .StallE, .StallM, .StallW, .InstrM, .PCM, .SrcAM, .CSRReadM, .CSRWriteM, .TrapM, .MTrapM, .STrapM, .UTrapM, .mretM, .sretM, - .TimerIntM, .ExtIntM, .SwIntM, + .TimerIntM, .ExtIntM, .ExtIntS, .SwIntM, .MTIME_CLINT, .InstrValidM, .FRegWriteM, .LoadStallD, .BPPredDirWrongM, .BTBPredPCWrongM, .RASPredPCWrongM, diff --git a/pipelined/src/uncore/plic.sv b/pipelined/src/uncore/plic.sv index 2d545998..cccbe75c 100644 --- a/pipelined/src/uncore/plic.sv +++ b/pipelined/src/uncore/plic.sv @@ -37,6 +37,15 @@ `include "wally-config.vh" +`define N `PLIC_NUM_SRC +// number of interrupt sources +// does not include source 0, which does not connect to anything according to spec +// up to 63 sources supported; *** in the future, allow up to 1023 sources + +`define C 2 +// number of conexts +// hardcoded to 2 contexts for now; *** later upgrade to arbitrary (up to 15872) contexts + module plic ( input logic HCLK, HRESETn, input logic HSELPLIC, @@ -48,25 +57,26 @@ module plic ( input logic UARTIntr,GPIOIntr, output logic [`XLEN-1:0] HREADPLIC, output logic HRESPPLIC, HREADYPLIC, - output logic ExtIntM); - - localparam N=`PLIC_NUM_SRC; // should not exceed 63; does not inlcude source 0, which does not connect to anything according to spec + output logic ExtIntM, ExtIntS); logic memwrite, memread, initTrans; logic [23:0] entry, entryd; logic [31:0] Din, Dout; - logic [N:1] requests; - logic [2:0] intPriority[N:1]; - logic [2:0] intThreshold; - logic [N:1] intPending, nextIntPending, intEn, intInProgress; - logic [5:0] intClaim; // ID's are 6 bits if we stay within 63 sources - - logic [N:1] pendingArray[7:1]; - logic [7:1] pendingPGrouped; - logic [7:1] pendingMaxP; - logic [N:1] pendingRequestsAtMaxP; - logic [7:1] threshMask; + // context-independent signals + logic [`N:1] requests; + logic [`N:1][2:0] intPriority; + logic [`N:1] intInProgress, intPending, nextIntPending; + + // context-dependent signals + logic [`C-1:0][2:0] intThreshold; + logic [`C-1:0][`N:1] intEn; + logic [`C-1:0][5:0] intClaim; // ID's are 6 bits if we stay within 63 sources + logic [`C-1:0][7:1][`N:1] irqMatrix; + logic [`C-1:0][7:1] priorities_with_irqs; + logic [`C-1:0][7:1] max_priority_with_irqs; + logic [`C-1:0][`N:1] irqs_at_max_priority; + logic [`C-1:0][7:1] threshMask; // ======= // AHB I/O @@ -82,12 +92,12 @@ module plic ( // account for subword read/write circuitry // -- Note PLIC registers are 32 bits no matter what; access them with LW SW. - if (`XLEN == 64) begin + if (`XLEN == 64) begin assign Din = entryd[2] ? HWDATA[63:32] : HWDATA[31:0]; assign HREADPLIC = entryd[2] ? {Dout,32'b0} : {32'b0,Dout}; end else begin // 32-bit - assign Din = HWDATA[31:0]; assign HREADPLIC = Dout; + assign Din = HWDATA[31:0]; end // ================== @@ -96,43 +106,56 @@ module plic ( always @(posedge HCLK,negedge HRESETn) begin // resetting if (~HRESETn) begin - intPriority <= #1 '{default:3'b0}; - intEn <= #1 {N{1'b0}}; - intThreshold <= #1 3'b0; - intInProgress <= #1 {N{1'b0}}; + intPriority <= #1 {`N{3'b0}}; + intEn <= #1 {2{`N'b0}}; + intThreshold <= #1 {2{3'b0}}; + intInProgress <= #1 `N'b0; // writing end else begin if (memwrite) casez(entryd) 24'h0000??: intPriority[entryd[7:2]] <= #1 Din[2:0]; - `ifdef PLIC_NUM_SRC_LT_32 - 24'h002000: intEn[N:1] <= #1 Din[N:1]; + `ifdef PLIC_NUM_SRC_LT_32 // *** switch to a generate for loop so as to deprecate PLIC_NUM_SRC_LT_32 and allow up to 1023 sources + 24'h002000: intEn[0][`N:1] <= #1 Din[`N:1]; + 24'h002080: intEn[1][`N:1] <= #1 Din[`N:1]; `endif `ifndef PLIC_NUM_SRC_LT_32 - 24'h002000: intEn[31:1] <= #1 Din[31:1]; - 24'h002004: intEn[N:32] <= #1 Din[31:0]; + 24'h002000: intEn[0][31:1] <= #1 Din[31:1]; + 24'h002004: intEn[0][`N:32] <= #1 Din[31:0]; + 24'h002080: intEn[1][31:1] <= #1 Din[31:1]; + 24'h002084: intEn[1][`N:32] <= #1 Din[31:0]; `endif - 24'h200000: intThreshold[2:0] <= #1 Din[2:0]; - 24'h200004: intInProgress <= #1 intInProgress & ~(`PLIC_NUM_SRC'b1 << (Din[5:0]-1)); // lower "InProgress" to signify completion + 24'h200000: intThreshold[0] <= #1 Din[2:0]; + 24'h200004: intInProgress <= #1 intInProgress & ~(`N'b1 << (Din[5:0]-1)); // lower "InProgress" to signify completion + 24'h201000: intThreshold[1] <= #1 Din[2:0]; + 24'h201004: intInProgress <= #1 intInProgress & ~(`N'b1 << (Din[5:0]-1)); // lower "InProgress" to signify completion endcase // reading if (memread) casez(entry) 24'h0000??: Dout <= #1 {29'b0,intPriority[entry[7:2]]}; `ifdef PLIC_NUM_SRC_LT_32 - 24'h001000: Dout <= #1 {{(31-N){1'b0}},intPending[N:1],1'b0}; - 24'h002000: Dout <= #1 {{(31-N){1'b0}},intEn[N:1],1'b0}; + 24'h001000: Dout <= #1 {{(31-`N){1'b0}},intPending,1'b0}; + 24'h002000: Dout <= #1 {{(31-`N){1'b0}},intEn[0],1'b0}; + 24'h002080: Dout <= #1 {{(31-`N){1'b0}},intEn[1],1'b0}; `endif `ifndef PLIC_NUM_SRC_LT_32 24'h001000: Dout <= #1 {intPending[31:1],1'b0}; - 24'h001004: Dout <= #1 {{(63-N){1'b0}},intPending[N:32]}; - 24'h002000: Dout <= #1 {intEn[31:1],1'b0}; - 24'h002004: Dout <= #1 {{(63-N){1'b0}},intEn[N:32]}; + 24'h001004: Dout <= #1 {{(63-`N){1'b0}},intPending[`N:32]}; + 24'h002000: Dout <= #1 {intEn[0][31:1],1'b0}; + 24'h002004: Dout <= #1 {{(63-`N){1'b0}},intEn[0][`N:32]}; + 24'h002080: Dout <= #1 {intEn[0][31:1],1'b0}; + 24'h002084: Dout <= #1 {{(63-`N){1'b0}},intEn[1][`N:32]}; `endif - 24'h200000: Dout <= #1 {29'b0,intThreshold[2:0]}; + 24'h200000: Dout <= #1 {29'b0,intThreshold[0]}; 24'h200004: begin - Dout <= #1 {26'b0,intClaim}; - intInProgress <= #1 intInProgress | (`PLIC_NUM_SRC'b1 << (intClaim-1)); // claimed requests are currently in progress of being serviced until they are completed + Dout <= #1 {26'b0,intClaim[0]}; + intInProgress <= #1 intInProgress | (`N'b1 << (intClaim[0]-1)); // claimed requests are currently in progress of being serviced until they are completed + end + 24'h201000: Dout <= #1 {29'b0,intThreshold[1]}; + 24'h201004: begin + Dout <= #1 {26'b0,intClaim[1]}; + intInProgress <= #1 intInProgress | (`N'b1 << (intClaim[1]-1)); // claimed requests are currently in progress of being serviced until they are completed end default: Dout <= #1 32'h0; // invalid access endcase @@ -143,7 +166,7 @@ module plic ( // connect sources to requests always_comb begin - requests = {N{1'b0}}; + requests = `N'b0; `ifdef PLIC_GPIO_ID requests[`PLIC_GPIO_ID] = GPIOIntr; `endif @@ -152,66 +175,88 @@ module plic ( `endif end - // pending updates - // *** verify that this matches the expectations of the things that make requests (in terms of timing, edge-triggered vs level-triggered) - assign nextIntPending = (intPending | (requests & ~intInProgress)) & // requests should raise intPending except when their service routine is already in progress - ~({N{((entry == 24'h200004) & memread)}} << (intClaim-1)); // clear pending bit when claim register is read - flopr #(N) intPendingFlop(HCLK,~HRESETn,nextIntPending,intPending); + // pending interrupt requests + assign nextIntPending = + (intPending | // existing pending requests + (requests & ~intInProgress)) & // assert new requests (if they aren't already being serviced) + ~({`N{((entry == 24'h200004) & memread)}} << (intClaim[0]-1)) & // deassert requests that just completed + ~({`N{((entry == 24'h201004) & memread)}} << (intClaim[1]-1)); + flopr #(`N) intPendingFlop(HCLK,~HRESETn,nextIntPending,intPending); - // pending array - indexed by priority_lvl x source_ID - genvar i, j; - for (j=1; j<=7; j++) begin: pending - for (i=1; i<=N; i=i+1) begin: pendingbit - assign pendingArray[j][i] = (intPriority[i]==j) & intEn[i] & intPending[i]; + // context-dependent signals + genvar ctx; + for (ctx=0; ctx<`C; ctx++) begin + // request matrix + // priority level (rows) X source ID (columns) + // + // irqMatrix[ctx][pri][src] is high if source + // has priority level and has an "active" interrupt request + // ("active" meaning it is enabled in context and is pending) + genvar src, pri; + for (pri=1; pri<=7; pri++) begin + for (src=1; src<=`N; src++) begin + assign irqMatrix[ctx][pri][src] = (intPriority[src]==pri) & intPending[src] & intEn[ctx][src]; + end end - end - // pending array, except grouped by priority - assign pendingPGrouped[7:1] = {|pendingArray[7], - |pendingArray[6], - |pendingArray[5], - |pendingArray[4], - |pendingArray[3], - |pendingArray[2], - |pendingArray[1]}; - //assign pendingPGrouped = pendingArray.or; - // pendingPGrouped, except only topmost priority is active - assign pendingMaxP[7:1] = {pendingPGrouped[7], - pendingPGrouped[6] & ~|pendingPGrouped[7], - pendingPGrouped[5] & ~|pendingPGrouped[7:6], - pendingPGrouped[4] & ~|pendingPGrouped[7:5], - pendingPGrouped[3] & ~|pendingPGrouped[7:4], - pendingPGrouped[2] & ~|pendingPGrouped[7:3], - pendingPGrouped[1] & ~|pendingPGrouped[7:2]}; - // select the pending requests at that priority - assign pendingRequestsAtMaxP[N:1] = ({N{pendingMaxP[7]}} & pendingArray[7]) - | ({N{pendingMaxP[6]}} & pendingArray[6]) - | ({N{pendingMaxP[5]}} & pendingArray[5]) - | ({N{pendingMaxP[4]}} & pendingArray[4]) - | ({N{pendingMaxP[3]}} & pendingArray[3]) - | ({N{pendingMaxP[2]}} & pendingArray[2]) - | ({N{pendingMaxP[1]}} & pendingArray[1]); - // find the lowest ID amongst active interrupts at the highest priority - logic [5:0] k; - always_comb begin - intClaim = 6'b0; - for (k=N; k>0; k=k-1) begin - if (pendingRequestsAtMaxP[k]) intClaim = k; + // which prority levels have one or more active requests? + assign priorities_with_irqs[ctx][7:1] = { + |irqMatrix[ctx][7], + |irqMatrix[ctx][6], + |irqMatrix[ctx][5], + |irqMatrix[ctx][4], + |irqMatrix[ctx][3], + |irqMatrix[ctx][2], + |irqMatrix[ctx][1] + }; + + // get the highest priority level that has active requests + assign max_priority_with_irqs[ctx][7:1] = { + priorities_with_irqs[ctx][7], + priorities_with_irqs[ctx][6] & ~|priorities_with_irqs[ctx][7], + priorities_with_irqs[ctx][5] & ~|priorities_with_irqs[ctx][7:6], + priorities_with_irqs[ctx][4] & ~|priorities_with_irqs[ctx][7:5], + priorities_with_irqs[ctx][3] & ~|priorities_with_irqs[ctx][7:4], + priorities_with_irqs[ctx][2] & ~|priorities_with_irqs[ctx][7:3], + priorities_with_irqs[ctx][1] & ~|priorities_with_irqs[ctx][7:2] + }; + + // of the sources at the highest priority level that has active requests, + // which sources have active requests? + assign irqs_at_max_priority[ctx][`N:1] = + ({`N{max_priority_with_irqs[ctx][7]}} & irqMatrix[ctx][7]) | + ({`N{max_priority_with_irqs[ctx][6]}} & irqMatrix[ctx][6]) | + ({`N{max_priority_with_irqs[ctx][5]}} & irqMatrix[ctx][5]) | + ({`N{max_priority_with_irqs[ctx][4]}} & irqMatrix[ctx][4]) | + ({`N{max_priority_with_irqs[ctx][3]}} & irqMatrix[ctx][3]) | + ({`N{max_priority_with_irqs[ctx][2]}} & irqMatrix[ctx][2]) | + ({`N{max_priority_with_irqs[ctx][1]}} & irqMatrix[ctx][1]); + + // of the sources at the highest priority level that has active requests, + // choose the source with the lowest source ID to be the most urgent + // and set intClaim to the source ID of the most urgent active request + integer k; + always_comb begin + intClaim[ctx] = 6'b0; + for (k=`N; k>0; k--) begin + if (irqs_at_max_priority[ctx][k]) intClaim[ctx] = k[5:0]; + end end - end - - // create threshold mask - always_comb begin - threshMask[7] = (intThreshold != 7); - threshMask[6] = (intThreshold != 6) & threshMask[7]; - threshMask[5] = (intThreshold != 5) & threshMask[6]; - threshMask[4] = (intThreshold != 4) & threshMask[5]; - threshMask[3] = (intThreshold != 3) & threshMask[4]; - threshMask[2] = (intThreshold != 2) & threshMask[3]; - threshMask[1] = (intThreshold != 1) & threshMask[2]; - end - // is the max priority > threshold? - // *** would it be any better to first priority encode maxPriority into binary and then ">" with threshold? - assign ExtIntM = |(threshMask & pendingPGrouped); + + // create threshold mask + always_comb begin + threshMask[ctx][7] = (intThreshold[ctx] != 7); + threshMask[ctx][6] = (intThreshold[ctx] != 6) & threshMask[ctx][7]; + threshMask[ctx][5] = (intThreshold[ctx] != 5) & threshMask[ctx][6]; + threshMask[ctx][4] = (intThreshold[ctx] != 4) & threshMask[ctx][5]; + threshMask[ctx][3] = (intThreshold[ctx] != 3) & threshMask[ctx][4]; + threshMask[ctx][2] = (intThreshold[ctx] != 2) & threshMask[ctx][3]; + threshMask[ctx][1] = (intThreshold[ctx] != 1) & threshMask[ctx][2]; + end + // is the max priority > threshold? + // *** would it be any better to first priority encode maxPriority into binary and then ">" with threshold? + end + assign ExtIntM = |(threshMask[0] & priorities_with_irqs[0]); + assign ExtIntS = |(threshMask[1] & priorities_with_irqs[1]); endmodule diff --git a/pipelined/src/uncore/uncore.sv b/pipelined/src/uncore/uncore.sv index d90a30d7..f48b9696 100644 --- a/pipelined/src/uncore/uncore.sv +++ b/pipelined/src/uncore/uncore.sv @@ -55,7 +55,7 @@ module uncore ( input logic [3:0] HSIZED, input logic HWRITED, // peripheral pins - output logic TimerIntM, SwIntM, ExtIntM, + output logic TimerIntM, SwIntM, ExtIntM, ExtIntS, input logic [31:0] GPIOPinsIn, output logic [31:0] GPIOPinsOut, GPIOPinsEn, input logic UARTSin, @@ -133,9 +133,10 @@ module uncore ( .HWRITE, .HREADY, .HTRANS, .HWDATA, .UARTIntr, .GPIOIntr, .HREADPLIC, .HRESPPLIC, .HREADYPLIC, - .ExtIntM); + .ExtIntM, .ExtIntS); end else begin : plic assign ExtIntM = 0; + assign ExtIntS = 0; end if (`GPIO_SUPPORTED == 1) begin : gpio gpio gpio( diff --git a/pipelined/src/wally/wallypipelinedcore.sv b/pipelined/src/wally/wallypipelinedcore.sv index c8be1116..366ae217 100644 --- a/pipelined/src/wally/wallypipelinedcore.sv +++ b/pipelined/src/wally/wallypipelinedcore.sv @@ -32,137 +32,137 @@ /* verilator lint_on UNUSED */ module wallypipelinedcore ( - input logic clk, reset, + input logic clk, reset, // Privileged - input logic TimerIntM, ExtIntM, SwIntM, - input logic [63:0] MTIME_CLINT, + input logic TimerIntM, ExtIntM, ExtIntS, SwIntM, + input logic [63:0] MTIME_CLINT, // Bus Interface input logic [`AHBW-1:0] HRDATA, - input logic HREADY, HRESP, - output logic HCLK, HRESETn, - output logic [31:0] HADDR, + input logic HREADY, HRESP, + output logic HCLK, HRESETn, + output logic [31:0] HADDR, output logic [`AHBW-1:0] HWDATA, - output logic HWRITE, - output logic [2:0] HSIZE, - output logic [2:0] HBURST, - output logic [3:0] HPROT, - output logic [1:0] HTRANS, - output logic HMASTLOCK, + output logic HWRITE, + output logic [2:0] HSIZE, + output logic [2:0] HBURST, + output logic [3:0] HPROT, + output logic [1:0] HTRANS, + output logic HMASTLOCK, // Delayed signals for subword write - output logic [2:0] HADDRD, - output logic [3:0] HSIZED, - output logic HWRITED + output logic [2:0] HADDRD, + output logic [3:0] HSIZED, + output logic HWRITED ); // logic [1:0] ForwardAE, ForwardBE; - logic StallF, StallD, StallE, StallM, StallW; - logic FlushF, FlushD, FlushE, FlushM, FlushW; - logic RetM; + logic StallF, StallD, StallE, StallM, StallW; + logic FlushF, FlushD, FlushE, FlushM, FlushW; + logic RetM; (* mark_debug = "true" *) logic TrapM; // new signals that must connect through DP - logic MDUE, W64E; - logic CSRReadM, CSRWriteM, PrivilegedM; - logic [1:0] AtomicE; - logic [1:0] AtomicM; - logic [`XLEN-1:0] ForwardedSrcAE, ForwardedSrcBE; //, SrcAE, SrcBE; - logic [`XLEN-1:0] SrcAM; - logic [2:0] Funct3E; + logic MDUE, W64E; + logic CSRReadM, CSRWriteM, PrivilegedM; + logic [1:0] AtomicE; + logic [1:0] AtomicM; + logic [`XLEN-1:0] ForwardedSrcAE, ForwardedSrcBE; //, SrcAE, SrcBE; + logic [`XLEN-1:0] SrcAM; + logic [2:0] Funct3E; // logic [31:0] InstrF; - logic [31:0] InstrD, InstrW; - (* mark_debug = "true" *) logic [31:0] InstrM; - logic [`XLEN-1:0] PCF, PCD, PCE, PCLinkE; - (* mark_debug = "true" *) logic [`XLEN-1:0] PCM; - logic [`XLEN-1:0] CSRReadValW, MDUResultW; - logic [`XLEN-1:0] PrivilegedNextPCM; - (* mark_debug = "true" *) logic [1:0] MemRWM; - (* mark_debug = "true" *) logic InstrValidM; - logic InstrMisalignedFaultM; - logic IllegalBaseInstrFaultD, IllegalIEUInstrFaultD; - logic InstrPageFaultF, LoadPageFaultM, StoreAmoPageFaultM; - logic LoadMisalignedFaultM, LoadAccessFaultM; - logic StoreAmoMisalignedFaultM, StoreAmoAccessFaultM; - logic [`XLEN-1:0] InstrMisalignedAdrM; + logic [31:0] InstrD, InstrW; + (* mark_debug = "true" *) logic [31:0] InstrM; + logic [`XLEN-1:0] PCF, PCD, PCE, PCLinkE; + (* mark_debug = "true" *) logic [`XLEN-1:0] PCM; + logic [`XLEN-1:0] CSRReadValW, MDUResultW; + logic [`XLEN-1:0] PrivilegedNextPCM; + (* mark_debug = "true" *) logic [1:0] MemRWM; + (* mark_debug = "true" *) logic InstrValidM; + logic InstrMisalignedFaultM; + logic IllegalBaseInstrFaultD, IllegalIEUInstrFaultD; + logic InstrPageFaultF, LoadPageFaultM, StoreAmoPageFaultM; + logic LoadMisalignedFaultM, LoadAccessFaultM; + logic StoreAmoMisalignedFaultM, StoreAmoAccessFaultM; + logic [`XLEN-1:0] InstrMisalignedAdrM; logic InvalidateICacheM, FlushDCacheM; - logic PCSrcE; - logic CSRWritePendingDEM; - logic DivBusyE; + logic PCSrcE; + logic CSRWritePendingDEM; + logic DivBusyE; logic DivE; - logic LoadStallD, StoreStallD, MDUStallD, CSRRdStallD; - logic SquashSCW; + logic LoadStallD, StoreStallD, MDUStallD, CSRRdStallD; + logic SquashSCW; // floating point unit signals - logic [2:0] FRM_REGW; + logic [2:0] FRM_REGW; logic [4:0] RdM, RdW; - logic FStallD; - logic FWriteIntE; - logic [`XLEN-1:0] FWriteDataE; - logic [`XLEN-1:0] FIntResM; - logic FDivBusyE; - logic IllegalFPUInstrD, IllegalFPUInstrE; - logic FRegWriteM; - logic FPUStallD; - logic [4:0] SetFflagsM; + logic FStallD; + logic FWriteIntE; + logic [`XLEN-1:0] FWriteDataE; + logic [`XLEN-1:0] FIntResM; + logic FDivBusyE; + logic IllegalFPUInstrD, IllegalFPUInstrE; + logic FRegWriteM; + logic FPUStallD; + logic [4:0] SetFflagsM; // memory management unit signals - logic ITLBWriteF; - logic ITLBFlushF, DTLBFlushM; - logic ITLBMissF; - logic [`XLEN-1:0] SATP_REGW; + logic ITLBWriteF; + logic ITLBFlushF, DTLBFlushM; + logic ITLBMissF; + logic [`XLEN-1:0] SATP_REGW; logic STATUS_MXR, STATUS_SUM, STATUS_MPRV; logic [1:0] STATUS_MPP; - logic [1:0] PrivilegeModeW; - logic [`XLEN-1:0] PTE; - logic [1:0] PageType; + logic [1:0] PrivilegeModeW; + logic [`XLEN-1:0] PTE; + logic [1:0] PageType; // PMA checker signals var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0]; var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0]; // IMem stalls - logic IFUStallF; - logic LSUStallM; + logic IFUStallF; + logic LSUStallM; // cpu lsu interface - logic [2:0] Funct3M; - logic [`XLEN-1:0] IEUAdrE; + logic [2:0] Funct3M; + logic [`XLEN-1:0] IEUAdrE; (* mark_debug = "true" *) logic [`XLEN-1:0] WriteDataM; - (* mark_debug = "true" *) logic [`XLEN-1:0] IEUAdrM; - (* mark_debug = "true" *) logic [`XLEN-1:0] ReadDataM; - logic [`XLEN-1:0] ReadDataW; - logic CommittedM; + (* mark_debug = "true" *) logic [`XLEN-1:0] IEUAdrM; + (* mark_debug = "true" *) logic [`XLEN-1:0] ReadDataM; + logic [`XLEN-1:0] ReadDataW; + logic CommittedM; // AHB ifu interface - logic [`PA_BITS-1:0] IFUBusAdr; - logic [`XLEN-1:0] IFUBusHRDATA; - logic IFUBusRead; - logic IFUBusAck; + logic [`PA_BITS-1:0] IFUBusAdr; + logic [`XLEN-1:0] IFUBusHRDATA; + logic IFUBusRead; + logic IFUBusAck; // AHB LSU interface - logic [`PA_BITS-1:0] LSUBusAdr; - logic LSUBusRead; - logic LSUBusWrite; - logic LSUBusAck; - logic [`XLEN-1:0] LSUBusHRDATA; - logic [`XLEN-1:0] LSUBusHWDATA; + logic [`PA_BITS-1:0] LSUBusAdr; + logic LSUBusRead; + logic LSUBusWrite; + logic LSUBusAck; + logic [`XLEN-1:0] LSUBusHRDATA; + logic [`XLEN-1:0] LSUBusHWDATA; - logic BPPredWrongE; - logic BPPredDirWrongM; - logic BTBPredPCWrongM; - logic RASPredPCWrongM; - logic BPPredClassNonCFIWrongM; - logic [4:0] InstrClassM; - logic InstrAccessFaultF; - logic [2:0] LSUBusSize; + logic BPPredWrongE; + logic BPPredDirWrongM; + logic BTBPredPCWrongM; + logic RASPredPCWrongM; + logic BPPredClassNonCFIWrongM; + logic [4:0] InstrClassM; + logic InstrAccessFaultF; + logic [2:0] LSUBusSize; - logic ExceptionM; - logic PendingInterruptM; - logic DCacheMiss; - logic DCacheAccess; - logic ICacheMiss; - logic ICacheAccess; - logic BreakpointFaultM, EcallFaultM; + logic ExceptionM; + logic PendingInterruptM; + logic DCacheMiss; + logic DCacheAccess; + logic ICacheMiss; + logic ICacheAccess; + logic BreakpointFaultM, EcallFaultM; logic InstrDAPageFaultF; ifu ifu( @@ -203,8 +203,8 @@ module wallypipelinedcore ( .PMPCFG_ARRAY_REGW, .PMPADDR_ARRAY_REGW, .InstrAccessFaultF, .InstrDAPageFaultF - - ); // instruction fetch unit: PC, branch prediction, instruction cache + + ); // instruction fetch unit: PC, branch prediction, instruction cache ieu ieu( .clk, .reset, @@ -221,7 +221,7 @@ module wallypipelinedcore ( // Memory stage interface .SquashSCW, // from LSU .MemRWM, // read/write control goes to LSU - .AtomicE, // atomic control goes to LSU + .AtomicE, // atomic control goes to LSU .AtomicM, // atomic control goes to LSU .WriteDataM, // Write data to LSU .Funct3M, // size and signedness to LSU @@ -245,41 +245,41 @@ module wallypipelinedcore ( lsu lsu( .clk, .reset, .StallM, .FlushM, .StallW, - .FlushW, - // CPU interface - .MemRWM, .Funct3M, .Funct7M(InstrM[31:25]), - .AtomicM, .TrapM, - .CommittedM, .DCacheMiss, .DCacheAccess, - .SquashSCW, - //.DataMisalignedM(DataMisalignedM), - .IEUAdrE, .IEUAdrM, .WriteDataM, - .ReadDataM, .FlushDCacheM, - // connected to ahb (all stay the same) - .LSUBusAdr, .LSUBusRead, .LSUBusWrite, .LSUBusAck, - .LSUBusHRDATA, .LSUBusHWDATA, .LSUBusSize, + .FlushW, + // CPU interface + .MemRWM, .Funct3M, .Funct7M(InstrM[31:25]), + .AtomicM, .TrapM, + .CommittedM, .DCacheMiss, .DCacheAccess, + .SquashSCW, + //.DataMisalignedM(DataMisalignedM), + .IEUAdrE, .IEUAdrM, .WriteDataM, + .ReadDataM, .FlushDCacheM, + // connected to ahb (all stay the same) + .LSUBusAdr, .LSUBusRead, .LSUBusWrite, .LSUBusAck, + .LSUBusHRDATA, .LSUBusHWDATA, .LSUBusSize, - // connect to csr or privilege and stay the same. - .PrivilegeModeW, // connects to csr - .PMPCFG_ARRAY_REGW, // connects to csr - .PMPADDR_ARRAY_REGW, // connects to csr - // hptw keep i/o - .SATP_REGW, // from csr - .STATUS_MXR, // from csr - .STATUS_SUM, // from csr - .STATUS_MPRV, // from csr - .STATUS_MPP, // from csr + // connect to csr or privilege and stay the same. + .PrivilegeModeW, // connects to csr + .PMPCFG_ARRAY_REGW, // connects to csr + .PMPADDR_ARRAY_REGW, // connects to csr + // hptw keep i/o + .SATP_REGW, // from csr + .STATUS_MXR, // from csr + .STATUS_SUM, // from csr + .STATUS_MPRV, // from csr + .STATUS_MPP, // from csr - .DTLBFlushM, // connects to privilege - .LoadPageFaultM, // connects to privilege - .StoreAmoPageFaultM, // connects to privilege - .LoadMisalignedFaultM, // connects to privilege - .LoadAccessFaultM, // connects to privilege - .StoreAmoMisalignedFaultM, // connects to privilege - .StoreAmoAccessFaultM, // connects to privilege + .DTLBFlushM, // connects to privilege + .LoadPageFaultM, // connects to privilege + .StoreAmoPageFaultM, // connects to privilege + .LoadMisalignedFaultM, // connects to privilege + .LoadAccessFaultM, // connects to privilege + .StoreAmoMisalignedFaultM, // connects to privilege + .StoreAmoAccessFaultM, // connects to privilege .InstrDAPageFaultF, - .PCF, .ITLBMissF, .PTE, .PageType, .ITLBWriteF, - .LSUStallM); // change to LSUStallM + .PCF, .ITLBMissF, .PTE, .PageType, .ITLBWriteF, + .LSUStallM); // change to LSUStallM // *** Ross: please make EBU conditional when only supporting internal memories @@ -306,13 +306,13 @@ module wallypipelinedcore ( .LoadStallD, .StoreStallD, .MDUStallD, .CSRRdStallD, .LSUStallM, .IFUStallF, .FPUStallD, .FStallD, - .DivBusyE, .FDivBusyE, - .EcallFaultM, .BreakpointFaultM, + .DivBusyE, .FDivBusyE, + .EcallFaultM, .BreakpointFaultM, .InvalidateICacheM, // Stall & flush outputs - .StallF, .StallD, .StallE, .StallM, .StallW, - .FlushF, .FlushD, .FlushE, .FlushM, .FlushW - ); // global stall and flush control + .StallF, .StallD, .StallE, .StallM, .StallW, + .FlushF, .FlushD, .FlushE, .FlushM, .FlushW + ); // global stall and flush control if (`ZICSR_SUPPORTED) begin:priv privileged priv( @@ -331,7 +331,7 @@ module wallypipelinedcore ( .InstrPageFaultF, .LoadPageFaultM, .StoreAmoPageFaultM, .InstrMisalignedFaultM, .IllegalIEUInstrFaultD, .IllegalFPUInstrD, .LoadMisalignedFaultM, .StoreAmoMisalignedFaultM, - .TimerIntM, .ExtIntM, .SwIntM, + .TimerIntM, .ExtIntM, .ExtIntS, .SwIntM, .MTIME_CLINT, .InstrMisalignedAdrM, .IEUAdrM, .SetFflagsM, diff --git a/pipelined/src/wally/wallypipelinedsoc.sv b/pipelined/src/wally/wallypipelinedsoc.sv index 1b7f3831..0d844d3c 100644 --- a/pipelined/src/wally/wallypipelinedsoc.sv +++ b/pipelined/src/wally/wallypipelinedsoc.sv @@ -74,7 +74,7 @@ module wallypipelinedsoc ( logic HRESP; logic TimerIntM, SwIntM; // from CLINT logic [63:0] MTIME_CLINT; // from CLINT to CSRs - logic ExtIntM; // from PLIC + logic ExtIntM,ExtIntS; // from PLIC logic [2:0] HADDRD; logic [3:0] HSIZED; logic HWRITED; @@ -84,7 +84,7 @@ module wallypipelinedsoc ( // instantiate processor and memories wallypipelinedcore core(.clk, .reset, - .TimerIntM, .ExtIntM, .SwIntM, + .TimerIntM, .ExtIntM, .ExtIntS, .SwIntM, .MTIME_CLINT, .HRDATA, .HREADY, .HRESP, .HCLK, .HRESETn, .HADDR, .HWDATA, .HWRITE, .HSIZE, .HBURST, .HPROT, .HTRANS, .HMASTLOCK, @@ -94,7 +94,7 @@ module wallypipelinedsoc ( uncore uncore(.HCLK, .HRESETn, .TIMECLK, .HADDR, .HWDATA, .HWRITE, .HSIZE, .HBURST, .HPROT, .HTRANS, .HMASTLOCK, .HRDATAEXT, .HREADYEXT, .HRESPEXT, .HRDATA, .HREADY, .HRESP, .HADDRD, .HSIZED, .HWRITED, - .TimerIntM, .SwIntM, .ExtIntM, .GPIOPinsIn, .GPIOPinsOut, .GPIOPinsEn, .UARTSin, .UARTSout, .MTIME_CLINT, + .TimerIntM, .SwIntM, .ExtIntM, .ExtIntS, .GPIOPinsIn, .GPIOPinsOut, .GPIOPinsEn, .UARTSin, .UARTSout, .MTIME_CLINT, .HSELEXT, .SDCCmdOut, .SDCCmdOE, .SDCCmdIn, .SDCDatIn, .SDCCLK diff --git a/pipelined/testbench/testbench-linux.sv b/pipelined/testbench/testbench-linux.sv index 62d13a1a..8b37bcbc 100644 --- a/pipelined/testbench/testbench-linux.sv +++ b/pipelined/testbench/testbench-linux.sv @@ -334,8 +334,8 @@ module testbench; //`INIT_CHECKPOINT_VAL(UART_MSR, [7:0]); `INIT_CHECKPOINT_VAL(UART_SCR, [7:0]); `INIT_CHECKPOINT_SIMPLE_ARRAY(PLIC_INT_PRIORITY, [2:0],`PLIC_NUM_SRC,1); - `INIT_CHECKPOINT_VAL(PLIC_INT_ENABLE, [`PLIC_NUM_SRC:1]); - `INIT_CHECKPOINT_VAL(PLIC_THRESHOLD, [2:0]); + `INIT_CHECKPOINT_SIMPLE_ARRAY(PLIC_INT_ENABLE, [`PLIC_NUM_SRC:1],1,0); + `INIT_CHECKPOINT_SIMPLE_ARRAY(PLIC_THRESHOLD, [2:0],1,0); integer memFile; integer readResult; From 6f6663cd67263ccdbe3fb4a2783fc8c6d355517f Mon Sep 17 00:00:00 2001 From: bbracker Date: Fri, 25 Mar 2022 01:02:22 +0000 Subject: [PATCH 03/20] fix multiple-context PLIC checkpoint generation --- linux/testvector-generation/parsePlicState.py | 2 +- pipelined/testbench/testbench-linux.sv | 20 ++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/linux/testvector-generation/parsePlicState.py b/linux/testvector-generation/parsePlicState.py index 35ef00b1..b917bfdc 100755 --- a/linux/testvector-generation/parsePlicState.py +++ b/linux/testvector-generation/parsePlicState.py @@ -101,7 +101,7 @@ with open(outDir+'checkpoint-PLIC_INT_PRIORITY', 'w') as outFile: outFile.write(stripZeroes(word[2:])+'\n') with open(outDir+'checkpoint-PLIC_INT_ENABLE', 'w') as outFile: for word in plicIntEnableArray: - outFile.write(word+'\n') + outFile.write(stripZeroes(word)+'\n') with open(outDir+'checkpoint-PLIC_THRESHOLD', 'w') as outFile: for word in plicIntPriorityThresholdArray: outFile.write(stripZeroes(word[2:])+'\n') diff --git a/pipelined/testbench/testbench-linux.sv b/pipelined/testbench/testbench-linux.sv index 36153d73..12950b63 100644 --- a/pipelined/testbench/testbench-linux.sv +++ b/pipelined/testbench/testbench-linux.sv @@ -266,6 +266,19 @@ module testbench; end \ end + `define INIT_CHECKPOINT_PACKED_ARRAY(SIGNAL,DIM,ARRAY_MAX,ARRAY_MIN) \ + `MAKE_CHECKPOINT_INIT_SIGNAL(SIGNAL,DIM,ARRAY_MAX,ARRAY_MIN) \ + for (i=ARRAY_MIN; i" in the signal name `define INIT_CHECKPOINT_GENBLK_ARRAY(SIGNAL_BASE,SIGNAL,DIM,ARRAY_MAX,ARRAY_MIN) \ @@ -296,6 +309,7 @@ module testbench; end \ end + genvar i; `INIT_CHECKPOINT_SIMPLE_ARRAY(RF, [`XLEN-1:0],31,1); `INIT_CHECKPOINT_SIMPLE_ARRAY(HPMCOUNTER, [`XLEN-1:0],`COUNTERS-1,0); `INIT_CHECKPOINT_VAL(PC, [`XLEN-1:0]); @@ -333,9 +347,9 @@ module testbench; //`INIT_CHECKPOINT_VAL(UART_LSR, [7:0]); //`INIT_CHECKPOINT_VAL(UART_MSR, [7:0]); `INIT_CHECKPOINT_VAL(UART_SCR, [7:0]); - `INIT_CHECKPOINT_SIMPLE_ARRAY(PLIC_INT_PRIORITY, [2:0],`PLIC_NUM_SRC,1); - `INIT_CHECKPOINT_SIMPLE_ARRAY(PLIC_INT_ENABLE, [`PLIC_NUM_SRC:1],1,0); - `INIT_CHECKPOINT_SIMPLE_ARRAY(PLIC_THRESHOLD, [2:0],1,0); + `INIT_CHECKPOINT_PACKED_ARRAY(PLIC_INT_PRIORITY, [2:0],`PLIC_NUM_SRC,1); + `INIT_CHECKPOINT_PACKED_ARRAY(PLIC_INT_ENABLE, [`PLIC_NUM_SRC:1],1,0); + `INIT_CHECKPOINT_PACKED_ARRAY(PLIC_THRESHOLD, [2:0],1,0); integer memFile; integer readResult; From 61c714ebe6e65885f728da5e3f22be5b085d8ac0 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Fri, 25 Mar 2022 13:10:31 -0500 Subject: [PATCH 04/20] I think this version of csri matches what is required in the spec. ExtIntS should not be written into the SEIP register bit. --- pipelined/src/privileged/csri.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelined/src/privileged/csri.sv b/pipelined/src/privileged/csri.sv index 7eff9496..b9a302d2 100644 --- a/pipelined/src/privileged/csri.sv +++ b/pipelined/src/privileged/csri.sv @@ -58,7 +58,7 @@ module csri #(parameter always_comb begin IntInM = 0; IntInM[11] = ExtIntM; // MEIP - IntInM[9] = ExtIntS | (ExtIntM & MIDELEG_REGW[9]); // SEIP + IntInM[9] = (ExtIntM & MIDELEG_REGW[9]); // SEIP IntInM[7] = TimerIntM; // MTIP IntInM[5] = TimerIntM & MIDELEG_REGW[5]; // STIP IntInM[3] = SwIntM; // MSIP From 7ae1d141911386b9d4fecd8c1e2ca3c5c8c609ee Mon Sep 17 00:00:00 2001 From: Kip Macsai-Goren Date: Fri, 25 Mar 2022 22:57:03 +0000 Subject: [PATCH 05/20] added basic trap tests that do not pass regression yet. updated signature adresses --- pipelined/testbench/tests.vh | 24 +- .../rv64i_m/privilege/Makefrag | 3 +- .../references/WALLY-trap-01.reference_output | 244 +++++++++--------- .../rv64i_m/privilege/src/WALLY-TEST-LIB-64.h | 231 ++++++++++++----- .../rv64i_m/privilege/src/WALLY-trap-01.S | 52 ++-- 5 files changed, 321 insertions(+), 233 deletions(-) diff --git a/pipelined/testbench/tests.vh b/pipelined/testbench/tests.vh index 8ae9bc19..687878bc 100644 --- a/pipelined/testbench/tests.vh +++ b/pipelined/testbench/tests.vh @@ -1450,29 +1450,31 @@ string imperas32f[] = '{ string wally64priv[] = '{ `WALLYTEST, - "rv64i_m/privilege/WALLY-CSR-permission-s-01", "004080", + "rv64i_m/privilege/WALLY-CSR-permission-s-01", "0050a0", //"rv64i_m/privilege/WALLY-CSR-PERMISSIONS-M", "005070", //"rv64i_m/privilege/WALLY-CSR-PERMISSIONS-S", "003070", - "rv64i_m/privilege/WALLY-CSR-permission-u-01", "005080", + "rv64i_m/privilege/WALLY-CSR-permission-u-01", "0050a0", // "rv64i_m/privilege/WALLY-MARCHID", "003070", /* "rv64i_m/privilege/WALLY-MCAUSE", "003070", "rv64i_m/privilege/WALLY-MEDELEG", "003070", "rv64i_m/privilege/WALLY-MHARTID", "003070", "rv64i_m/privilege/WALLY-MIMPID", "003070",*/ - "rv64i_m/privilege/WALLY-minfo-01", "004080", - "rv64i_m/privilege/WALLY-misa-01", "004080", - "rv64i_m/privilege/WALLY-MMU-SV39", "004080", - "rv64i_m/privilege/WALLY-MMU-SV48", "004080", + "rv64i_m/privilege/WALLY-minfo-01", "0040a0", + "rv64i_m/privilege/WALLY-misa-01", "0040a0", + "rv64i_m/privilege/WALLY-MMU-SV39", "0040a0", + "rv64i_m/privilege/WALLY-MMU-SV48", "0040a0", /* "rv64i_m/privilege/WALLY-MSTATUS", "002070", "rv64i_m/privilege/WALLY-MTVEC", "002070", "rv64i_m/privilege/WALLY-MVENDORID", "003070", */ - "rv64i_m/privilege/WALLY-PMA", "004080", - "rv64i_m/privilege/WALLY-PMP", "004080", + "rv64i_m/privilege/WALLY-PMA", "0040a0", + "rv64i_m/privilege/WALLY-PMP", "0040a0", // "rv64i_m/privilege/WALLY-SCAUSE", "002070", - "rv64i_m/privilege/WALLY-scratch-01", "004080", - "rv64i_m/privilege/WALLY-sscratch-s-01", "004080" + "rv64i_m/privilege/WALLY-scratch-01", "0040a0", + "rv64i_m/privilege/WALLY-sscratch-s-01", "0040a0" +// "rv64i_m/privilege/WALLY-trap-01", "0040a0" // "rv64i_m/privilege/WALLY-STVEC", "002070", -// "rv64i_m/privilege/WALLY-UCAUSE", "002070" +// "rv64i_m/privilege/WALLY-UCAUSE", "002070", + }; string wally64periph[] = '{ diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/Makefrag b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/Makefrag index adf32839..73ef3c20 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/Makefrag +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/Makefrag @@ -56,7 +56,8 @@ target_tests_nosim = \ WALLY-MIMPID \ WALLY-MVENDORID \ WALLY-CSR-PERMISSIONS-M \ - WALLY-CSR-PERMISSIONS-S + WALLY-CSR-PERMISSIONS-S \ + WALLY-trap-01 \ # Have all 0's in references! #WALLY-MEPC \ #WALLY-SEPC \ diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/WALLY-trap-01.reference_output b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/WALLY-trap-01.reference_output index 6fbd0f38..eef583de 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/WALLY-trap-01.reference_output +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/references/WALLY-trap-01.reference_output @@ -1,3 +1,93 @@ +00000aaa # Test 5.3.1.4: readback value from writing mie to enable interrupts +00000000 +00000001 # mcause from an instruction access fault +00000000 +00000000 # mtval of faulting instruction address (0x0) +00000000 +00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +00000002 # mcause from an Illegal instruction +00000000 +00000000 # mtval of faulting instruction (0x0) +00000000 +00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +00000003 # mcause from Breakpoint +00000000 +800003ec # mtval of breakpoint instruction adress (0x800003ec) +00000000 +00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +00000004 # mcause from load address misaligned +00000000 +800003f5 # mtval of misaligned address (0x800003f5) +00000000 +00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +00000005 # mcause from load access +00000000 +00000000 # mtval of accessed adress (0x0) +00000000 +00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +00000006 # mcause from store misaligned +00000000 +80000411 # mtval of address with misaligned store instr (0x80000410) +00000000 +00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +00000007 # mcause from store access +00000000 +00000000 # mtval of accessed address (0x0) +00000000 +00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +0000000b # mcause from M mode ecall +00000000 +00000000 # mtval of ecall (*** defined to be zero for now) +00000000 +00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +00000008 # mcause from U mode ecall +00000000 +00000000 # mtval of ecall (*** defined to be zero for now) +00000000 +00000080 # masked out mstatus.MPP = 00 (from U mode), mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +00000009 # mcause from S mode ecall +00000000 +00000000 # mtval of ecall (*** defined to be zero for now) +00000000 +00000880 # masked out mstatus.MPP = 01 (from S mode), mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +000007ec # value to indicate a vectored interrupts +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 +000007ec # value to indicate a vectored interrupts +00000000 +00000001 # 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 +000007ec # value to indicate a vectored interrupts +00000000 +0000000b # mcause value from m ext interrupt +80000000 +00000000 # mtval for mext interrupt (0x0) +00000000 +00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +0000b309 # medeleg after attempted write of all 1's (only some bits are writeable) +00000000 +00000222 # mideleg after attempted write of all 1's (only some bits are writeable) +00000000 00000001 # Test 5.3.1.4: mcause from an instruction access fault 00000000 00000000 # mtval of faulting instruction address (0x0) @@ -12,49 +102,67 @@ 00000000 00000003 # mcause from Breakpoint 00000000 -00000000 # mtval of breakpoint instruction adress (*** Determined from make) +800003ec # mtval of breakpoint instruction adress (0x800003ec) 00000000 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 00000000 00000004 # mcause from load address misaligned 00000000 -00000000 # mtval of misaligned address (*** Determined from make) +800003f5 # mtval of misaligned address (0x800003f5) 00000000 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 00000000 00000005 # mcause from load access 00000000 -00000000 # mtval of address with access faulting instr (*** Determined from make) +00000000 # mtval of accessed adress (0x0) 00000000 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 00000000 00000006 # mcause from store misaligned 00000000 -00000000 # mtval of address with misaligned store instr (*** Determined from make) +80000411 # mtval of address with misaligned store instr (0x80000410) 00000000 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 00000000 00000007 # mcause from store access 00000000 -00000000 # mtval of address with faulting store instr (*** Determined from make) +00000000 # mtval of accessed address (0x0) 00000000 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 00000000 0000000b # mcause from M mode ecall 00000000 -00000000 # mtval of +00000000 # mtval of ecall (*** defined to be zero for now) 00000000 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 00000000 -00000008 # mcause from U mode ecall +000007ec # value to indicate a vectored interrupts 00000000 -00000000 # mtval of +00000007 # mcause value from time interrupt +80000000 +00000000 # mtval for mtime interrupt (0x0) 00000000 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 00000000 -00000009 # mcause from S mode ecall +000007ec # value to indicate a vectored interrupts 00000000 -00000000 # mtval of address with faulting store instr (*** Determined from make) +00000001 # 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 +000007ec # value to indicate a vectored interrupts +00000000 +0000000b # mcause value from m ext interrupt +80000000 +00000000 # mtval for mext interrupt (0x0) +00000000 +00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 +00000000 +0000000b # mcause from M mode ecall from test termination +00000000 +00000000 # mtval of ecall (*** defined to be zero for now) 00000000 00001880 # masked out mstatus.MPP = 11, mstatus.MPIE = 1, and mstatus.MIE = 0 00000000 @@ -964,119 +1072,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 -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef -deadbeef diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/WALLY-TEST-LIB-64.h b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/WALLY-TEST-LIB-64.h index 99e000fa..534fd433 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/WALLY-TEST-LIB-64.h +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/WALLY-TEST-LIB-64.h @@ -55,6 +55,99 @@ RVTEST_CODE_BEGIN .endm +// Code to trigger traps goes here so we have consistent mtvals for instruction adresses +// Even if more tests are added. +.macro CAUSE_TRAP_TRIGGERS +j end_trap_triggers + +// The following tests involve causing many of the interrupts and exceptions that are easily done in a few lines +// This effectively includes everything that isn't to do with page faults (virtual memory) + +cause_instr_addr_misaligned: + // cause a misaligned address trap + auipc x28, 0 // get current PC, which is aligned + addi x28, x28, 0x3 // add 1 to pc to create misaligned address + jr x28 // cause instruction address midaligned trap + ret + +cause_instr_access: + la x28, 0x0 // address zero is an address with no memory + sd x1, -8(sp) // push the return adress ontot the stack + addi sp, sp, -8 + jalr x28 // cause instruction access trap + ld x1, 0(sp) // pop return adress back from the stack + addi sp, sp, 8 + ret + +cause_illegal_instr: + .word 0x00000000 // a 32 bit zros is an illegal instruction + ret + +cause_breakpnt: // **** + ebreak + ret + +cause_load_addr_misaligned: + auipc x28, 0 // get current PC, which is aligned + addi x28, x28, 1 + lw x29, 0(x28) // load from a misaligned address + ret + +cause_load_acc: + la x28, 0 // 0 is an address with no memory + lw x29, 0(x28) // load from unimplemented address + ret + +cause_store_addr_misaligned: + auipc x28, 0 // get current PC, which is aligned + addi x28, x28, 1 + sw x29, 0(x28) // store to a misaligned address + ret + +cause_store_acc: + la x28, 0 // 0 is an address with no memory + sw x29, 0(x28) // store to unimplemented address + ret + +cause_ecall: + // *** ASSUMES you have already gone to the mode you need to call this from. + ecall + ret + +cause_time_interrupt: + // The following code works for both RV32 and RV64. + // RV64 alone would be easier using double-word adds and stores + li x28, 0x100 // Desired offset from the present time + la x29, 0x02004000 // MTIMECMP register in CLINT + la x30, 0x0200BFF8 // MTIME register in CLINT + lw x7, 0(x30) // low word of MTIME + lw x31, 4(x30) // high word of MTIME + add x28, x7, x28 // add desired offset to the current time + bgtu x28, x7, nowrap // check new time exceeds current time (no wraparound) + addi x31, x31, 1 // if wrap, increment most significant word + sw x31,4(x29) // store into most significant word of MTIMECMP +nowrap: + sw x28, 0(x29) // store into least significant word of MTIMECMP + loop: j loop // wait until interrupt occurs + ret + +cause_soft_interrupt: + la x28, 0x02000000 // MSIP register in CLINT + li x29, 1 // 1 in the lsb + sw x29, 0(x28) // Write MSIP bit + ret + +cause_ext_interrupt: + li x28, 0x10060000 // load base GPIO memory location + li x29, 0x1 + sw x29, 8(x28) // enable the first pin as an output + sw x29, 28(x28) // set first pin to high interrupt enable + sw x29, 40(x28) // write a 1 to the first output pin (cause interrupt) + ret + +end_trap_triggers: +.endm + .macro TRAP_HANDLER MODE, VECTORED=1, DEBUG=0 // MODE decides which mode this trap handler will be taken in (M or S mode) // Vectored decides whether interrumpts are handled with the vector table at trap_handler_MODE (1) @@ -577,7 +670,7 @@ trap_handler_end_\MODE\(): // place to jump to so we can skip the trap handler a // The previous CSR value before write attempt // *** Most likely 0x2, the mcause for illegal instruction if we don't have write or read access li x30, 0xbad // load bad value to be overwritten by csrr - li x29, \VAL + li x29, \VAL\() csrw \CSR\(), x29 csrr x30, \CSR sd x30, 0(x6) @@ -627,86 +720,86 @@ trap_handler_end_\MODE\(): // place to jump to so we can skip the trap handler a addi x16, x16, 8 .endm -// The following tests involve causing many of the interrupts and exceptions that are easily done in a few lines -// This effectively includes everything that isn't to do with page faults (virtual memory) +// // The following tests involve causing many of the interrupts and exceptions that are easily done in a few lines +// // This effectively includes everything that isn't to do with page faults (virtual memory) -.macro CAUSE_INSTR_ADDR_MISALIGNED - // cause a misaligned address trap - auipc x28, 0 // get current PC, which is aligned - addi x28, x28, 0x1 // add 1 to pc to create misaligned address - jalr x28 // cause instruction address midaligned trap -.endm +// .macro CAUSE_INSTR_ADDR_MISALIGNED +// // cause a misaligned address trap +// auipc x28, 0 // get current PC, which is aligned +// addi x28, x28, 0x1 // add 1 to pc to create misaligned address +// jalr x28 // cause instruction address midaligned trap +// .endm -.macro CAUSE_INSTR_ACCESS - la x28, 0x0 // address zero is an address with no memory - jalr x28 // cause instruction access trap -.endm +// .macro CAUSE_INSTR_ACCESS +// la x28, 0x0 // address zero is an address with no memory +// jalr x28 // cause instruction access trap +// .endm -.macro CAUSE_ILLEGAL_INSTR - .word 0x00000000 // a 32 bit zros is an illegal instruction -.endm +// .macro CAUSE_ILLEGAL_INSTR +// .word 0x00000000 // a 32 bit zros is an illegal instruction +// .endm -.macro CAUSE_BREAKPNT // **** - ebreak -.endm +// .macro CAUSE_BREAKPNT // **** +// ebreak +// .endm -.macro CAUSE_LOAD_ADDR_MISALIGNED - auipc x28, 0 // get current PC, which is aligned - addi x28, x28, 1 - lw x29, 0(x28) // load from a misaligned address -.endm +// .macro CAUSE_LOAD_ADDR_MISALIGNED +// auipc x28, 0 // get current PC, which is aligned +// addi x28, x28, 1 +// lw x29, 0(x28) // load from a misaligned address +// .endm -.macro CAUSE_LOAD_ACC - la x28, 0 // 0 is an address with no memory - lw x29, 0(x28) // load from unimplemented address -.endm +// .macro CAUSE_LOAD_ACC +// la x28, 0 // 0 is an address with no memory +// lw x29, 0(x28) // load from unimplemented address +// .endm -.macro CAUSE_STORE_ADDR_MISALIGNED - auipc x28, 0 // get current PC, which is aligned - addi x28, x28, 1 - sw x29, 0(x28) // store to a misaligned address -.endm +// .macro CAUSE_STORE_ADDR_MISALIGNED +// auipc x28, 0 // get current PC, which is aligned +// addi x28, x28, 1 +// sw x29, 0(x28) // store to a misaligned address +// .endm -.macro CAUSE_STORE_ACC - la x28, 0 // 0 is an address with no memory - sw x29, 0(x28) // store to unimplemented address -.endm +// .macro CAUSE_STORE_ACC +// la x28, 0 // 0 is an address with no memory +// sw x29, 0(x28) // store to unimplemented address +// .endm -.macro CAUSE_ECALL - // *** ASSUMES you have already gone to the mode you need to call this from. - ecall -.endm +// .macro CAUSE_ECALL +// // *** ASSUMES you have already gone to the mode you need to call this from. +// ecall +// .endm -.macro CAUSE_TIME_INTERRUPT - // The following code works for both RV32 and RV64. - // RV64 alone would be easier using double-word adds and stores - li x28, 0x100 // Desired offset from the present time - la x29, 0x02004000 // MTIMECMP register in CLINT - la x30, 0x0200BFF8 // MTIME register in CLINT - lw x7, 0(x30) // low word of MTIME - lw x31, 4(x30) // high word of MTIME - add x28, x7, x28 // add desired offset to the current time - bgtu x28, x7, nowrap // check new time exceeds current time (no wraparound) - addi x31, x31, 1 // if wrap, increment most significant word - sw x31,4(x29) // store into most significant word of MTIMECMP -nowrap: - sw x28, 0(x29) // store into least significant word of MTIMECMP - loop: j loop // wait until interrupt occurs -.endm +// .macro CAUSE_TIME_INTERRUPT +// // The following code works for both RV32 and RV64. +// // RV64 alone would be easier using double-word adds and stores +// li x28, 0x100 // Desired offset from the present time +// la x29, 0x02004000 // MTIMECMP register in CLINT +// la x30, 0x0200BFF8 // MTIME register in CLINT +// lw x7, 0(x30) // low word of MTIME +// lw x31, 4(x30) // high word of MTIME +// add x28, x7, x28 // add desired offset to the current time +// bgtu x28, x7, nowrap // check new time exceeds current time (no wraparound) +// addi x31, x31, 1 // if wrap, increment most significant word +// sw x31,4(x29) // store into most significant word of MTIMECMP +// nowrap: +// sw x28, 0(x29) // store into least significant word of MTIMECMP +// loop: j loop // wait until interrupt occurs +// .endm -.macro CAUSE_SOFT_INTERRUPT - la x28, 0x02000000 // MSIP register in CLINT - li x29, 1 // 1 in the lsb - sw x29, 0(x28) // Write MSIP bit -.endm +// .macro CAUSE_SOFT_INTERRUPT +// la x28, 0x02000000 // MSIP register in CLINT +// li x29, 1 // 1 in the lsb +// sw x29, 0(x28) // Write MSIP bit +// .endm -.macro CAUSE_EXT_INTERRUPT - li x28, 0x10060000 // load base GPIO memory location - li x29, 0x1 - sw x29, 8(x28) // enable the first pin as an output - sw x29, 28(x28) // set first pin to high interrupt enable - sw x29, 40(x28) // write a 1 to the first output pin (cause interrupt) -.endm +// .macro CAUSE_EXT_INTERRUPT +// li x28, 0x10060000 // load base GPIO memory location +// li x29, 0x1 +// sw x29, 8(x28) // enable the first pin as an output +// sw x29, 28(x28) // set first pin to high interrupt enable +// sw x29, 40(x28) // write a 1 to the first output pin (cause interrupt) +// .endm .macro END_TESTS // invokes one final ecall to return to machine mode then terminates this program, so the output is diff --git a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/WALLY-trap-01.S b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/WALLY-trap-01.S index be1ca650..45d34c34 100644 --- a/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/WALLY-trap-01.S +++ b/tests/wally-riscv-arch-test/riscv-test-suite/rv64i_m/privilege/src/WALLY-trap-01.S @@ -25,50 +25,50 @@ INIT_TESTS +CAUSE_TRAP_TRIGGERS // initialize code that will cause traps for consistent mtval addresses + TRAP_HANDLER m, DEBUG=1 // turn on recording mtval and status bits on traps li x28, 0x8 csrs mstatus, x28 // set mstatus.MIE bit to 1 -// WRITE_READ_CSR mie, 0xFFFF *** commented out until I can get the trap handler (and spike for time interrupts) to work correctly with interrupts +WRITE_READ_CSR mie, 0xFFF // Enable interrupts from all sources // *** commented out until I can get the trap handler (and spike for time interrupts) to work correctly with interrupts // test 5.3.1.4 Basic trap tests -// CAUSE_INSTR_ADDR_MISALIGNED //skipped becuase this exception may be impossible when compressed instructions are enabled) -CAUSE_INSTR_ACCESS -CAUSE_ILLEGAL_INSTR -CAUSE_BREAKPNT -CAUSE_LOAD_ADDR_MISALIGNED -CAUSE_LOAD_ACC -CAUSE_STORE_ADDR_MISALIGNED -CAUSE_STORE_ACC +// jal cause_instr_addr_misaligned //skipped becuase this exception may be impossible when compressed instructions are enabled) +jal cause_instr_access +jal cause_illegal_instr +jal cause_breakpnt +jal cause_load_addr_misaligned +jal cause_load_acc +jal cause_store_addr_misaligned +jal cause_store_acc GOTO_U_MODE // Causes M mode ecall GOTO_S_MODE // Causes U mode ecall GOTO_M_MODE // Causes S mode ecall -// CAUSE_TIME_INTERRUPT *** intentionally causing this trap seems difficult in spike. although it is possible for it to accidentally happen. -// CAUSE_SOFT_INTERRUPT *** exiting out of the trap handler after these is current;y broken -// CAUSE_EXT_INTERRUPT +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_ext_interrupt // 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 mideleg, 0xFFFFFFFFFFFFFFFF -// CAUSE_INSTR_ADDR_MISALIGNED //skipped becuase this exception may be impossible when compressed instructions are enabled) -CAUSE_INSTR_ACCESS -CAUSE_ILLEGAL_INSTR -CAUSE_BREAKPNT -CAUSE_LOAD_ADDR_MISALIGNED -CAUSE_LOAD_ACC -CAUSE_STORE_ADDR_MISALIGNED -CAUSE_STORE_ACC -CAUSE_ECALL // M mode ecall -// GOTO_U_MODE // leave these untested since we only need to ensure that from M mode are not delegated -// GOTO_S_MODE +// jal cause_instr_addr_misaligned //skipped becuase this exception may be impossible when compressed instructions are enabled) +jal cause_instr_access +jal cause_illegal_instr +jal cause_breakpnt +jal cause_load_addr_misaligned +jal cause_load_acc +jal cause_store_addr_misaligned +jal cause_store_acc +jal cause_ecall // M mode ecall -// CAUSE_TIME_INTERRUPT *** intentionally causing this trap seems difficult in spike. although it is possible for it to accidentally happen. -// CAUSE_SOFT_INTERRUPT *** exiting out of the trap handler after these is current;y broken -// CAUSE_EXT_INTERRUPT +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_ext_interrupt END_TESTS From 62a330c290a907054d65abfb2dff45d08602125e Mon Sep 17 00:00:00 2001 From: Skylar Litz Date: Sat, 26 Mar 2022 21:28:32 +0000 Subject: [PATCH 06/20] update to match new filesystem organization --- pipelined/regression/buildrootBugFinder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelined/regression/buildrootBugFinder.py b/pipelined/regression/buildrootBugFinder.py index b6639e71..89a838d2 100755 --- a/pipelined/regression/buildrootBugFinder.py +++ b/pipelined/regression/buildrootBugFinder.py @@ -4,7 +4,7 @@ import sys, os, subprocess def main(): maxGoodCount = 400e6 # num instrs that execute sucessfully starting from 0 currInstrCount = maxGoodCount - linuxTestvectors = "../../tests/linux-testgen/linux-testvectors" + linuxTestvectors = "/opt/riscv/linux-testvectors" if not os.path.exists(linuxTestvectors): sys.stderr.write("Error: Linux testvectors not found at "+linuxTestvectors+"\n") exit(1) @@ -22,7 +22,7 @@ def main(): break checkpoint = checkpointList[0] logFile = logDir+"checkpoint"+str(checkpoint)+".log" - runCommand="{\nvsim -c < Date: Sat, 26 Mar 2022 21:28:57 +0000 Subject: [PATCH 07/20] add AtemptedInstructionCount signal --- pipelined/regression/linux-wave.do | 4 +--- pipelined/testbench/testbench-linux.sv | 6 ++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pipelined/regression/linux-wave.do b/pipelined/regression/linux-wave.do index 1d59dcbf..770b3d34 100644 --- a/pipelined/regression/linux-wave.do +++ b/pipelined/regression/linux-wave.do @@ -4,6 +4,7 @@ add wave -noupdate /testbench/clk add wave -noupdate /testbench/reset add wave -noupdate /testbench/reset_ext add wave -noupdate -radix unsigned /testbench/InstrCountW +add wave -noupdate -radix unsigned /testbench/AttemptedInstructionCount add wave -noupdate /testbench/dut/core/SATP_REGW add wave -noupdate /testbench/dut/core/IllegalFPUInstrD add wave -noupdate -group HDU -expand -group hazards /testbench/dut/core/hzu/BPPredWrongE @@ -388,7 +389,6 @@ add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/cor add wave -noupdate -expand -group lsu -expand -group ptwalker /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/PTE add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/ITLBMissF add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/ITLBMissOrDAFaultF -add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/DTLBMissM add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/ITLBWriteF add wave -noupdate -expand -group lsu -expand -group ptwalker -expand -group types /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/DTLBWriteM add wave -noupdate -group AHB -color Gold /testbench/dut/core/ebu/BusState @@ -526,9 +526,7 @@ add wave -noupdate /testbench/dut/core/ifu/SpillSupport/spillsupport/TakeSpillF add wave -noupdate /testbench/dut/core/ifu/SpillSupport/spillsupport/SpillF add wave -noupdate /testbench/dut/core/ifu/SpillSupport/spillsupport/IFUCacheBusStallF add wave -noupdate -color Yellow /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/DAPageFault -add wave -noupdate /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/OtherPageFault add wave -noupdate /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/ITLBMissF -add wave -noupdate /testbench/dut/core/lsu/VIRTMEM_SUPPORTED/lsuvirtmem/hptw/Accessed add wave -noupdate /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/WriteAccess add wave -noupdate /testbench/dut/core/lsu/dmmu/dmmu/tlb/tlb/tlbcontrol/TLBPageFault TreeUpdate [SetDefaultTree] diff --git a/pipelined/testbench/testbench-linux.sv b/pipelined/testbench/testbench-linux.sv index 12950b63..da623315 100644 --- a/pipelined/testbench/testbench-linux.sv +++ b/pipelined/testbench/testbench-linux.sv @@ -176,6 +176,7 @@ module testbench; integer CheckMIPFutureM; integer CheckSIPFutureE; integer CheckSIPFutureM; + logic [`XLEN-1:0] AttemptedInstructionCount; // Useful Aliases `define RF dut.core.ieu.dp.regf.rf `define PC dut.core.ifu.pcreg.q @@ -380,11 +381,13 @@ module testbench; traceFileM = $fopen({testvectorDir,"all.txt"}, "r"); traceFileE = $fopen({testvectorDir,"all.txt"}, "r"); InstrCountW = '0; + AttemptedInstructionCount = '0; end else begin // checkpoint //$readmemh({checkpointDir,"ram.txt"}, dut.uncore.ram.ram.RAM); traceFileE = $fopen({checkpointDir,"all.txt"}, "r"); traceFileM = $fopen({checkpointDir,"all.txt"}, "r"); InstrCountW = CHECKPOINT; + AttemptedInstructionCount = CHECKPOINT; // manual checkpoint initializations that don't neatly fit into MACRO force {`STATUS_TSR,`STATUS_TW,`STATUS_TVM,`STATUS_MXR,`STATUS_SUM,`STATUS_MPRV} = initMSTATUS[0][22:17]; force {`STATUS_FS,`STATUS_MPP} = initMSTATUS[0][14:11]; @@ -440,6 +443,9 @@ module testbench; for(index``STAGE = 0; index``STAGE < line``STAGE.len(); index``STAGE++) begin \ //$display("char = %s", line``STAGE[index]); \ if (line``STAGE[index``STAGE] == " " | line``STAGE[index``STAGE] == "\n") begin \ + if (line``STAGE[index``STAGE] == "\n" & `"STAGE`"=="M") begin \ + AttemptedInstructionCount += 1; \ + end \ EndIndex``STAGE = index``STAGE; \ ExpectedTokens``STAGE[TokenIndex``STAGE] = line``STAGE.substr(StartIndex``STAGE, EndIndex``STAGE-1); \ //$display("In Tokenizer %s", line``STAGE.substr(StartIndex, EndIndex-1)); \ From 8d5c231a13ff385ffca6ebde22ed136cafc29092 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 27 Mar 2022 15:11:36 -0700 Subject: [PATCH 08/20] change devicetree to expect only 128MB of RAM --- linux/devicetree/wally-virt.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/devicetree/wally-virt.dts b/linux/devicetree/wally-virt.dts index f35848c5..6d795585 100644 --- a/linux/devicetree/wally-virt.dts +++ b/linux/devicetree/wally-virt.dts @@ -15,7 +15,7 @@ memory@80000000 { device_type = "memory"; - reg = <0x00 0x80000000 0x00 0x8000000>; + reg = <0x00 0x80000000 0x00 0x08000000>; }; cpus { From 800bc855194096dc02b952378e9bd5ecff94d226 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 27 Mar 2022 15:13:03 -0700 Subject: [PATCH 09/20] refactored buildroot configuration --- .../{ => wally}/busybox.config | 0 .../{ => wally}/linux.config | 0 .../{ => wally}/main.config | 12 +++--- .../wally/rootfs_overlay/.profile | 37 +++++++++++++++++ .../wally/rootfs_overlay/etc/inittab | 41 +++++++++++++++++++ 5 files changed, 84 insertions(+), 6 deletions(-) rename linux/buildroot-config-src/{ => wally}/busybox.config (100%) rename linux/buildroot-config-src/{ => wally}/linux.config (100%) rename linux/buildroot-config-src/{ => wally}/main.config (99%) create mode 100644 linux/buildroot-config-src/wally/rootfs_overlay/.profile create mode 100644 linux/buildroot-config-src/wally/rootfs_overlay/etc/inittab diff --git a/linux/buildroot-config-src/busybox.config b/linux/buildroot-config-src/wally/busybox.config similarity index 100% rename from linux/buildroot-config-src/busybox.config rename to linux/buildroot-config-src/wally/busybox.config diff --git a/linux/buildroot-config-src/linux.config b/linux/buildroot-config-src/wally/linux.config similarity index 100% rename from linux/buildroot-config-src/linux.config rename to linux/buildroot-config-src/wally/linux.config diff --git a/linux/buildroot-config-src/main.config b/linux/buildroot-config-src/wally/main.config similarity index 99% rename from linux/buildroot-config-src/main.config rename to linux/buildroot-config-src/wally/main.config index bcdd727f..7e5f68df 100644 --- a/linux/buildroot-config-src/main.config +++ b/linux/buildroot-config-src/wally/main.config @@ -8,6 +8,7 @@ BR2_HOST_GCC_AT_LEAST_5=y BR2_HOST_GCC_AT_LEAST_6=y BR2_HOST_GCC_AT_LEAST_7=y BR2_HOST_GCC_AT_LEAST_8=y +BR2_HOST_GCC_AT_LEAST_9=y # # Target options @@ -87,7 +88,7 @@ BR2_BZCAT="bzcat" BR2_XZCAT="xzcat" BR2_LZCAT="lzip -d -c" BR2_TAR_OPTIONS="" -BR2_DEFCONFIG="./configs/wally-qemu_riscv64_virt_defconfig" +BR2_DEFCONFIG="./board/wally/main.config" BR2_DL_DIR="$(TOPDIR)/dl" BR2_HOST_DIR="$(BASE_DIR)/host" @@ -406,11 +407,10 @@ BR2_GENERATE_LOCALE="" # BR2_SYSTEM_ENABLE_NLS is not set # BR2_TARGET_TZ_INFO is not set BR2_ROOTFS_USERS_TABLES="" -BR2_ROOTFS_OVERLAY="" +BR2_ROOTFS_OVERLAY="./board/wally/rootfs_overlay" BR2_ROOTFS_POST_BUILD_SCRIPT="" BR2_ROOTFS_POST_FAKEROOT_SCRIPT="" -BR2_ROOTFS_POST_IMAGE_SCRIPT="board/qemu/post-image.sh" -BR2_ROOTFS_POST_SCRIPT_ARGS="$(BR2_DEFCONFIG)" +BR2_ROOTFS_POST_IMAGE_SCRIPT="" # # Kernel @@ -430,7 +430,7 @@ BR2_LINUX_KERNEL_PATCH="" # BR2_LINUX_KERNEL_USE_DEFCONFIG is not set # BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG is not set BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y -BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="./linux.config" +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="./board/wally/linux.config" BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="" BR2_LINUX_KERNEL_CUSTOM_LOGO_PATH="" BR2_LINUX_KERNEL_IMAGE=y @@ -473,7 +473,7 @@ BR2_LINUX_KERNEL_GZIP=y # Target packages # BR2_PACKAGE_BUSYBOX=y -BR2_PACKAGE_BUSYBOX_CONFIG="./busybox.config" +BR2_PACKAGE_BUSYBOX_CONFIG="./board/wally/busybox.config" BR2_PACKAGE_BUSYBOX_CONFIG_FRAGMENT_FILES="" # BR2_PACKAGE_BUSYBOX_SHOW_OTHERS is not set # BR2_PACKAGE_BUSYBOX_INDIVIDUAL_BINARIES is not set diff --git a/linux/buildroot-config-src/wally/rootfs_overlay/.profile b/linux/buildroot-config-src/wally/rootfs_overlay/.profile new file mode 100644 index 00000000..65dccfef --- /dev/null +++ b/linux/buildroot-config-src/wally/rootfs_overlay/.profile @@ -0,0 +1,37 @@ +echo "Hello this ~/.profile is meant to demonstrate running some basic commands on Wally." +echo "I am $(whoami)" +echo "And I am on $(hostname)" +touch myFile.txt +echo "This is a line of text." > myFile.txt +echo "A second line of text." >> myFile.txt +mkdir myDir +mv myFile.txt myDir +echo "Created myFile.txt and moved it to myDir. It contains:" +cat myDir/myFile.txt +touch myScript.sh +echo "echo \"Hello this is another example script\"" > myScript.sh +chmod +x myScript.sh +echo "Created myScript.sh. Running it yields:" +./myScript.sh +cd myDir +ln -s ../myScript.sh symLinkToMyScript.sh +echo "Created symLinkToMyScript.sh. Running it yields:" +./symLinkToMyScript.sh +ln ../myScript.sh hardLinkToMyScript.sh +echo "Created hardLinkToMyScript.sh. Running it yields:" +./hardLinkToMyScript.sh +echo "Now let\'s remove all these example files and scripts" +cd / +rm -r myDir +rm myScript.sh +echo "Here is disk usage:" +df -h +echo "And here are the current processes:" +ps +echo "We can create a user." +cd / +mkdir home +echo "password\npassword\n" | adduser myUser +su -c "cd ~; echo \"I am $(whoami) (a new user) and my home directory is $(pwd)\"" +echo "And finally a login prompt." +login diff --git a/linux/buildroot-config-src/wally/rootfs_overlay/etc/inittab b/linux/buildroot-config-src/wally/rootfs_overlay/etc/inittab new file mode 100644 index 00000000..7ae8de33 --- /dev/null +++ b/linux/buildroot-config-src/wally/rootfs_overlay/etc/inittab @@ -0,0 +1,41 @@ +# /etc/inittab +# +# Copyright (C) 2001 Erik Andersen +# +# Note: BusyBox init doesn't support runlevels. The runlevels field is +# completely ignored by BusyBox init. If you want runlevels, use +# sysvinit. +# +# Format for each entry: ::: +# +# id == tty to run on, or empty for /dev/console +# runlevels == ignored +# action == one of sysinit, respawn, askfirst, wait, and once +# process == program to run + +# Startup the system +::sysinit:/bin/mount -t proc proc /proc +::sysinit:/bin/mount -o remount,rw / +::sysinit:/bin/mkdir -p /dev/pts /dev/shm +::sysinit:/bin/mount -a +::sysinit:/sbin/swapon -a +null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd +null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin +null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout +null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr +::sysinit:/bin/hostname -F /etc/hostname +# now run any rc scripts +::sysinit:/etc/init.d/rcS + +# (commented out) Put a getty on the serial port +#console::respawn:/sbin/getty -L console 0 vt100 # GENERIC_SERIAL +# Actually no, let's automatically login +console::respawn:-/bin/sh + +# Stuff to do for the 3-finger salute +#::ctrlaltdel:/sbin/reboot + +# Stuff to do before rebooting +::shutdown:/etc/init.d/rcK +::shutdown:/sbin/swapoff -a +::shutdown:/bin/umount -a -r From 4e1b50e50c73869869f9633534cc7fbb7e0081ae Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 27 Mar 2022 19:05:44 -0700 Subject: [PATCH 10/20] fix parseGDBtoTrace.py to expect the CSRs that QEMU actually prints out --- linux/testvector-generation/parseGDBtoTrace.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linux/testvector-generation/parseGDBtoTrace.py b/linux/testvector-generation/parseGDBtoTrace.py index 412db5bb..97145a35 100755 --- a/linux/testvector-generation/parseGDBtoTrace.py +++ b/linux/testvector-generation/parseGDBtoTrace.py @@ -138,9 +138,9 @@ if len(sys.argv) != 2: sys.exit('Error parseGDBtoTrace.py expects 1 arg:\n >') interruptFname = sys.argv[1] # reg number -RegNumber = {'zero': 0, 'ra': 1, 'sp': 2, 'gp': 3, 'tp': 4, 't0': 5, 't1': 6, 't2': 7, 's0': 8, 's1': 9, 'a0': 10, 'a1': 11, 'a2': 12, 'a3': 13, 'a4': 14, 'a5': 15, 'a6': 16, 'a7': 17, 's2': 18, 's3': 19, 's4': 20, 's5': 21, 's6': 22, 's7': 23, 's8': 24, 's9': 25, 's10': 26, 's11': 27, 't3': 28, 't4': 29, 't5': 30, 't6': 31, 'mhartid': 32, 'mstatus': 33, 'mip': 34, 'mie': 35, 'mideleg': 36, 'medeleg': 37, 'mtvec': 38, 'stvec': 39, 'mepc': 40, 'sepc': 41, 'mcause': 42, 'scause': 43, 'mtval': 44, 'stval': 45, 'sstatus': 46, 'sip': 47, 'sie': 48} +RegNumber = {'zero': 0, 'ra': 1, 'sp': 2, 'gp': 3, 'tp': 4, 't0': 5, 't1': 6, 't2': 7, 's0': 8, 's1': 9, 'a0': 10, 'a1': 11, 'a2': 12, 'a3': 13, 'a4': 14, 'a5': 15, 'a6': 16, 'a7': 17, 's2': 18, 's3': 19, 's4': 20, 's5': 21, 's6': 22, 's7': 23, 's8': 24, 's9': 25, 's10': 26, 's11': 27, 't3': 28, 't4': 29, 't5': 30, 't6': 31, 'mhartid': 32, 'mstatus': 33, 'mip': 34, 'mie': 35, 'mideleg': 36, 'medeleg': 37, 'mtvec': 38, 'stvec': 39, 'mepc': 40, 'sepc': 41, 'mcause': 42, 'scause': 43, 'mtval': 44, 'stval': 45, 'mscratch': 46, 'sscratch': 47, 'satp': 48} # initial state -CurrentInstr = ['0', '0', None, 'other', {'zero': 0, 'ra': 0, 'sp': 0, 'gp': 0, 'tp': 0, 't0': 0, 't1': 0, 't2': 0, 's0': 0, 's1': 0, 'a0': 0, 'a1': 0, 'a2': 0, 'a3': 0, 'a4': 0, 'a5': 0, 'a6': 0, 'a7': 0, 's2': 0, 's3': 0, 's4': 0, 's5': 0, 's6': 0, 's7': 0, 's8': 0, 's9': 0, 's10': 0, 's11': 0, 't3': 0, 't4': 0, 't5': 0, 't6': 0, 'mhartid': 0, 'mstatus': 0, 'mip': 0, 'mie': 0, 'mideleg': 0, 'medeleg': 0, 'mtvec': 0, 'stvec': 0, 'mepc': 0, 'sepc': 0, 'mcause': 0, 'scause': 0, 'mtval': 0, 'stval': 0, 'sstatus': 0, 'sip': 0, 'sie': 0}, {}, None, None, None] +CurrentInstr = ['0', '0', None, 'other', {'zero': 0, 'ra': 0, 'sp': 0, 'gp': 0, 'tp': 0, 't0': 0, 't1': 0, 't2': 0, 's0': 0, 's1': 0, 'a0': 0, 'a1': 0, 'a2': 0, 'a3': 0, 'a4': 0, 'a5': 0, 'a6': 0, 'a7': 0, 's2': 0, 's3': 0, 's4': 0, 's5': 0, 's6': 0, 's7': 0, 's8': 0, 's9': 0, 's10': 0, 's11': 0, 't3': 0, 't4': 0, 't5': 0, 't6': 0, 'mhartid': 0, 'mstatus': 0, 'mip': 0, 'mie': 0, 'mideleg': 0, 'medeleg': 0, 'mtvec': 0, 'stvec': 0, 'mepc': 0, 'sepc': 0, 'mcause': 0, 'scause': 0, 'mtval': 0, 'stval': 0, 'mscratch': 0, 'sscratch': 0, 'satp': 0}, {}, None, None, None] #with open (InputFile, 'r') as InputFileFP: #lines = InputFileFP.readlines() From 9b5bbd29b4f3f0a25c76fd64050493bee9dc5308 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 27 Mar 2022 19:16:39 -0700 Subject: [PATCH 11/20] change genCheckpoint.sh to only log 128MB of RAM --- linux/testvector-generation/genCheckpoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/testvector-generation/genCheckpoint.sh b/linux/testvector-generation/genCheckpoint.sh index dea4d555..4ac47882 100755 --- a/linux/testvector-generation/genCheckpoint.sh +++ b/linux/testvector-generation/genCheckpoint.sh @@ -109,7 +109,7 @@ then x/1xw 0x0C201000 set logging off shell echo \"GDB storing RAM to $rawRamFile\" - dump binary memory $rawRamFile 0x80000000 0xffffffff + dump binary memory $rawRamFile 0x80000000 0x07ffffff kill q end_of_script From 501dc7cd68acee7625909a7c65afbf4a2d0bdc96 Mon Sep 17 00:00:00 2001 From: bbracker Date: Sun, 27 Mar 2022 20:54:59 -0700 Subject: [PATCH 12/20] fix genCheckpoint.sh binary memory dump --- linux/testvector-generation/genCheckpoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/testvector-generation/genCheckpoint.sh b/linux/testvector-generation/genCheckpoint.sh index 4ac47882..447377b3 100755 --- a/linux/testvector-generation/genCheckpoint.sh +++ b/linux/testvector-generation/genCheckpoint.sh @@ -109,7 +109,7 @@ then x/1xw 0x0C201000 set logging off shell echo \"GDB storing RAM to $rawRamFile\" - dump binary memory $rawRamFile 0x80000000 0x07ffffff + dump binary memory $rawRamFile 0x80000000 0x87ffffff kill q end_of_script From eb337fd3e1fd115fbc57c38e941bf738d8df575d Mon Sep 17 00:00:00 2001 From: Kip Macsai-Goren Date: Mon, 28 Mar 2022 19:11:45 +0000 Subject: [PATCH 13/20] added test config that doesn't use compressed instructions for privileged tests --- pipelined/regression/regression-wally | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/pipelined/regression/regression-wally b/pipelined/regression/regression-wally index c638ed3c..a5535b49 100755 --- a/pipelined/regression/regression-wally +++ b/pipelined/regression/regression-wally @@ -70,7 +70,7 @@ for test in tests64gc: cmd="vsim > {} -c < {} -c < {} -c < Date: Mon, 28 Mar 2022 19:12:22 +0000 Subject: [PATCH 14/20] fixed double multiplication on vectored interrupts --- pipelined/src/privileged/trap.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelined/src/privileged/trap.sv b/pipelined/src/privileged/trap.sv index 15c1e9e6..b2d6fea9 100644 --- a/pipelined/src/privileged/trap.sv +++ b/pipelined/src/privileged/trap.sv @@ -102,7 +102,7 @@ module trap ( if(`VECTORED_INTERRUPTS_SUPPORTED) begin:vec always_comb if (PrivilegedTrapVector[1:0] == 2'b01 & CauseM[`XLEN-1] == 1) - PrivilegedVectoredTrapVector = {PrivilegedTrapVector[`XLEN-1:2] + {CauseM[`XLEN-5:0], 2'b00}, 2'b00}; + PrivilegedVectoredTrapVector = {PrivilegedTrapVector[`XLEN-1:2] + CauseM[`XLEN-5:0], 2'b00}; else PrivilegedVectoredTrapVector = {PrivilegedTrapVector[`XLEN-1:2], 2'b00}; end From a5c32898a0d1b4da70b3f9ce5310c21237e497ff Mon Sep 17 00:00:00 2001 From: bbracker Date: Mon, 28 Mar 2022 13:40:50 -0700 Subject: [PATCH 15/20] checkpointSweep is bash-specific, so add shebang to make it so --- linux/testvector-generation/checkpointSweep.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/linux/testvector-generation/checkpointSweep.sh b/linux/testvector-generation/checkpointSweep.sh index c1543677..075ca253 100755 --- a/linux/testvector-generation/checkpointSweep.sh +++ b/linux/testvector-generation/checkpointSweep.sh @@ -1,4 +1,5 @@ -for index in {450..500} +#!/bin/bash +for index in {450..500}; do instrs=$(($index*1000000)) echo "y" | nice -n 5 ./genCheckpoint.sh $instrs From 8ea25e591b2727f58fc9b61caabee73b3ea5e22f Mon Sep 17 00:00:00 2001 From: bbracker Date: Mon, 28 Mar 2022 15:39:29 -0700 Subject: [PATCH 16/20] fix typo that Madeleine found --- pipelined/src/wally/wallypipelinedcore.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelined/src/wally/wallypipelinedcore.sv b/pipelined/src/wally/wallypipelinedcore.sv index 80438987..dd07949b 100644 --- a/pipelined/src/wally/wallypipelinedcore.sv +++ b/pipelined/src/wally/wallypipelinedcore.sv @@ -182,7 +182,7 @@ module wallypipelinedcore ( // Mem .RetM, .TrapM, .PrivilegedNextPCM, .InvalidateICacheM, - .InstrD, .InstrM, . PCM, .InstrClassM, .BPPredDirWrongM, + .InstrD, .InstrM, .PCM, .InstrClassM, .BPPredDirWrongM, .BTBPredPCWrongM, .RASPredPCWrongM, .BPPredClassNonCFIWrongM, // Writeback From a6d90a25c2ebc45439598796e2e2ea3bd6bc1a2f Mon Sep 17 00:00:00 2001 From: Kip Macsai-Goren Date: Tue, 29 Mar 2022 02:15:17 +0000 Subject: [PATCH 17/20] fixed signature location of the new periph with no compressed instructions --- pipelined/testbench/tests.vh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelined/testbench/tests.vh b/pipelined/testbench/tests.vh index 687878bc..1d1a7fd6 100644 --- a/pipelined/testbench/tests.vh +++ b/pipelined/testbench/tests.vh @@ -1479,7 +1479,7 @@ string imperas32f[] = '{ string wally64periph[] = '{ `WALLYTEST, - "rv64i_m/privilege/WALLY-PERIPH", "22f0" + "rv64i_m/privilege/WALLY-PERIPH", "3310" }; string wally32e[] = '{ From 56a0542405874e8a4bcfcb0c612486ffcff6012d Mon Sep 17 00:00:00 2001 From: Kip Macsai-Goren Date: Tue, 29 Mar 2022 02:26:42 +0000 Subject: [PATCH 18/20] made machine timer bit of IP registers unwriteable so it can only change when the interrupt actually changes --- pipelined/src/privileged/csri.sv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pipelined/src/privileged/csri.sv b/pipelined/src/privileged/csri.sv index b9a302d2..16d084f8 100644 --- a/pipelined/src/privileged/csri.sv +++ b/pipelined/src/privileged/csri.sv @@ -94,8 +94,8 @@ module csri #(parameter // restricted views of registers // Add ExtIntM read-only signal - assign IP_REGW = {ExtIntM,1'b0,ExtIntS,9'b0} | {2'b0,IP_REGW_writeable}; - + assign IP_REGW = {ExtIntM,1'b0,ExtIntS,1'b0, IntInM[7], 7'b0} | {2'b0, IP_REGW_writeable[9], 3'b0, IP_REGW_writeable[5], 3'b0, IP_REGW_writeable[1], 1'b0}; // *** This is just to force the Machine level bits of IP to be unwriteable and to only come from intInM. PLEASE CHANGE ME!!! + // Machine Mode assign MIP_REGW = IP_REGW; assign MIE_REGW = IE_REGW; From c4f2c6b1100c10e15e9aa1cd08349a824d3897c9 Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 29 Mar 2022 17:11:28 +0000 Subject: [PATCH 19/20] fpu compare simplification, minor cleanup --- .../build/Linux-x86_64-GCC/softfloat.a | Bin 514606 -> 513510 bytes addins/embench-iot | 2 +- addins/riscv-arch-test | 2 +- addins/riscv-dv | 2 +- addins/riscv-tests | 2 +- pipelined/src/fpu/fcmp.sv | 68 ++++++++---------- pipelined/src/ifu/BTBPredictor.sv | 1 + pipelined/src/lsu/swbytemask.sv | 2 +- pipelined/src/privileged/trap.sv | 2 +- synthDC/hdl/wally-shared.vh | 43 ++++++++++- 10 files changed, 76 insertions(+), 48 deletions(-) diff --git a/addins/SoftFloat-3e/build/Linux-x86_64-GCC/softfloat.a b/addins/SoftFloat-3e/build/Linux-x86_64-GCC/softfloat.a index b4466d620c87eb2f27cca4ea509da998f57c5a2b..442544836bc5c22fe7bfc3bbe1541edbac4d77ad 100644 GIT binary patch literal 513510 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

pqEIRN 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

*C13ajKJ_vM>$2y78?mk` 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μ2J5Ihf-Y;;|-M!xL&Dm27_0`p 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 J5l$By{eSLk`= or = Y - - // X is less than Y: - // Signs: - // X Y answer - // pos pos idk - keep checking - // pos neg no - // neg pos yes - // neg neg idk - keep checking - // Exponent - // - if XExp < YExp - // - if negitive - no - // - if positive - yes - // - otherwise keep checking - // Mantissa - // - XMan < YMan then - // - if negitive - no - // - if positive - yes - // note: LT does -0 < 0 - //*** compare Exp and Man together - assign LT = XSgnE^YSgnE ? XSgnE : XExpE==YExpE ? ((XManE or = Y + logic BothZeroE, EitherNaNE, EitherSNaNE; + + assign LTabs= {1'b0, XExpE, XManE} < {1'b0, YExpE, YManE}; // unsigned comparison, treating FP as integers + assign LT = (XSgnE & ~YSgnE) | (XSgnE & YSgnE & ~LTabs & ~EQ) | (~XSgnE & ~YSgnE & LTabs); + //assign LT = $signed({XSgnE, XExpE, XManE[`NF-1:0]}) < $signed({YSgnE, YExpE, YManE[`NF-1:0]}); + //assign LT = XInt < YInt; +// assign LT = XSgnE^YSgnE ? XSgnE : XExpE==YExpE ? ((XManE Date: Tue, 29 Mar 2022 20:45:09 +0000 Subject: [PATCH 20/20] fixed arch bge test signature output location after update --- pipelined/testbench/tests.vh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelined/testbench/tests.vh b/pipelined/testbench/tests.vh index 1d1a7fd6..81cc0628 100644 --- a/pipelined/testbench/tests.vh +++ b/pipelined/testbench/tests.vh @@ -959,7 +959,7 @@ string imperas32f[] = '{ "rv64i_m/I/andi-01", "6010", "rv64i_m/I/auipc-01", "2010", "rv64i_m/I/beq-01", "47010", - "rv64i_m/I/bge-01", "47010", + "rv64i_m/I/bge-01", "46010", "rv64i_m/I/bgeu-01", "56010", "rv64i_m/I/blt-01", "4d010", "rv64i_m/I/bltu-01", "57010",