2021-01-15 04:37:51 +00:00
|
|
|
///////////////////////////////////////////
|
|
|
|
// csr.sv
|
|
|
|
//
|
|
|
|
// Written: David_Harris@hmc.edu 9 January 2021
|
|
|
|
// Modified:
|
2021-04-08 09:12:54 +00:00
|
|
|
// dottolia@hmc.edu 7 April 2021
|
2021-01-15 04:37:51 +00:00
|
|
|
//
|
|
|
|
// Purpose: Counter Control and Status Registers
|
|
|
|
// See RISC-V Privileged Mode Specification 20190608
|
|
|
|
//
|
|
|
|
// A component of the Wally configurable RISC-V project.
|
|
|
|
//
|
|
|
|
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
|
|
|
|
//
|
2022-01-07 12:58:40 +00:00
|
|
|
// MIT LICENSE
|
|
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
|
|
|
// software and associated documentation files (the "Software"), to deal in the Software
|
|
|
|
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
|
|
|
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
|
|
|
// to whom the Software is furnished to do so, subject to the following conditions:
|
2021-01-15 04:37:51 +00:00
|
|
|
//
|
2022-01-07 12:58:40 +00:00
|
|
|
// The above copyright notice and this permission notice shall be included in all copies or
|
|
|
|
// substantial portions of the Software.
|
2021-01-15 04:37:51 +00:00
|
|
|
//
|
2022-01-07 12:58:40 +00:00
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
|
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
|
|
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
|
|
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
|
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
|
|
|
|
// OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
2021-01-15 04:37:51 +00:00
|
|
|
|
2021-01-23 15:48:12 +00:00
|
|
|
`include "wally-config.vh"
|
2021-01-15 04:37:51 +00:00
|
|
|
|
2021-04-20 21:57:56 +00:00
|
|
|
module csr #(parameter
|
2022-04-03 20:18:25 +00:00
|
|
|
MIP = 12'h344,
|
|
|
|
SIP = 12'h144
|
2021-04-20 21:57:56 +00:00
|
|
|
) (
|
2021-02-02 04:44:41 +00:00
|
|
|
input logic clk, reset,
|
2021-10-23 18:41:20 +00:00
|
|
|
input logic FlushE, FlushM, FlushW,
|
|
|
|
input logic StallE, StallM, StallW,
|
2021-10-23 16:41:24 +00:00
|
|
|
input logic [31:0] InstrM,
|
|
|
|
input logic [`XLEN-1:0] PCM, SrcAM,
|
2022-04-14 17:05:22 +00:00
|
|
|
input logic CSRReadM, CSRWriteM, TrapM, MTrapM, STrapM, UTrapM, mretM, sretM, wfiM,
|
2022-03-30 20:22:41 +00:00
|
|
|
input logic TimerIntM, MExtIntM, SExtIntM, SwIntM,
|
2021-12-31 06:40:21 +00:00
|
|
|
input logic [63:0] MTIME_CLINT,
|
2021-07-13 17:22:04 +00:00
|
|
|
input logic InstrValidM, FRegWriteM, LoadStallD,
|
2022-03-25 00:08:10 +00:00
|
|
|
input logic BPPredDirWrongM,
|
|
|
|
input logic BTBPredPCWrongM,
|
|
|
|
input logic RASPredPCWrongM,
|
|
|
|
input logic BPPredClassNonCFIWrongM,
|
2021-03-31 16:54:02 +00:00
|
|
|
input logic [4:0] InstrClassM,
|
2021-07-20 03:12:20 +00:00
|
|
|
input logic DCacheMiss,
|
|
|
|
input logic DCacheAccess,
|
2022-01-10 04:56:56 +00:00
|
|
|
input logic ICacheMiss,
|
|
|
|
input logic ICacheAccess,
|
2021-02-02 04:44:41 +00:00
|
|
|
input logic [1:0] NextPrivilegeModeM, PrivilegeModeW,
|
2021-01-23 15:48:12 +00:00
|
|
|
input logic [`XLEN-1:0] CauseM, NextFaultMtvalM,
|
2021-02-02 04:44:41 +00:00
|
|
|
output logic [1:0] STATUS_MPP,
|
|
|
|
output logic STATUS_SPP, STATUS_TSR,
|
2022-02-15 19:59:29 +00:00
|
|
|
output logic [`XLEN-1:0] MEPC_REGW, SEPC_REGW, STVEC_REGW, MTVEC_REGW,
|
2022-03-30 20:22:41 +00:00
|
|
|
output logic [`XLEN-1:0] MEDELEG_REGW,
|
2021-03-05 06:22:53 +00:00
|
|
|
output logic [`XLEN-1:0] SATP_REGW,
|
2022-03-30 20:22:41 +00:00
|
|
|
output logic [11:0] MIP_REGW, MIE_REGW, SIP_REGW, SIE_REGW, MIDELEG_REGW,
|
2021-02-02 04:44:41 +00:00
|
|
|
output logic STATUS_MIE, STATUS_SIE,
|
2021-07-06 05:32:05 +00:00
|
|
|
output logic STATUS_MXR, STATUS_SUM, STATUS_MPRV, STATUS_TW,
|
2021-07-04 15:39:59 +00:00
|
|
|
output var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0],
|
2021-10-24 13:47:35 +00:00
|
|
|
output var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0],
|
|
|
|
|
2021-02-02 04:44:41 +00:00
|
|
|
input logic [4:0] SetFflagsM,
|
|
|
|
output logic [2:0] FRM_REGW,
|
2021-01-15 04:37:51 +00:00
|
|
|
// output logic [11:0] MIP_REGW, SIP_REGW, UIP_REGW, MIE_REGW, SIE_REGW, UIE_REGW,
|
2021-06-24 21:39:37 +00:00
|
|
|
output logic [`XLEN-1:0] CSRReadValW,
|
2021-02-02 04:44:41 +00:00
|
|
|
output logic IllegalCSRAccessM
|
2021-01-15 04:37:51 +00:00
|
|
|
);
|
|
|
|
|
2021-05-29 03:11:37 +00:00
|
|
|
localparam NOP = 32'h13;
|
2022-04-02 21:39:45 +00:00
|
|
|
logic [`XLEN-1:0] CSRMReadValM, CSRSReadValM, CSRUReadValM, CSRCReadValM;
|
|
|
|
(* mark_debug = "true" *) logic [`XLEN-1:0] CSRReadValM;
|
|
|
|
(* mark_debug = "true" *) logic [`XLEN-1:0] CSRSrcM;
|
|
|
|
logic [`XLEN-1:0] CSRRWM, CSRRSM, CSRRCM;
|
|
|
|
(* mark_debug = "true" *) logic [`XLEN-1:0] CSRWriteValM;
|
2021-01-15 04:37:51 +00:00
|
|
|
|
2022-02-15 19:59:29 +00:00
|
|
|
(* mark_debug = "true" *) logic [`XLEN-1:0] MSTATUS_REGW, SSTATUS_REGW;
|
2021-01-15 04:37:51 +00:00
|
|
|
logic [31:0] MCOUNTINHIBIT_REGW, MCOUNTEREN_REGW, SCOUNTEREN_REGW;
|
2022-02-15 19:59:29 +00:00
|
|
|
logic WriteMSTATUSM, WriteSSTATUSM;
|
2021-01-15 04:37:51 +00:00
|
|
|
logic CSRMWriteM, CSRSWriteM, CSRUWriteM;
|
2021-07-06 00:35:31 +00:00
|
|
|
logic STATUS_TVM;
|
2021-07-13 17:20:30 +00:00
|
|
|
logic WriteFRMM, WriteFFLAGSM;
|
2021-01-15 04:37:51 +00:00
|
|
|
|
2021-06-02 14:03:19 +00:00
|
|
|
logic [`XLEN-1:0] UnalignedNextEPCM, NextEPCM, NextCauseM, NextMtvalM;
|
2021-01-15 04:37:51 +00:00
|
|
|
|
|
|
|
logic [11:0] CSRAdrM;
|
2021-04-20 21:57:56 +00:00
|
|
|
//logic [11:0] UIP_REGW, UIE_REGW = 0; // N user-mode exceptions not supported
|
2022-02-15 19:59:29 +00:00
|
|
|
logic IllegalCSRCAccessM, IllegalCSRMAccessM, IllegalCSRSAccessM, IllegalCSRUAccessM, InsufficientCSRPrivilegeM;
|
2021-04-08 09:12:54 +00:00
|
|
|
logic IllegalCSRMWriteReadonlyM;
|
2022-04-03 20:18:25 +00:00
|
|
|
logic [`XLEN-1:0] CSRReadVal2M;
|
|
|
|
logic [11:0] IP_REGW_writeable;
|
2021-05-29 03:11:37 +00:00
|
|
|
|
2022-01-20 22:39:54 +00:00
|
|
|
logic InstrValidNotFlushedM;
|
|
|
|
assign InstrValidNotFlushedM = ~StallW & ~FlushW;
|
|
|
|
|
2021-12-20 00:53:41 +00:00
|
|
|
// modify CSRs
|
|
|
|
always_comb begin
|
|
|
|
// Choose either rs1 or uimm[4:0] as source
|
|
|
|
CSRSrcM = InstrM[14] ? {{(`XLEN-5){1'b0}}, InstrM[19:15]} : SrcAM;
|
2022-04-03 20:18:25 +00:00
|
|
|
|
|
|
|
// CSR set and clear for MIP/SIP should only touch internal state, not interrupt inputs
|
|
|
|
if (CSRAdrM == MIP | CSRAdrM == SIP) CSRReadVal2M = {{(`XLEN-12){1'b0}}, IP_REGW_writeable};
|
|
|
|
else CSRReadVal2M = CSRReadValM;
|
|
|
|
|
2021-12-20 00:53:41 +00:00
|
|
|
// Compute AND/OR modification
|
|
|
|
CSRRWM = CSRSrcM;
|
2022-04-03 20:18:25 +00:00
|
|
|
CSRRSM = CSRReadVal2M | CSRSrcM;
|
|
|
|
CSRRCM = CSRReadVal2M & ~CSRSrcM;
|
2021-12-20 00:53:41 +00:00
|
|
|
case (InstrM[13:12])
|
|
|
|
2'b01: CSRWriteValM = CSRRWM;
|
|
|
|
2'b10: CSRWriteValM = CSRRSM;
|
|
|
|
2'b11: CSRWriteValM = CSRRCM;
|
|
|
|
default: CSRWriteValM = CSRReadValM;
|
|
|
|
endcase
|
|
|
|
end
|
2021-01-15 04:37:51 +00:00
|
|
|
|
2021-12-20 00:53:41 +00:00
|
|
|
// write CSRs
|
|
|
|
assign CSRAdrM = InstrM[31:20];
|
2022-04-14 17:05:22 +00:00
|
|
|
assign UnalignedNextEPCM = TrapM ? (wfiM ? PCM+4 : PCM) : CSRWriteValM;
|
2021-12-20 00:53:41 +00:00
|
|
|
assign NextEPCM = `C_SUPPORTED ? {UnalignedNextEPCM[`XLEN-1:1], 1'b0} : {UnalignedNextEPCM[`XLEN-1:2], 2'b00}; // 3.1.15 alignment
|
|
|
|
assign NextCauseM = TrapM ? CauseM : CSRWriteValM;
|
|
|
|
assign NextMtvalM = TrapM ? NextFaultMtvalM : CSRWriteValM;
|
2022-01-02 21:47:21 +00:00
|
|
|
assign CSRMWriteM = CSRWriteM & (PrivilegeModeW == `M_MODE);
|
|
|
|
assign CSRSWriteM = CSRWriteM & (|PrivilegeModeW);
|
2021-12-20 00:53:41 +00:00
|
|
|
assign CSRUWriteM = CSRWriteM;
|
2021-01-15 04:37:51 +00:00
|
|
|
|
2022-03-30 20:22:41 +00:00
|
|
|
csri csri(.clk, .reset, .InstrValidNotFlushedM, .StallW,
|
|
|
|
.CSRMWriteM, .CSRSWriteM, .CSRWriteValM, .CSRAdrM,
|
|
|
|
.MExtIntM, .SExtIntM, .TimerIntM, .SwIntM,
|
2022-04-03 20:18:25 +00:00
|
|
|
.MIP_REGW, .MIE_REGW, .SIP_REGW, .SIE_REGW, .MIDELEG_REGW, .IP_REGW_writeable);
|
2021-12-31 07:11:03 +00:00
|
|
|
csrsr csrsr(.clk, .reset, .StallW,
|
2022-02-15 19:59:29 +00:00
|
|
|
.WriteMSTATUSM, .WriteSSTATUSM,
|
2021-12-31 07:11:03 +00:00
|
|
|
.TrapM, .FRegWriteM, .NextPrivilegeModeM, .PrivilegeModeW,
|
2022-02-15 19:48:49 +00:00
|
|
|
.mretM, .sretM, .WriteFRMM, .WriteFFLAGSM, .CSRWriteValM,
|
2022-02-15 19:59:29 +00:00
|
|
|
.MSTATUS_REGW, .SSTATUS_REGW,
|
2021-12-31 07:11:03 +00:00
|
|
|
.STATUS_MPP, .STATUS_SPP, .STATUS_TSR, .STATUS_TW,
|
|
|
|
.STATUS_MIE, .STATUS_SIE, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_TVM);
|
|
|
|
csrc counters(.clk, .reset,
|
|
|
|
.StallE, .StallM, .StallW, .FlushE, .FlushM, .FlushW,
|
|
|
|
.InstrValidM, .LoadStallD, .CSRMWriteM,
|
|
|
|
.BPPredDirWrongM, .BTBPredPCWrongM, .RASPredPCWrongM, .BPPredClassNonCFIWrongM,
|
2022-01-10 04:56:56 +00:00
|
|
|
.InstrClassM, .DCacheMiss, .DCacheAccess, .ICacheMiss, .ICacheAccess,
|
2021-12-31 07:11:03 +00:00
|
|
|
.CSRAdrM, .PrivilegeModeW, .CSRWriteValM,
|
|
|
|
.MCOUNTINHIBIT_REGW, .MCOUNTEREN_REGW, .SCOUNTEREN_REGW,
|
|
|
|
.MTIME_CLINT, .CSRCReadValM, .IllegalCSRCAccessM);
|
2022-01-20 22:39:54 +00:00
|
|
|
csrm csrm(.clk, .reset, .InstrValidNotFlushedM, .StallW,
|
2021-12-31 07:11:03 +00:00
|
|
|
.CSRMWriteM, .MTrapM, .CSRAdrM,
|
|
|
|
.NextEPCM, .NextCauseM, .NextMtvalM, .MSTATUS_REGW,
|
|
|
|
.CSRWriteValM, .CSRMReadValM, .MTVEC_REGW,
|
|
|
|
.MEPC_REGW, .MCOUNTEREN_REGW, .MCOUNTINHIBIT_REGW,
|
|
|
|
.MEDELEG_REGW, .MIDELEG_REGW,.PMPCFG_ARRAY_REGW, .PMPADDR_ARRAY_REGW,
|
|
|
|
.MIP_REGW, .MIE_REGW, .WriteMSTATUSM,
|
|
|
|
.IllegalCSRMAccessM, .IllegalCSRMWriteReadonlyM);
|
2022-01-20 22:39:54 +00:00
|
|
|
csrs csrs(.clk, .reset, .InstrValidNotFlushedM, .StallW,
|
2021-12-31 07:11:03 +00:00
|
|
|
.CSRSWriteM, .STrapM, .CSRAdrM,
|
|
|
|
.NextEPCM, .NextCauseM, .NextMtvalM, .SSTATUS_REGW,
|
|
|
|
.STATUS_TVM, .CSRWriteValM, .PrivilegeModeW,
|
|
|
|
.CSRSReadValM, .STVEC_REGW, .SEPC_REGW,
|
2022-02-15 19:20:41 +00:00
|
|
|
.SCOUNTEREN_REGW,
|
2021-12-31 07:11:03 +00:00
|
|
|
.SATP_REGW, .SIP_REGW, .SIE_REGW,
|
|
|
|
.WriteSSTATUSM, .IllegalCSRSAccessM);
|
2022-01-20 22:39:54 +00:00
|
|
|
csru csru(.clk, .reset, .InstrValidNotFlushedM, .StallW,
|
2021-12-31 07:11:03 +00:00
|
|
|
.CSRUWriteM, .CSRAdrM, .CSRWriteValM, .CSRUReadValM,
|
|
|
|
.SetFflagsM, .FRM_REGW, .WriteFRMM, .WriteFFLAGSM,
|
|
|
|
.IllegalCSRUAccessM);
|
2021-01-15 04:37:51 +00:00
|
|
|
|
2021-12-20 00:53:41 +00:00
|
|
|
// merge CSR Reads
|
2022-02-15 19:59:29 +00:00
|
|
|
assign CSRReadValM = CSRUReadValM | CSRSReadValM | CSRMReadValM | CSRCReadValM;
|
2021-12-20 00:53:41 +00:00
|
|
|
flopenrc #(`XLEN) CSRValWReg(clk, reset, FlushW, ~StallW, CSRReadValM, CSRReadValW);
|
2021-01-15 04:37:51 +00:00
|
|
|
|
2021-12-20 00:53:41 +00:00
|
|
|
// merge illegal accesses: illegal if none of the CSR addresses is legal or privilege is insufficient
|
2022-01-02 21:47:21 +00:00
|
|
|
assign InsufficientCSRPrivilegeM = (CSRAdrM[9:8] == 2'b11 & PrivilegeModeW != `M_MODE) |
|
2022-03-25 00:08:10 +00:00
|
|
|
(CSRAdrM[9:8] == 2'b01 & PrivilegeModeW == `U_MODE);
|
2022-01-02 21:47:21 +00:00
|
|
|
assign IllegalCSRAccessM = ((IllegalCSRCAccessM & IllegalCSRMAccessM &
|
2022-02-15 19:59:29 +00:00
|
|
|
IllegalCSRSAccessM & IllegalCSRUAccessM |
|
2022-01-02 21:47:21 +00:00
|
|
|
InsufficientCSRPrivilegeM) & CSRReadM) | IllegalCSRMWriteReadonlyM;
|
2021-01-15 04:37:51 +00:00
|
|
|
endmodule
|