forked from Github_Repos/cvw
* GPIO comprehensive testing
* MEPC more aware if M stage has actually committed * UART interrupt testing progress * UART added read IIR side effect of lowering THRE intr
This commit is contained in:
parent
ad3b103a86
commit
e7e4105931
@ -30,7 +30,7 @@
|
||||
// *** Ross Thompson amo misalignment check?
|
||||
module dmem (
|
||||
input logic clk, reset,
|
||||
input logic StallW, FlushW,
|
||||
input logic StallM, FlushM, StallW, FlushW,
|
||||
//output logic DataStall,
|
||||
// Memory Stage
|
||||
input logic [1:0] MemRWM,
|
||||
@ -39,10 +39,12 @@ module dmem (
|
||||
//input logic [`XLEN-1:0] ReadDataW,
|
||||
input logic [`XLEN-1:0] WriteDataM,
|
||||
input logic [1:0] AtomicM,
|
||||
input logic CommitM,
|
||||
output logic [`XLEN-1:0] MemPAdrM,
|
||||
output logic MemReadM, MemWriteM,
|
||||
output logic [1:0] AtomicMaskedM,
|
||||
output logic DataMisalignedM,
|
||||
output logic CommittedM,
|
||||
// Writeback Stage
|
||||
input logic MemAckW,
|
||||
input logic [`XLEN-1:0] ReadDataW,
|
||||
@ -63,11 +65,11 @@ module dmem (
|
||||
output logic DTLBMissM, DTLBHitM
|
||||
);
|
||||
|
||||
logic SquashSCM;
|
||||
logic DTLBPageFaultM;
|
||||
logic MemAccessM;
|
||||
|
||||
logic SquashSCM;
|
||||
logic DTLBPageFaultM;
|
||||
logic MemAccessM;
|
||||
logic [1:0] CurrState, NextState;
|
||||
logic preCommittedM;
|
||||
|
||||
localparam STATE_READY = 0;
|
||||
localparam STATE_FETCH = 1;
|
||||
@ -104,6 +106,11 @@ module dmem (
|
||||
assign AtomicMaskedM = CurrState != STATE_STALLED ? AtomicM : 2'b00 ;
|
||||
assign MemAccessM = |MemRWM;
|
||||
|
||||
// Determine if M stage committed
|
||||
// Reset whenever unstalled. Set when access successfully occurs
|
||||
flopr #(1) committedMreg(clk,reset,(CommittedM | CommitM) & StallM,preCommittedM);
|
||||
assign CommittedM = preCommittedM | CommitM;
|
||||
|
||||
// Determine if address is valid
|
||||
assign LoadMisalignedFaultM = DataMisalignedM & MemRWM[1];
|
||||
assign LoadAccessFaultM = DataAccessFaultM & MemRWM[1];
|
||||
|
@ -81,7 +81,7 @@ module ahblite (
|
||||
output logic HWRITED,
|
||||
// Stalls
|
||||
output logic /*InstrUpdate, */DataStall,
|
||||
output logic MemAckW
|
||||
output logic CommitM, MemAckW
|
||||
);
|
||||
|
||||
logic GrantData;
|
||||
@ -190,6 +190,8 @@ module ahblite (
|
||||
|
||||
assign InstrRData = HRDATA;
|
||||
assign InstrAckF = (BusState == INSTRREAD) && (NextBusState != INSTRREAD);
|
||||
assign CommitM = (BusState == MEMREAD) || (BusState == MEMWRITE) || (BusState == ATOMICREAD) || (BusState == ATOMICWRITE);
|
||||
// *** Bracker 6/5/21: why is this W stage?
|
||||
assign MemAckW = (BusState == MEMREAD) && (NextBusState != MEMREAD) || (BusState == MEMWRITE) && (NextBusState != MEMWRITE) ||
|
||||
((BusState == ATOMICREAD) && (NextBusState != ATOMICREAD)) || ((BusState == ATOMICWRITE) && (NextBusState != ATOMICWRITE));
|
||||
assign MMUReadPTE = HRDATA;
|
||||
|
@ -28,7 +28,7 @@
|
||||
|
||||
module privileged (
|
||||
input logic clk, reset,
|
||||
input logic FlushW,
|
||||
input logic FlushD, FlushE, FlushM, FlushW, StallD, StallW, StallE, StallM,
|
||||
input logic CSRReadM, CSRWriteM,
|
||||
input logic [`XLEN-1:0] SrcAM,
|
||||
input logic [`XLEN-1:0] PCF,PCD,PCE,PCM,
|
||||
@ -37,7 +37,8 @@ module privileged (
|
||||
output logic [`XLEN-1:0] PrivilegedNextPCM,
|
||||
output logic RetM, TrapM, NonBusTrapM,
|
||||
output logic ITLBFlushF, DTLBFlushM,
|
||||
input logic InstrValidM,InstrValidW, FloatRegWriteW, LoadStallD,
|
||||
input logic InstrValidM,InstrValidW, CommittedM,
|
||||
input logic FloatRegWriteW, LoadStallD,
|
||||
input logic BPPredDirWrongM,
|
||||
input logic BTBPredPCWrongM,
|
||||
input logic RASPredPCWrongM,
|
||||
@ -57,8 +58,6 @@ module privileged (
|
||||
output logic [`XLEN-1:0] SATP_REGW,
|
||||
output logic STATUS_MXR, STATUS_SUM,
|
||||
output logic [2:0] FRM_REGW,
|
||||
input logic FlushD, FlushE, FlushM, StallD, StallW, StallE, StallM,
|
||||
|
||||
// PMA checker signals
|
||||
input logic [31:0] HADDR,
|
||||
input logic [2:0] HSIZE, HBURST,
|
||||
|
@ -41,7 +41,7 @@ module trap (
|
||||
input logic [`XLEN-1:0] InstrMisalignedAdrM, MemAdrM,
|
||||
input logic [31:0] InstrM,
|
||||
input logic StallW,
|
||||
input logic InstrValidM,
|
||||
input logic InstrValidM, CommittedM,
|
||||
output logic NonBusTrapM, TrapM, MTrapM, STrapM, UTrapM, RetM,
|
||||
output logic InterruptM,
|
||||
output logic [`XLEN-1:0] PrivilegedNextPCM, CauseM, NextFaultMtvalM
|
||||
@ -58,7 +58,10 @@ module trap (
|
||||
assign MIntGlobalEnM = {12{(PrivilegeModeW != `M_MODE) || STATUS_MIE}}; // if M ints enabled or lower priv 3.1.9
|
||||
assign SIntGlobalEnM = (PrivilegeModeW == `U_MODE) || STATUS_SIE; // if S ints enabled or lower priv 3.1.9
|
||||
assign PendingIntsM = (MIP_REGW & MIE_REGW) & ((MIntGlobalEnM & 12'h888) | (SIntGlobalEnM & 12'h222));
|
||||
assign InterruptM = (|PendingIntsM) && InstrValidM; // interrupt if any sources are pending // & with a M stage valid bit to avoid interrupts from interrupt a nonexistent flushed instruction (in the M stage)
|
||||
assign InterruptM = (|PendingIntsM) & InstrValidM & ~CommittedM;
|
||||
// interrupt if any sources are pending
|
||||
// & with a M stage valid bit to avoid interrupts from interrupt a nonexistent flushed instruction (in the M stage)
|
||||
// & with ~CommittedM to make sure MEPC isn't chosen so as to rerun the same instr twice
|
||||
|
||||
// Trigger Traps and RET
|
||||
// Created groups of trap signals so that bus could take in all traps it doesn't already produce (i.e. using just TrapM to squash access created circular paths)
|
||||
|
@ -106,8 +106,8 @@ module uartPC16550D(
|
||||
logic fifoenabled, fifodmamodesel, evenparitysel;
|
||||
|
||||
// interrupts
|
||||
logic rxlinestatusintr, rxdataavailintr, txhremptyintr, modemstatusintr, intrpending;
|
||||
logic [2:0] intrid;
|
||||
logic rxlinestatusintr, rxdataavailintr, modemstatusintr, intrpending, THRE, suppressTHREbecauseIIR, suppressTHREbecauseIIRtrig;
|
||||
logic [2:0] intrID;
|
||||
|
||||
///////////////////////////////////////////
|
||||
// Input synchronization: 2-stage synchronizer
|
||||
@ -152,8 +152,8 @@ module uartPC16550D(
|
||||
if (RXBR[9]) LSR[2] <= #1 1; // parity error
|
||||
if (RXBR[8]) LSR[3] <= #1 1; // framing error
|
||||
if (rxbreak) LSR[4] <= #1 1; // break indicator
|
||||
LSR[5] <= #1 txhremptyintr ; // THRE
|
||||
LSR[6] <= #1 ~txsrfull & txhremptyintr; // TEMT
|
||||
LSR[5] <= #1 THRE & ~(suppressTHREbecauseIIR | suppressTHREbecauseIIRtrig); // THRE (suppress trigger included to avoid 2-cycle delay)
|
||||
LSR[6] <= #1 ~txsrfull & THRE; // TEMT
|
||||
if (rxfifohaserr) LSR[7] <= #1 1; // any bits in FIFO have error
|
||||
|
||||
// Modem Status Register (8.6.8)
|
||||
@ -168,7 +168,7 @@ module uartPC16550D(
|
||||
case (A)
|
||||
3'b000: if (DLAB) Dout = DLL; else Dout = RBR;
|
||||
3'b001: if (DLAB) Dout = DLM; else Dout = {4'b0, IER[3:0]};
|
||||
3'b010: Dout = {{2{fifoenabled}}, 2'b00, intrid[2:0], ~intrpending}; // Read only Interupt Ident Register
|
||||
3'b010: Dout = {{2{fifoenabled}}, 2'b00, intrID[2:0], ~intrpending}; // Read only Interupt Ident Register
|
||||
3'b011: Dout = LCR;
|
||||
3'b100: Dout = {3'b000, MCR};
|
||||
3'b101: Dout = LSR;
|
||||
@ -411,7 +411,7 @@ module uartPC16550D(
|
||||
|
||||
always_comb
|
||||
if (fifoenabled & fifodmamodesel) TXRDYb = ~txfifodmaready;
|
||||
else TXRDYb = ~txhremptyintr;
|
||||
else TXRDYb = ~THRE;
|
||||
|
||||
// Transmitter pin
|
||||
assign SOUTbit = txsr[11]; // transmit most significant bit
|
||||
@ -420,28 +420,31 @@ module uartPC16550D(
|
||||
///////////////////////////////////////////
|
||||
// interrupts
|
||||
///////////////////////////////////////////
|
||||
|
||||
assign rxlinestatusintr = |LSR[4:1]; // LS interrupt if any of the flags are true
|
||||
assign rxdataavailintr = fifoenabled ? rxfifotriggered : rxdataready;
|
||||
assign txhremptyintr = fifoenabled ? txfifoempty : ~txhrfull;
|
||||
assign THRE = fifoenabled ? txfifoempty : ~txhrfull;
|
||||
assign modemstatusintr = |MSR[3:0]; // set interrupt when modem pins change
|
||||
|
||||
// interrupt priority (Table 5)
|
||||
// set intrid based on highest priority pending interrupt source; otherwise, no interrupt is pending
|
||||
// IIR: interrupt priority (Table 5)
|
||||
// set intrID based on highest priority pending interrupt source; otherwise, no interrupt is pending
|
||||
always_comb begin
|
||||
intrpending = 1;
|
||||
if (rxlinestatusintr & IER[2]) intrid = 3'b011;
|
||||
else if (rxdataavailintr & IER[0]) intrid = 3'b010;
|
||||
else if (rxfifotimeout & fifoenabled & IER[0]) intrid = 3'b110;
|
||||
else if (txhremptyintr & IER[1]) intrid = 3'b001;
|
||||
else if (modemstatusintr & IER[3]) intrid = 3'b000;
|
||||
if (rxlinestatusintr & IER[2]) intrID = 3'b011;
|
||||
else if (rxdataavailintr & IER[0]) intrID = 3'b010;
|
||||
else if (rxfifotimeout & fifoenabled & IER[0]) intrID = 3'b110;
|
||||
else if (THRE & IER[1] & ~suppressTHREbecauseIIR) intrID = 3'b001;
|
||||
else if (modemstatusintr & IER[3]) intrID = 3'b000;
|
||||
else begin
|
||||
intrid = 3'b000;
|
||||
intrID = 3'b000;
|
||||
intrpending = 0;
|
||||
end
|
||||
end
|
||||
always @(posedge HCLK) INTR <= #1 intrpending; // prevent glitches on interrupt pin
|
||||
|
||||
// Side effect of reading IIR is lowering THRE if most significant intr
|
||||
assign suppressTHREbecauseIIRtrig = ~MEMRb & (A==3'b010) & (intrID==2'h1);
|
||||
flopr #(1) suppressTHREreg(HCLK, (~HRESETn | (fifoenabled ? ~txfifoempty : txhrfull)), (suppressTHREbecauseIIRtrig | suppressTHREbecauseIIR), suppressTHREbecauseIIR);
|
||||
|
||||
///////////////////////////////////////////
|
||||
// modem control logic
|
||||
///////////////////////////////////////////
|
||||
|
@ -138,6 +138,7 @@ module wallypipelinedhart (
|
||||
logic InstrReadF;
|
||||
logic DataStall;
|
||||
logic InstrAckF, MemAckW;
|
||||
logic CommitM, CommittedM;
|
||||
|
||||
logic BPPredWrongE;
|
||||
logic BPPredDirWrongM;
|
||||
@ -185,7 +186,7 @@ module wallypipelinedhart (
|
||||
privileged priv(.*);
|
||||
|
||||
|
||||
fpu fpu(.*); // floating point unit
|
||||
fpu fpu(.*); // floating point unit
|
||||
// add FPU here, with SetFflagsM, FRM_REGW
|
||||
// presently stub out SetFlagsM and FloatRegWriteW
|
||||
//assign SetFflagsM = 0;
|
||||
|
@ -489,7 +489,7 @@ string tests32f[] = '{
|
||||
};
|
||||
|
||||
string tests64periph[] = '{
|
||||
"rv64i-periph/WALLY-PLIC", "2000"
|
||||
"rv64i-periph/WALLY-PERIPH", "2000"
|
||||
};
|
||||
|
||||
string tests32periph[] = '{
|
||||
|
Loading…
Reference in New Issue
Block a user