forked from Github_Repos/cvw
Cleaned up the InstrMisalignedFault.
This commit is contained in:
parent
862bf2faae
commit
06209c417f
@ -85,7 +85,7 @@ module ifu (
|
|||||||
);
|
);
|
||||||
|
|
||||||
(* mark_debug = "true" *) logic [`XLEN-1:0] PCCorrectE, UnalignedPCNextF, PCNextF;
|
(* mark_debug = "true" *) logic [`XLEN-1:0] PCCorrectE, UnalignedPCNextF, PCNextF;
|
||||||
logic misaligned, BranchMisalignedFaultE, BranchMisalignedFaultM, TrapMisalignedFaultM;
|
logic BranchMisalignedFaultE;
|
||||||
logic PrivilegedChangePCM;
|
logic PrivilegedChangePCM;
|
||||||
logic IllegalCompInstrD;
|
logic IllegalCompInstrD;
|
||||||
logic [`XLEN-1:0] PCPlus2or4F, PCLinkD;
|
logic [`XLEN-1:0] PCPlus2or4F, PCLinkD;
|
||||||
@ -401,22 +401,19 @@ module ifu (
|
|||||||
|
|
||||||
|
|
||||||
// Misaligned PC logic
|
// Misaligned PC logic
|
||||||
|
// Instruction address misalignement only from br/jal(r) instructions.
|
||||||
// instruction address misalignment is generated by the target of control flow instructions, not
|
// instruction address misalignment is generated by the target of control flow instructions, not
|
||||||
// the fetch itself.
|
// the fetch itself.
|
||||||
assign misaligned = PCNextF[0] | (PCNextF[1] & ~`C_SUPPORTED);
|
// xret and Traps both cannot produce instruction misaligned.
|
||||||
// do we really need to have check if the instruction is control flow? Yes
|
// xret: mepc is an MXLEN-bit read/write register formatted as shown in Figure 3.21.
|
||||||
// Branches are updated in the execution stage but traps are updated in the memory stage.
|
// The low bit of mepc (mepc[0]) is always zero. On implementations that support
|
||||||
|
// only IALIGN=32, the two low bits (mepc[1:0]) are always zero.
|
||||||
// pipeline misaligned faults to M stage
|
// Spec 3.1.14
|
||||||
assign BranchMisalignedFaultE = misaligned & PCSrcE; // E-stage (Branch/Jump) misaligned
|
// Traps: Can’t happen. The bottom two bits of MTVEC are ignored so the trap always is to a multiple of 4. See 3.1.7 of the privileged spec.
|
||||||
flopenr #(1) InstrMisalginedReg(clk, reset, ~StallM, BranchMisalignedFaultE, BranchMisalignedFaultM);
|
assign BranchMisalignedFaultE = (IEUAdrE[1] & ~`C_SUPPORTED) & PCSrcE;
|
||||||
|
flopenr #(1) InstrMisalginedReg(clk, reset, ~StallM, BranchMisalignedFaultE, InstrMisalignedFaultM);
|
||||||
// *** Ross Thompson. Check InstrMisalignedAdrM as I believe it is the same as PCF. Should be able to remove.
|
// *** Ross Thompson. Check InstrMisalignedAdrM as I believe it is the same as PCF. Should be able to remove.
|
||||||
flopenr #(`XLEN) InstrMisalignedAdrReg(clk, reset, ~StallM, PCNextF, InstrMisalignedAdrM);
|
flopenr #(`XLEN) InstrMisalignedAdrReg(clk, reset, ~StallM, PCNextF, InstrMisalignedAdrM);
|
||||||
assign TrapMisalignedFaultM = misaligned & PrivilegedChangePCM;
|
|
||||||
assign InstrMisalignedFaultM = BranchMisalignedFaultM; // | TrapMisalignedFaultM; *** put this back in without causing a cyclic path
|
|
||||||
// *** likely leave TrapMisalignedFaultM out of here. Don't implement full spec because
|
|
||||||
// *** it seems silly to have a misaligned trap handler and it adds to the critical path.
|
|
||||||
// ***later revisit more detail
|
|
||||||
|
|
||||||
// Instruction and PC/PCLink pipeline registers
|
// Instruction and PC/PCLink pipeline registers
|
||||||
flopenr #(32) InstrEReg(clk, reset, ~StallE, FlushE ? nop : InstrD, InstrE);
|
flopenr #(32) InstrEReg(clk, reset, ~StallE, FlushE ? nop : InstrD, InstrE);
|
||||||
|
@ -72,25 +72,16 @@ module trap (
|
|||||||
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); // *** RT. temporary hack to prevent integer division from having an interrupt during divide.
|
assign InterruptM = PendingInterruptM & ~(CommittedM); // *** 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 = Exception1M;
|
|
||||||
// *** as of 7/17/21, the system passes with this definition of ExceptionM as being all traps and fails if ExceptionM = Exception1M
|
|
||||||
// with no interrupts. However, Ross intended the datacache to use Exception without interrupts, so there is something subtle
|
|
||||||
// to sort out here.
|
|
||||||
// *** as of 8/13/21, switching to Exception1M does not seem to cause any failures. It's possible the bug was
|
|
||||||
// fixed inadvertantly as the dcache was debugged.
|
|
||||||
|
|
||||||
// Trigger Traps and RET
|
// Trigger Traps and RET
|
||||||
// According to RISC-V Spec Section 1.6, exceptions are caused by instructions. Interrupts are external asynchronous.
|
// According to RISC-V Spec Section 1.6, exceptions are caused by instructions. Interrupts are external asynchronous.
|
||||||
// Traps are the union of exceptions and interrupts.
|
// Traps are the union of exceptions and interrupts.
|
||||||
assign Exception1M = InstrMisalignedFaultM | InstrAccessFaultM | IllegalInstrFaultM |
|
assign ExceptionM = InstrMisalignedFaultM | InstrAccessFaultM | IllegalInstrFaultM |
|
||||||
LoadMisalignedFaultM | StoreAmoMisalignedFaultM |
|
LoadMisalignedFaultM | StoreAmoMisalignedFaultM |
|
||||||
InstrPageFaultM | LoadPageFaultM | StoreAmoPageFaultM |
|
InstrPageFaultM | LoadPageFaultM | StoreAmoPageFaultM |
|
||||||
BreakpointFaultM | EcallFaultM |
|
BreakpointFaultM | EcallFaultM |
|
||||||
LoadAccessFaultM | StoreAmoAccessFaultM;
|
LoadAccessFaultM | StoreAmoAccessFaultM;
|
||||||
assign TrapM = Exception1M | InterruptM; // *** clean this up later DH
|
assign TrapM = ExceptionM | InterruptM; // *** clean this up later DH
|
||||||
assign MTrapM = TrapM & (NextPrivilegeModeM == `M_MODE);
|
assign MTrapM = TrapM & (NextPrivilegeModeM == `M_MODE);
|
||||||
assign STrapM = TrapM & (NextPrivilegeModeM == `S_MODE) & `S_SUPPORTED;
|
assign STrapM = TrapM & (NextPrivilegeModeM == `S_MODE) & `S_SUPPORTED;
|
||||||
assign UTrapM = TrapM & (NextPrivilegeModeM == `U_MODE) & `N_SUPPORTED;
|
assign UTrapM = TrapM & (NextPrivilegeModeM == `U_MODE) & `N_SUPPORTED;
|
||||||
|
Loading…
Reference in New Issue
Block a user