mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Moved privileged pc logic into privileged unit.
This commit is contained in:
parent
35ad49502f
commit
97593e8a6f
@ -54,7 +54,8 @@ module ifu (
|
||||
// Mem
|
||||
input logic RetM, TrapM,
|
||||
output logic CommittedF,
|
||||
input logic [`XLEN-1:0] PrivilegedNextPCM,
|
||||
input logic [`XLEN-1:0] UnalignedPCNextF,
|
||||
output logic [`XLEN-1:0] PCNext2F,
|
||||
input logic CSRWriteFenceM,
|
||||
input logic InvalidateICacheM,
|
||||
output logic [31:0] InstrD, InstrM,
|
||||
@ -85,7 +86,7 @@ module ifu (
|
||||
output logic ICacheAccess,
|
||||
output logic ICacheMiss
|
||||
);
|
||||
(* mark_debug = "true" *) logic [`XLEN-1:0] UnalignedPCNextF, PCNextF;
|
||||
(* mark_debug = "true" *) logic [`XLEN-1:0] PCNextF;
|
||||
logic BranchMisalignedFaultE;
|
||||
logic IllegalCompInstrD;
|
||||
logic [`XLEN-1:0] PCPlus2or4F, PCLinkD;
|
||||
@ -116,7 +117,7 @@ module ifu (
|
||||
logic GatedStallF;
|
||||
(* mark_debug = "true" *) logic [31:0] PostSpillInstrRawF;
|
||||
// branch predictor signal
|
||||
logic [`XLEN-1:0] PCNext1F, PCNext2F, PCNext0F;
|
||||
logic [`XLEN-1:0] PCNext1F, PCNext0F;
|
||||
logic BusCommittedF, CacheCommittedF;
|
||||
logic SelIROM;
|
||||
|
||||
@ -289,12 +290,7 @@ module ifu (
|
||||
mux2 #(`XLEN) pcmux2(.d0(PCNext1F), .d1(NextValidPCE), .s(CSRWriteFenceM),.y(PCNext2F));
|
||||
// mux2 #(`XLEN) pcmux2(.d0(PCNext1F), .d1(PCM+4), .s(CSRWriteFenceM),.y(PCNext2F));
|
||||
else assign PCNext2F = PCNext1F;
|
||||
if(`ZICSR_SUPPORTED) begin
|
||||
logic PrivilegedChangePCM;
|
||||
assign PrivilegedChangePCM = RetM | TrapM;
|
||||
mux2 #(`XLEN) pcmux3(.d0(PCNext2F), .d1(PrivilegedNextPCM), .s(PrivilegedChangePCM),
|
||||
.y(UnalignedPCNextF));
|
||||
end else assign UnalignedPCNextF = PCNext2F;
|
||||
|
||||
assign PCNextF = {UnalignedPCNextF[`XLEN-1:1], 1'b0}; // hart-SPEC p. 21 about 16-bit alignment
|
||||
flopenl #(`XLEN) pcreg(clk, reset, ~StallF, PCNextF, `RESET_VECTOR, PCF);
|
||||
|
||||
|
@ -40,7 +40,7 @@ module csr #(parameter
|
||||
input logic FlushE, FlushM, FlushW,
|
||||
input logic StallE, StallM, StallW,
|
||||
input logic [31:0] InstrM,
|
||||
input logic [`XLEN-1:0] PCM, SrcAM, IEUAdrM,
|
||||
input logic [`XLEN-1:0] PCM, SrcAM, IEUAdrM, PCNext2F,
|
||||
input logic CSRReadM, CSRWriteM, TrapM, mretM, sretM, wfiM, InterruptM,
|
||||
input logic MTimerInt, MExtInt, SExtInt, MSwInt,
|
||||
input logic [63:0] MTIME_CLINT,
|
||||
@ -70,7 +70,7 @@ module csr #(parameter
|
||||
|
||||
input logic [4:0] SetFflagsM,
|
||||
output logic [2:0] FRM_REGW,
|
||||
output logic [`XLEN-1:0] CSRReadValW, PrivilegedNextPCM,
|
||||
output logic [`XLEN-1:0] CSRReadValW, UnalignedPCNextF,
|
||||
output logic IllegalCSRAccessM, BigEndianM
|
||||
);
|
||||
|
||||
@ -100,6 +100,8 @@ module csr #(parameter
|
||||
logic [`XLEN-1:0] TVec, TrapVector, NextFaultMtvalM;
|
||||
logic MTrapM, STrapM;
|
||||
|
||||
logic [`XLEN-1:0] PrivilegedNextPCM;
|
||||
|
||||
|
||||
logic InstrValidNotFlushedM;
|
||||
assign InstrValidNotFlushedM = ~StallW & ~FlushW;
|
||||
@ -149,6 +151,10 @@ module csr #(parameter
|
||||
else if (mretM) PrivilegedNextPCM = MEPC_REGW;
|
||||
else PrivilegedNextPCM = SEPC_REGW;
|
||||
|
||||
logic PrivilegedChangePCM;
|
||||
assign PrivilegedChangePCM = mretM | sretM | TrapM;
|
||||
mux2 #(`XLEN) pcmux3(.d0(PCNext2F), .d1(PrivilegedNextPCM), .s(PrivilegedChangePCM), .y(UnalignedPCNextF));
|
||||
|
||||
///////////////////////////////////////////
|
||||
// CSRWriteValM
|
||||
///////////////////////////////////////////
|
||||
|
@ -33,10 +33,10 @@ module privileged (
|
||||
input logic FlushD, FlushE, FlushM, FlushW, StallD, StallE, StallM, StallW,
|
||||
(* mark_debug = "true" *) input logic CSRReadM, CSRWriteM,
|
||||
input logic [`XLEN-1:0] SrcAM,
|
||||
input logic [`XLEN-1:0] PCM,
|
||||
input logic [`XLEN-1:0] PCM, PCNext2F,
|
||||
input logic [31:0] InstrM,
|
||||
output logic [`XLEN-1:0] CSRReadValW,
|
||||
output logic [`XLEN-1:0] PrivilegedNextPCM,
|
||||
output logic [`XLEN-1:0] UnalignedPCNextF,
|
||||
output logic RetM, TrapM,
|
||||
output logic sfencevmaM,
|
||||
input logic InstrValidM, CommittedM, CommittedF,
|
||||
@ -122,7 +122,7 @@ module privileged (
|
||||
csr csr(.clk, .reset,
|
||||
.FlushE, .FlushM, .FlushW,
|
||||
.StallE, .StallM, .StallW,
|
||||
.InstrM, .PCM, .SrcAM, .IEUAdrM,
|
||||
.InstrM, .PCM, .SrcAM, .IEUAdrM, .PCNext2F,
|
||||
.CSRReadM, .CSRWriteM, .TrapM, .mretM, .sretM, .wfiM, .InterruptM,
|
||||
.MTimerInt, .MExtInt, .SExtInt, .MSwInt,
|
||||
.MTIME_CLINT,
|
||||
@ -142,7 +142,7 @@ module privileged (
|
||||
.PMPADDR_ARRAY_REGW,
|
||||
.SetFflagsM,
|
||||
.FRM_REGW,
|
||||
.CSRReadValW,.PrivilegedNextPCM,
|
||||
.CSRReadValW,.UnalignedPCNextF,
|
||||
.IllegalCSRAccessM, .BigEndianM);
|
||||
|
||||
privpiperegs ppr(.clk, .reset, .StallD, .StallE, .StallM, .FlushD, .FlushE, .FlushM,
|
||||
|
@ -69,7 +69,7 @@ module wallypipelinedcore (
|
||||
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;
|
||||
logic [`XLEN-1:0] UnalignedPCNextF, PCNext2F;
|
||||
(* mark_debug = "true" *) logic [1:0] MemRWM;
|
||||
(* mark_debug = "true" *) logic InstrValidM;
|
||||
logic InstrMisalignedFaultM;
|
||||
@ -173,7 +173,7 @@ module wallypipelinedcore (
|
||||
.StallF, .StallD, .StallE, .StallM,
|
||||
.FlushD, .FlushE, .FlushM, .FlushW,
|
||||
// Fetch
|
||||
.HRDATA, .PCF, .IFUHADDR,
|
||||
.HRDATA, .PCF, .IFUHADDR, .PCNext2F,
|
||||
.IFUStallF, .IFUHBURST, .IFUHTRANS, .IFUHSIZE,
|
||||
.IFUHREADY, .IFUHWRITE,
|
||||
.ICacheAccess, .ICacheMiss,
|
||||
@ -183,7 +183,7 @@ module wallypipelinedcore (
|
||||
.BPPredWrongE,
|
||||
|
||||
// Mem
|
||||
.RetM, .TrapM, .CommittedF, .PrivilegedNextPCM, .InvalidateICacheM, .CSRWriteFenceM,
|
||||
.RetM, .TrapM, .CommittedF, .UnalignedPCNextF, .InvalidateICacheM, .CSRWriteFenceM,
|
||||
.InstrD, .InstrM, .PCM, .InstrClassM, .BPPredDirWrongM,
|
||||
.BTBPredPCWrongM, .RASPredPCWrongM, .BPPredClassNonCFIWrongM,
|
||||
|
||||
@ -334,8 +334,8 @@ module wallypipelinedcore (
|
||||
.clk, .reset,
|
||||
.FlushD, .FlushE, .FlushM, .FlushW,
|
||||
.StallD, .StallE, .StallM, .StallW,
|
||||
.CSRReadM, .CSRWriteM, .SrcAM, .PCM,
|
||||
.InstrM, .CSRReadValW, .PrivilegedNextPCM,
|
||||
.CSRReadM, .CSRWriteM, .SrcAM, .PCM, .PCNext2F,
|
||||
.InstrM, .CSRReadValW, .UnalignedPCNextF,
|
||||
.RetM, .TrapM,
|
||||
.sfencevmaM,
|
||||
.InstrValidM, .CommittedM, .CommittedF,
|
||||
@ -362,7 +362,7 @@ module wallypipelinedcore (
|
||||
);
|
||||
end else begin
|
||||
assign CSRReadValW = 0;
|
||||
assign PrivilegedNextPCM = 0;
|
||||
assign UnalignedPCNextF = PCNext2F;
|
||||
assign RetM = 0;
|
||||
assign TrapM = 0;
|
||||
assign wfiM = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user