2021-01-15 04:37:51 +00:00
///////////////////////////////////////////
// wallypipelinedhart.sv
//
// Written: David_Harris@hmc.edu 9 January 2021
// Modified:
//
// Purpose: Pipelined RISC-V Processor
//
// A component of the Wally configurable RISC-V project.
//
// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
//
// 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:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
//
// 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-23 15:48:12 +00:00
`include " wally-config.vh "
2021-01-27 11:40:26 +00:00
/* verilator lint_on UNUSED */
2021-01-15 04:37:51 +00:00
2021-01-25 20:57:36 +00:00
module wallypipelinedhart (
2021-02-02 04:44:41 +00:00
input logic clk , reset ,
2021-01-23 15:48:12 +00:00
output logic [ `XLEN - 1 : 0 ] PCF ,
2021-02-09 16:02:17 +00:00
// input logic [31:0] InstrF,
2021-01-30 04:43:48 +00:00
// Privileged
2021-02-02 04:44:41 +00:00
input logic TimerIntM , ExtIntM , SwIntM ,
input logic InstrAccessFaultF ,
input logic DataAccessFaultM ,
2021-06-18 11:53:49 +00:00
input logic [ 63 : 0 ] MTIME_CLINT , MTIMECMP_CLINT ,
2021-01-29 06:07:17 +00:00
// Bus Interface
2021-02-24 12:25:03 +00:00
input logic [ 15 : 0 ] rd2 , // bogus, delete when real multicycle fetch works
2021-01-29 06:07:17 +00:00
input logic [ `AHBW - 1 : 0 ] HRDATA ,
input logic HREADY , HRESP ,
2021-01-30 05:56:12 +00:00
output logic HCLK , HRESETn ,
2021-01-29 06:07:17 +00:00
output logic [ 31 : 0 ] HADDR ,
output logic [ `AHBW - 1 : 0 ] HWDATA ,
output logic HWRITE ,
output logic [ 2 : 0 ] HSIZE ,
output logic [ 2 : 0 ] HBURST ,
output logic [ 3 : 0 ] HPROT ,
output logic [ 1 : 0 ] HTRANS ,
2021-02-08 04:21:55 +00:00
output logic HMASTLOCK ,
2021-04-22 19:34:02 +00:00
output logic [ 5 : 0 ] HSELRegions ,
2021-02-08 04:21:55 +00:00
// Delayed signals for subword write
output logic [ 2 : 0 ] HADDRD ,
output logic [ 3 : 0 ] HSIZED ,
2021-06-23 05:41:00 +00:00
output logic HWRITED
2021-01-29 06:07:17 +00:00
) ;
2021-01-15 04:37:51 +00:00
2021-03-30 19:25:07 +00:00
// logic [1:0] ForwardAE, ForwardBE;
2021-02-08 04:21:55 +00:00
logic StallF , StallD , StallE , StallM , StallW ;
2021-03-04 19:35:46 +00:00
logic FlushF , FlushD , FlushE , FlushM , FlushW ;
2021-06-02 14:03:19 +00:00
logic RetM , TrapM , NonBusTrapM ;
2021-01-15 04:37:51 +00:00
2021-01-27 12:46:52 +00:00
// new signals that must connect through DP
2021-02-16 03:27:35 +00:00
logic MulDivE , W64E ;
2021-03-11 05:11:31 +00:00
logic CSRReadM , CSRWriteM , PrivilegedM ;
logic [ 1 : 0 ] AtomicM ;
2021-02-16 03:27:35 +00:00
logic [ `XLEN - 1 : 0 ] SrcAE , SrcBE ;
2021-01-27 12:46:52 +00:00
logic [ `XLEN - 1 : 0 ] SrcAM ;
2021-02-16 03:27:35 +00:00
logic [ 2 : 0 ] Funct3E ;
2021-04-04 01:28:24 +00:00
// logic [31:0] InstrF;
2021-05-29 03:11:37 +00:00
logic [ 31 : 0 ] InstrD , InstrE , InstrM , InstrW ;
logic [ `XLEN - 1 : 0 ] PCD , PCE , PCM , PCLinkE , PCLinkW ;
2021-01-28 03:49:47 +00:00
logic [ `XLEN - 1 : 0 ] PCTargetE ;
2021-06-24 15:20:21 +00:00
logic [ `XLEN - 1 : 0 ] CSRReadValM , MulDivResultM , CSRReadValW , MulDivResultW ;
2021-01-27 12:46:52 +00:00
logic [ `XLEN - 1 : 0 ] PrivilegedNextPCM ;
2021-01-29 20:37:51 +00:00
logic [ 1 : 0 ] MemRWM ;
2021-06-02 14:03:19 +00:00
logic InstrValidM , InstrValidW ;
2021-01-28 03:49:47 +00:00
logic InstrMisalignedFaultM ;
2021-01-29 20:37:51 +00:00
logic DataMisalignedM ;
2021-01-28 03:49:47 +00:00
logic IllegalBaseInstrFaultD , IllegalIEUInstrFaultD ;
2021-04-21 23:58:36 +00:00
logic ITLBInstrPageFaultF , DTLBLoadPageFaultM , DTLBStorePageFaultM ;
logic WalkerInstrPageFaultF , WalkerLoadPageFaultM , WalkerStorePageFaultM ;
2021-01-27 12:46:52 +00:00
logic LoadMisalignedFaultM , LoadAccessFaultM ;
logic StoreMisalignedFaultM , StoreAccessFaultM ;
logic [ `XLEN - 1 : 0 ] InstrMisalignedAdrM ;
2021-01-27 11:40:26 +00:00
logic PCSrcE ;
logic CSRWritePendingDEM ;
2021-05-27 19:23:28 +00:00
logic FPUStallD , LoadStallD , MulDivStallD , CSRRdStallD ;
2021-04-04 02:12:52 +00:00
logic DivDoneE ;
logic DivBusyE ;
2021-04-04 01:28:24 +00:00
logic DivDoneW ;
2021-01-15 04:37:51 +00:00
logic [ 4 : 0 ] SetFflagsM ;
logic [ 2 : 0 ] FRM_REGW ;
logic FloatRegWriteW ;
2021-05-21 02:17:59 +00:00
logic [ 1 : 0 ] FMemRWM ;
logic RegWriteD ;
logic [ `XLEN - 1 : 0 ] FWriteDataM ;
2021-06-24 15:20:21 +00:00
logic SquashSCM , SquashSCW ;
2021-05-23 22:33:14 +00:00
logic FStallD ;
2021-05-27 19:23:28 +00:00
logic FWriteIntE , FWriteIntW , FWriteIntM ;
2021-06-05 16:06:33 +00:00
logic FDivBusyE ;
2021-05-18 14:42:51 +00:00
logic IllegalFPUInstrD , IllegalFPUInstrE ;
2021-04-03 20:52:26 +00:00
logic [ `XLEN - 1 : 0 ] FPUResultW ;
2021-01-30 04:43:48 +00:00
2021-03-04 08:11:34 +00:00
// memory management unit signals
2021-03-05 06:22:53 +00:00
logic ITLBWriteF , DTLBWriteM ;
2021-04-01 19:55:05 +00:00
logic ITLBFlushF , DTLBFlushM ;
2021-03-04 08:11:34 +00:00
logic ITLBMissF , ITLBHitF ;
2021-03-04 08:30:06 +00:00
logic DTLBMissM , DTLBHitM ;
2021-03-05 06:22:53 +00:00
logic [ `XLEN - 1 : 0 ] SATP_REGW ;
2021-04-21 23:58:36 +00:00
logic STATUS_MXR , STATUS_SUM ;
2021-03-18 18:35:46 +00:00
logic [ 1 : 0 ] PrivilegeModeW ;
2021-03-05 06:22:53 +00:00
logic [ `XLEN - 1 : 0 ] PageTableEntryF , PageTableEntryM ;
2021-04-08 06:44:59 +00:00
logic [ 1 : 0 ] PageTypeF , PageTypeM ;
2021-03-04 08:11:34 +00:00
2021-04-22 19:34:02 +00:00
// PMA checker signals
2021-06-23 05:41:00 +00:00
logic AtomicAccessM , ExecuteAccessF , WriteAccessM , ReadAccessM ;
2021-06-04 21:05:07 +00:00
logic PMPInstrAccessFaultF , PMPLoadAccessFaultM , PMPStoreAccessFaultM ;
logic PMAInstrAccessFaultF , PMALoadAccessFaultM , PMAStoreAccessFaultM ;
logic DSquashBusAccessM , ISquashBusAccessF ;
logic [ 5 : 0 ] DHSELRegionsM , IHSELRegionsF ;
2021-06-21 05:17:08 +00:00
var logic [ `XLEN - 1 : 0 ] PMPADDR_ARRAY_REGW [ `PMP_ENTRIES - 1 : 0 ] ;
2021-06-04 21:05:07 +00:00
logic [ 63 : 0 ] PMPCFG01_REGW , PMPCFG23_REGW ; // signals being sent from privileged unit to pmp/pma in dmem and ifu.
assign HSELRegions = ExecuteAccessF ? IHSELRegionsF : DHSELRegionsM ; // *** this is a pure guess on how one of these should be selected. it passes tests, but is it the right way to do this?
2021-04-22 19:34:02 +00:00
2021-03-30 19:25:07 +00:00
// IMem stalls
logic ICacheStallF ;
2021-03-18 18:35:46 +00:00
logic [ `XLEN - 1 : 0 ] MMUPAdr , MMUReadPTE ;
2021-04-22 05:51:38 +00:00
logic MMUStall ;
2021-05-14 11:14:20 +00:00
logic MMUTranslate , MMUReady ;
2021-03-18 18:35:46 +00:00
2021-02-02 18:02:31 +00:00
// bus interface to dmem
2021-02-08 04:21:55 +00:00
logic MemReadM , MemWriteM ;
2021-04-23 21:47:23 +00:00
logic [ 1 : 0 ] AtomicMaskedM ;
2021-02-08 04:21:55 +00:00
logic [ 2 : 0 ] Funct3M ;
2021-06-18 13:36:22 +00:00
logic [ `XLEN - 1 : 0 ] MemAdrM , WriteDataM ;
logic [ `PA_BITS - 1 : 0 ] MemPAdrM ;
2021-06-24 15:20:21 +00:00
logic [ `XLEN - 1 : 0 ] ReadDataM , ReadDataW ;
2021-06-23 20:13:56 +00:00
logic [ `PA_BITS - 1 : 0 ] InstrPAdrF ;
2021-02-24 12:25:03 +00:00
logic [ `XLEN - 1 : 0 ] InstrRData ;
2021-02-08 04:21:55 +00:00
logic InstrReadF ;
2021-03-25 04:46:51 +00:00
logic DataStall ;
2021-03-24 20:56:44 +00:00
logic InstrAckF , MemAckW ;
2021-06-08 16:32:46 +00:00
logic CommitM , CommittedM ;
2021-03-23 18:25:51 +00:00
2021-03-31 16:54:02 +00:00
logic BPPredWrongE ;
logic BPPredDirWrongM ;
logic BTBPredPCWrongM ;
logic RASPredPCWrongM ;
logic BPPredClassNonCFIWrongM ;
2021-05-21 02:17:59 +00:00
logic [ `XLEN - 1 : 0 ] WriteDatatmpM ;
2021-03-31 16:54:02 +00:00
logic [ 4 : 0 ] InstrClassM ;
2021-06-24 15:20:21 +00:00
2021-02-24 12:25:03 +00:00
ifu ifu ( . InstrInF ( InstrRData ) , . * ) ; // instruction fetch unit: PC, branch prediction, instruction cache
2021-01-28 03:49:47 +00:00
2021-02-20 02:09:07 +00:00
ieu ieu ( . * ) ; // integer execution unit: integer register file, datapath and controller
2021-05-21 02:17:59 +00:00
mux2 # ( `XLEN ) OutputInput2mux ( WriteDataM , FWriteDataM , FMemRWM [ 0 ] , WriteDatatmpM ) ;
2021-06-23 03:03:43 +00:00
lsu lsu ( . MemRWM ( MemRWM | FMemRWM ) , . WriteDataM ( WriteDatatmpM ) , . * ) ; // data cache unit
2021-01-28 06:03:12 +00:00
2021-02-08 04:21:55 +00:00
ahblite ebu (
//.InstrReadF(1'b0),
2021-02-24 12:25:03 +00:00
//.InstrRData(InstrF), // hook up InstrF later
2021-05-21 02:17:59 +00:00
. WriteDataM ( WriteDatatmpM ) ,
2021-02-08 04:21:55 +00:00
. MemSizeM ( Funct3M [ 1 : 0 ] ) , . UnsignedLoadM ( Funct3M [ 2 ] ) ,
2021-03-11 05:11:31 +00:00
. Funct7M ( InstrM [ 31 : 25 ] ) ,
2021-01-29 06:07:17 +00:00
. * ) ;
2021-02-09 16:02:17 +00:00
2021-04-04 01:28:24 +00:00
pagetablewalker pagetablewalker ( . * ) ; // can send addresses to ahblite, send out pagetablestall
// *** can connect to hazard unit
// changing from this to the line above breaks the program. auipc at 104 fails; seems to be flushed.
// Would need to insertinstruction as InstrD, not InstrF
/ * ahblite ebu (
. InstrReadF ( 1 'b0 ) ,
. InstrRData ( ) , // hook up InstrF later
. MemSizeM ( Funct3M [ 1 : 0 ] ) , . UnsignedLoadM ( Funct3M [ 2 ] ) ,
. * ) ; */
2021-01-29 06:07:17 +00:00
2021-02-16 03:27:35 +00:00
muldiv mdu ( . * ) ; // multiply and divide unit
2021-04-03 20:52:26 +00:00
2021-01-27 11:40:26 +00:00
hazard hzu ( . * ) ; // global stall and flush control
// Priveleged block operates in M and W stages, handling CSRs and exceptions
2021-01-27 12:46:52 +00:00
privileged priv ( . * ) ;
2021-04-03 20:52:26 +00:00
2021-01-27 11:40:26 +00:00
2021-06-08 16:32:46 +00:00
fpu fpu ( . * ) ; // floating point unit
2021-01-15 04:37:51 +00:00
// add FPU here, with SetFflagsM, FRM_REGW
// presently stub out SetFlagsM and FloatRegWriteW
2021-04-03 20:52:26 +00:00
//assign SetFflagsM = 0;
//assign FloatRegWriteW = 0;
2021-01-19 01:16:53 +00:00
2021-01-15 04:37:51 +00:00
endmodule