mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Hack "fix" to prevent interrupt from occuring during an integer divide.
This is not the desired solution but will allow continued debuging of linux.
This commit is contained in:
parent
ecd3912900
commit
796316495d
@ -360,6 +360,7 @@ module ifu (
|
|||||||
|
|
||||||
|
|
||||||
assign PCNextF = {UnalignedPCNextF[`XLEN-1:1], 1'b0}; // hart-SPEC p. 21 about 16-bit alignment
|
assign PCNextF = {UnalignedPCNextF[`XLEN-1:1], 1'b0}; // hart-SPEC p. 21 about 16-bit alignment
|
||||||
|
// *** double check this enable. It cannot be correct.
|
||||||
flopenl #(`XLEN) pcreg(clk, reset, ~StallF & ~ICacheStallF, PCNextF, `RESET_VECTOR, PCF);
|
flopenl #(`XLEN) pcreg(clk, reset, ~StallF & ~ICacheStallF, PCNextF, `RESET_VECTOR, PCF);
|
||||||
|
|
||||||
// branch and jump predictor
|
// branch and jump predictor
|
||||||
|
@ -41,6 +41,7 @@ module muldiv (
|
|||||||
output logic [`XLEN-1:0] MDUResultW,
|
output logic [`XLEN-1:0] MDUResultW,
|
||||||
// Divide Done
|
// Divide Done
|
||||||
output logic DivBusyE,
|
output logic DivBusyE,
|
||||||
|
output logic DivE,
|
||||||
// hazards
|
// hazards
|
||||||
input logic StallM, StallW, FlushM, FlushW
|
input logic StallM, StallW, FlushM, FlushW
|
||||||
);
|
);
|
||||||
@ -50,7 +51,6 @@ module muldiv (
|
|||||||
logic [`XLEN-1:0] QuotM, RemM;
|
logic [`XLEN-1:0] QuotM, RemM;
|
||||||
logic [`XLEN*2-1:0] ProdM;
|
logic [`XLEN*2-1:0] ProdM;
|
||||||
|
|
||||||
logic DivE;
|
|
||||||
logic DivSignedE;
|
logic DivSignedE;
|
||||||
logic W64M;
|
logic W64M;
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ module privileged (
|
|||||||
output logic [`XLEN-1:0] PrivilegedNextPCM,
|
output logic [`XLEN-1:0] PrivilegedNextPCM,
|
||||||
output logic RetM, TrapM,
|
output logic RetM, TrapM,
|
||||||
output logic ITLBFlushF, DTLBFlushM,
|
output logic ITLBFlushF, DTLBFlushM,
|
||||||
input logic InstrValidM, CommittedM,
|
input logic InstrValidM, CommittedM, DivE,
|
||||||
input logic FRegWriteM, LoadStallD,
|
input logic FRegWriteM, LoadStallD,
|
||||||
input logic BPPredDirWrongM,
|
input logic BPPredDirWrongM,
|
||||||
input logic BTBPredPCWrongM,
|
input logic BTBPredPCWrongM,
|
||||||
@ -230,7 +230,7 @@ module privileged (
|
|||||||
.PCM,
|
.PCM,
|
||||||
.InstrMisalignedAdrM, .IEUAdrM,
|
.InstrMisalignedAdrM, .IEUAdrM,
|
||||||
.InstrM,
|
.InstrM,
|
||||||
.InstrValidM, .CommittedM,
|
.InstrValidM, .CommittedM, .DivE,
|
||||||
.TrapM, .MTrapM, .STrapM, .UTrapM, .RetM,
|
.TrapM, .MTrapM, .STrapM, .UTrapM, .RetM,
|
||||||
.InterruptM,
|
.InterruptM,
|
||||||
.ExceptionM,
|
.ExceptionM,
|
||||||
|
@ -46,7 +46,7 @@ module trap (
|
|||||||
input logic [`XLEN-1:0] PCM,
|
input logic [`XLEN-1:0] PCM,
|
||||||
input logic [`XLEN-1:0] InstrMisalignedAdrM, IEUAdrM,
|
input logic [`XLEN-1:0] InstrMisalignedAdrM, IEUAdrM,
|
||||||
input logic [31:0] InstrM,
|
input logic [31:0] InstrM,
|
||||||
input logic InstrValidM, CommittedM,
|
input logic InstrValidM, CommittedM, DivE,
|
||||||
output logic TrapM, MTrapM, STrapM, UTrapM, RetM,
|
output logic TrapM, MTrapM, STrapM, UTrapM, RetM,
|
||||||
output logic InterruptM,
|
output logic InterruptM,
|
||||||
output logic ExceptionM,
|
output logic ExceptionM,
|
||||||
@ -71,7 +71,9 @@ module trap (
|
|||||||
assign SIntGlobalEnM = (PrivilegeModeW == `U_MODE) | ((PrivilegeModeW == `S_MODE) & STATUS_SIE); // if in lower priv mode, or if S ints enabled and not in higher priv mode 3.1.9
|
assign SIntGlobalEnM = (PrivilegeModeW == `U_MODE) | ((PrivilegeModeW == `S_MODE) & STATUS_SIE); // if in lower priv mode, or if S ints enabled and not in higher priv mode 3.1.9
|
||||||
assign PendingIntsM = ((MIP_REGW & MIE_REGW) & ({12{MIntGlobalEnM}} & 12'h888)) | ((SIP_REGW & SIE_REGW) & ({12{SIntGlobalEnM}} & 12'h222));
|
assign PendingIntsM = ((MIP_REGW & MIE_REGW) & ({12{MIntGlobalEnM}} & 12'h888)) | ((SIP_REGW & SIE_REGW) & ({12{SIntGlobalEnM}} & 12'h222));
|
||||||
assign PendingInterruptM = (|PendingIntsM) & InstrValidM;
|
assign PendingInterruptM = (|PendingIntsM) & InstrValidM;
|
||||||
assign InterruptM = PendingInterruptM & ~CommittedM;
|
assign InterruptM = PendingInterruptM & (~CommittedM | ~DivE); // *** RT. temporary hack to prevent integer division from having an interrupt during divide.
|
||||||
|
// ideally this should be disabled for all but the first cycle. However I'm not familar with the internals of the integer divider. This should (could) be an issue for
|
||||||
|
// floating point and integer multiply.
|
||||||
//assign ExceptionM = TrapM;
|
//assign ExceptionM = TrapM;
|
||||||
assign ExceptionM = Exception1M;
|
assign ExceptionM = Exception1M;
|
||||||
// *** as of 7/17/21, the system passes with this definition of ExceptionM as being all traps and fails if ExceptionM = Exception1M
|
// *** as of 7/17/21, the system passes with this definition of ExceptionM as being all traps and fails if ExceptionM = Exception1M
|
||||||
|
@ -87,11 +87,12 @@ module wallypipelinedhart (
|
|||||||
logic PCSrcE;
|
logic PCSrcE;
|
||||||
logic CSRWritePendingDEM;
|
logic CSRWritePendingDEM;
|
||||||
logic DivBusyE;
|
logic DivBusyE;
|
||||||
|
logic DivE;
|
||||||
logic LoadStallD, StoreStallD, MDUStallD, CSRRdStallD;
|
logic LoadStallD, StoreStallD, MDUStallD, CSRRdStallD;
|
||||||
logic SquashSCW;
|
logic SquashSCW;
|
||||||
// floating point unit signals
|
// floating point unit signals
|
||||||
logic [2:0] FRM_REGW;
|
logic [2:0] FRM_REGW;
|
||||||
logic [4:0] RdM, RdW;
|
logic [4:0] RdM, RdW;
|
||||||
logic FStallD;
|
logic FStallD;
|
||||||
logic FWriteIntE;
|
logic FWriteIntE;
|
||||||
logic [`XLEN-1:0] FWriteDataE;
|
logic [`XLEN-1:0] FWriteDataE;
|
||||||
@ -321,7 +322,7 @@ module wallypipelinedhart (
|
|||||||
.InstrM, .CSRReadValW, .PrivilegedNextPCM,
|
.InstrM, .CSRReadValW, .PrivilegedNextPCM,
|
||||||
.RetM, .TrapM,
|
.RetM, .TrapM,
|
||||||
.ITLBFlushF, .DTLBFlushM,
|
.ITLBFlushF, .DTLBFlushM,
|
||||||
.InstrValidM, .CommittedM,
|
.InstrValidM, .CommittedM, .DivE,
|
||||||
.FRegWriteM, .LoadStallD,
|
.FRegWriteM, .LoadStallD,
|
||||||
.BPPredDirWrongM, .BTBPredPCWrongM,
|
.BPPredDirWrongM, .BTBPredPCWrongM,
|
||||||
.RASPredPCWrongM, .BPPredClassNonCFIWrongM,
|
.RASPredPCWrongM, .BPPredClassNonCFIWrongM,
|
||||||
@ -356,7 +357,7 @@ module wallypipelinedhart (
|
|||||||
.clk, .reset,
|
.clk, .reset,
|
||||||
.ForwardedSrcAE, .ForwardedSrcBE,
|
.ForwardedSrcAE, .ForwardedSrcBE,
|
||||||
.Funct3E, .Funct3M, .MDUE, .W64E,
|
.Funct3E, .Funct3M, .MDUE, .W64E,
|
||||||
.MDUResultW, .DivBusyE,
|
.MDUResultW, .DivBusyE, .DivE,
|
||||||
.StallM, .StallW, .FlushM, .FlushW
|
.StallM, .StallW, .FlushM, .FlushW
|
||||||
);
|
);
|
||||||
end else begin // no M instructions supported
|
end else begin // no M instructions supported
|
||||||
|
Loading…
Reference in New Issue
Block a user