forked from Github_Repos/cvw
Started MMU
This commit is contained in:
parent
4f71964529
commit
a26bf37be8
@ -60,6 +60,9 @@
|
|||||||
`define MEM_VIRTMEM 0
|
`define MEM_VIRTMEM 0
|
||||||
`define VECTORED_INTERRUPTS_SUPPORTED 1 // Domenico Ottolia 4/15: Support for vectored interrupts in _tvec csrs. Just implemented in src/privileged/trap.sv around line 75. Pretty sure this should be 1.
|
`define VECTORED_INTERRUPTS_SUPPORTED 1 // Domenico Ottolia 4/15: Support for vectored interrupts in _tvec csrs. Just implemented in src/privileged/trap.sv around line 75. Pretty sure this should be 1.
|
||||||
|
|
||||||
|
`define ITLB_ENTRY_BITS 5
|
||||||
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h0000000000001000
|
`define RESET_VECTOR 64'h0000000000001000
|
||||||
|
|
||||||
|
@ -60,6 +60,9 @@
|
|||||||
`define MEM_VIRTMEM 0
|
`define MEM_VIRTMEM 0
|
||||||
`define VECTORED_INTERRUPTS_SUPPORTED 1 // Domenico Ottolia 4/15: Support for vectored interrupts in _tvec csrs. Just implemented in src/privileged/trap.sv around line 75. Pretty sure this should be 1.
|
`define VECTORED_INTERRUPTS_SUPPORTED 1 // Domenico Ottolia 4/15: Support for vectored interrupts in _tvec csrs. Just implemented in src/privileged/trap.sv around line 75. Pretty sure this should be 1.
|
||||||
|
|
||||||
|
`define ITLB_ENTRY_BITS 5
|
||||||
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h0000000000001000
|
`define RESET_VECTOR 64'h0000000000001000
|
||||||
|
|
||||||
|
@ -58,6 +58,10 @@
|
|||||||
`define MEM_DTIM 1
|
`define MEM_DTIM 1
|
||||||
`define MEM_ICACHE 0
|
`define MEM_ICACHE 0
|
||||||
`define MEM_VIRTMEM 0
|
`define MEM_VIRTMEM 0
|
||||||
|
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
||||||
|
|
||||||
|
`define ITLB_ENTRY_BITS 5
|
||||||
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h00000000000100b0
|
`define RESET_VECTOR 64'h00000000000100b0
|
||||||
|
@ -60,6 +60,9 @@
|
|||||||
`define MEM_VIRTMEM 1
|
`define MEM_VIRTMEM 1
|
||||||
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
||||||
|
|
||||||
|
`define ITLB_ENTRY_BITS 5
|
||||||
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h0000000080000000
|
`define RESET_VECTOR 64'h0000000080000000
|
||||||
|
|
||||||
|
@ -59,6 +59,9 @@
|
|||||||
`define MEM_VIRTMEM 1
|
`define MEM_VIRTMEM 1
|
||||||
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
||||||
|
|
||||||
|
`define ITLB_ENTRY_BITS 5
|
||||||
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 32'h80000000
|
`define RESET_VECTOR 32'h80000000
|
||||||
|
|
||||||
|
@ -61,6 +61,9 @@
|
|||||||
`define MEM_VIRTMEM 1
|
`define MEM_VIRTMEM 1
|
||||||
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
||||||
|
|
||||||
|
`define ITLB_ENTRY_BITS 5
|
||||||
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h0000000000000000
|
`define RESET_VECTOR 64'h0000000000000000
|
||||||
|
|
||||||
|
@ -60,6 +60,9 @@
|
|||||||
`define MEM_VIRTMEM 1
|
`define MEM_VIRTMEM 1
|
||||||
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
||||||
|
|
||||||
|
`define ITLB_ENTRY_BITS 5
|
||||||
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h0000000080000000
|
`define RESET_VECTOR 64'h0000000080000000
|
||||||
|
|
||||||
|
@ -60,6 +60,9 @@
|
|||||||
`define MEM_VIRTMEM 1
|
`define MEM_VIRTMEM 1
|
||||||
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
||||||
|
|
||||||
|
`define ITLB_ENTRY_BITS 5
|
||||||
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h0000000080000000
|
`define RESET_VECTOR 64'h0000000080000000
|
||||||
|
|
||||||
|
@ -46,10 +46,6 @@
|
|||||||
//`define N_SUPPORTED ((MISA >> 13) % 2 == 1)
|
//`define N_SUPPORTED ((MISA >> 13) % 2 == 1)
|
||||||
`define N_SUPPORTED 0
|
`define N_SUPPORTED 0
|
||||||
|
|
||||||
`define M_MODE (2'b11)
|
|
||||||
`define S_MODE (2'b01)
|
|
||||||
`define U_MODE (2'b00)
|
|
||||||
|
|
||||||
// Microarchitectural Features
|
// Microarchitectural Features
|
||||||
`define UARCH_PIPELINED 1
|
`define UARCH_PIPELINED 1
|
||||||
`define UARCH_SUPERSCALR 0
|
`define UARCH_SUPERSCALR 0
|
||||||
@ -58,6 +54,10 @@
|
|||||||
`define MEM_DTIM 1
|
`define MEM_DTIM 1
|
||||||
`define MEM_ICACHE 0
|
`define MEM_ICACHE 0
|
||||||
`define MEM_VIRTMEM 0
|
`define MEM_VIRTMEM 0
|
||||||
|
`define VECTORED_INTERRUPTS_SUPPORTED 1
|
||||||
|
|
||||||
|
`define ITLB_ENTRY_BITS 5
|
||||||
|
`define DTLB_ENTRY_BITS 5
|
||||||
|
|
||||||
// Address space
|
// Address space
|
||||||
`define RESET_VECTOR 64'h0000000080000000
|
`define RESET_VECTOR 64'h0000000080000000
|
||||||
|
@ -30,23 +30,6 @@
|
|||||||
|
|
||||||
`include "wally-config.vh"
|
`include "wally-config.vh"
|
||||||
|
|
||||||
/*
|
|
||||||
// Virtual Memory Constants (sv48)
|
|
||||||
`define VPN_SEGMENT_BITS_RV64 9
|
|
||||||
`define VPN_BITS_RV64 36
|
|
||||||
`define PPN_HIGH_SEGMENT_BITS_RV64 17
|
|
||||||
`define PPN_BITS_RV64 44
|
|
||||||
`define PA_BITS_RV64 56
|
|
||||||
`define SVMODE_BITS_RV64 4
|
|
||||||
// Virtual Memory Constants (sv32)
|
|
||||||
`define VPN_SEGMENT_BITS_RV32 10
|
|
||||||
`define VPN_BITS_RV32 20
|
|
||||||
`define PPN_HIGH_SEGMENT_BITS_RV32 12
|
|
||||||
`define PPN_BITS_RV32 22
|
|
||||||
`define PA_BITS_RV32 34
|
|
||||||
`define SVMODE_BITS_RV32 1
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Virtual Memory Constants
|
// Virtual Memory Constants
|
||||||
`define VPN_SEGMENT_BITS (`XLEN == 32 ? 10 : 9)
|
`define VPN_SEGMENT_BITS (`XLEN == 32 ? 10 : 9)
|
||||||
`define VPN_BITS (`XLEN==32 ? (2*`VPN_SEGMENT_BITS) : (4*`VPN_SEGMENT_BITS))
|
`define VPN_BITS (`XLEN==32 ? (2*`VPN_SEGMENT_BITS) : (4*`VPN_SEGMENT_BITS))
|
||||||
@ -61,3 +44,4 @@
|
|||||||
`define SV32 1
|
`define SV32 1
|
||||||
`define SV39 8
|
`define SV39 8
|
||||||
`define SV48 9
|
`define SV48 9
|
||||||
|
|
||||||
|
@ -70,7 +70,17 @@ module ifu (
|
|||||||
input logic [`XLEN-1:0] SATP_REGW,
|
input logic [`XLEN-1:0] SATP_REGW,
|
||||||
input logic STATUS_MXR, STATUS_SUM,
|
input logic STATUS_MXR, STATUS_SUM,
|
||||||
input logic ITLBWriteF, ITLBFlushF,
|
input logic ITLBWriteF, ITLBFlushF,
|
||||||
output logic ITLBMissF, ITLBHitF
|
output logic ITLBMissF, ITLBHitF,
|
||||||
|
|
||||||
|
// MMU signals. *** temporarily from AHB bus but eventually replace with internal versions pre H
|
||||||
|
input logic [31:0] HADDR,
|
||||||
|
input logic [2:0] HSIZE, HBURST,
|
||||||
|
input logic HWRITE,
|
||||||
|
input logic AtomicAccessM, ExecuteAccessF, WriteAccessM, ReadAccessM,
|
||||||
|
output logic ICacheableF, IIdempotentF, IAtomicAllowedF,
|
||||||
|
output logic ISquashBusAccessF,
|
||||||
|
output logic [5:0] IHSELRegionsF
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
logic [`XLEN-1:0] UnalignedPCNextF, PCNextF;
|
logic [`XLEN-1:0] UnalignedPCNextF, PCNextF;
|
||||||
@ -86,13 +96,24 @@ module ifu (
|
|||||||
logic BPPredDirWrongE, BTBPredPCWrongE, RASPredPCWrongE, BPPredClassNonCFIWrongE;
|
logic BPPredDirWrongE, BTBPredPCWrongE, RASPredPCWrongE, BPPredClassNonCFIWrongE;
|
||||||
|
|
||||||
|
|
||||||
tlb #(.ENTRY_BITS(3), .ITLB(1)) itlb(.TLBAccessType(2'b10), .VirtualAddress(PCF),
|
/* tlb #(.ENTRY_BITS(3), .ITLB(1)) itlb(.TLBAccessType(2'b10), .VirtualAddress(PCF),
|
||||||
.PageTableEntryWrite(PageTableEntryF), .PageTypeWrite(PageTypeF),
|
.PageTableEntryWrite(PageTableEntryF), .PageTypeWrite(PageTypeF),
|
||||||
.TLBWrite(ITLBWriteF), .TLBFlush(ITLBFlushF),
|
.TLBWrite(ITLBWriteF), .TLBFlush(ITLBFlushF),
|
||||||
.PhysicalAddress(PCPF), .TLBMiss(ITLBMissF),
|
.PhysicalAddress(PCPF), .TLBMiss(ITLBMissF),
|
||||||
.TLBHit(ITLBHitF), .TLBPageFault(ITLBInstrPageFaultF),
|
.TLBHit(ITLBHitF), .TLBPageFault(ITLBInstrPageFaultF),
|
||||||
|
.*); */
|
||||||
|
mmu #(.ENTRY_BITS(`ITLB_ENTRY_BITS), .IMMU(1)) itlb(.TLBAccessType(2'b10), .VirtualAddress(PCF),
|
||||||
|
.PageTableEntryWrite(PageTableEntryF), .PageTypeWrite(PageTypeF),
|
||||||
|
.TLBWrite(ITLBWriteF), .TLBFlush(ITLBFlushF),
|
||||||
|
.PhysicalAddress(PCPF), .TLBMiss(ITLBMissF),
|
||||||
|
.TLBHit(ITLBHitF), .TLBPageFault(ITLBInstrPageFaultF),
|
||||||
|
|
||||||
|
.AtomicAccessM(1'b0), .WriteAccessM(1'b0), .ReadAccessM(1'b0),
|
||||||
|
.Cacheable(ICacheableF), .Idempotent(IIdempotentF), .AtomicAllowed(IAtomicAllowedF),
|
||||||
|
.SquashBusAccess(.ISquashBusAccssF), .HSELRegionsF(.IHSELRegionsF)),
|
||||||
.*);
|
.*);
|
||||||
|
|
||||||
|
|
||||||
// branch predictor signals
|
// branch predictor signals
|
||||||
logic SelBPPredF;
|
logic SelBPPredF;
|
||||||
logic [`XLEN-1:0] BPPredPCF, PCCorrectE, PCNext0F, PCNext1F, PCNext2F, PCNext3F;
|
logic [`XLEN-1:0] BPPredPCF, PCCorrectE, PCNext0F, PCNext1F, PCNext2F, PCNext3F;
|
||||||
|
96
wally-pipelined/src/mmu/mmu.sv
Normal file
96
wally-pipelined/src/mmu/mmu.sv
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
///////////////////////////////////////////
|
||||||
|
// mmu.sv
|
||||||
|
//
|
||||||
|
// Written: david_harris@hmc.edu and kmacsaigoren@hmc.edu 4 June 2021
|
||||||
|
// Modified:
|
||||||
|
//
|
||||||
|
// Purpose: Memory management unit, including TLB, PMA, PMP
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
///////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
`include "wally-config.vh"
|
||||||
|
|
||||||
|
// The TLB will have 2**ENTRY_BITS total entries
|
||||||
|
|
||||||
|
module mmu #(parameter IMMU = 0) (
|
||||||
|
input clk, reset,
|
||||||
|
// Current value of satp CSR (from privileged unit)
|
||||||
|
input [`XLEN-1:0] SATP_REGW,
|
||||||
|
input STATUS_MXR, STATUS_SUM,
|
||||||
|
|
||||||
|
// Current privilege level of the processeor
|
||||||
|
input [1:0] PrivilegeModeW,
|
||||||
|
|
||||||
|
// 00 - TLB is not being accessed
|
||||||
|
// 1x - TLB is accessed for a read (or an instruction)
|
||||||
|
// x1 - TLB is accessed for a write
|
||||||
|
// 11 - TLB is accessed for both read and write
|
||||||
|
input [1:0] TLBAccessType,
|
||||||
|
|
||||||
|
// Virtual address input
|
||||||
|
input [`XLEN-1:0] VirtualAddress,
|
||||||
|
|
||||||
|
// Controls for writing a new entry to the TLB
|
||||||
|
input [`XLEN-1:0] PageTableEntryWrite,
|
||||||
|
input [1:0] PageTypeWrite,
|
||||||
|
input TLBWrite,
|
||||||
|
|
||||||
|
// Invalidate all TLB entries
|
||||||
|
input TLBFlush,
|
||||||
|
|
||||||
|
// Physical address outputs
|
||||||
|
output [`XLEN-1:0] PhysicalAddress,
|
||||||
|
output TLBMiss,
|
||||||
|
output TLBHit,
|
||||||
|
|
||||||
|
// Faults
|
||||||
|
output TLBPageFault,
|
||||||
|
|
||||||
|
// PMA checker signals
|
||||||
|
input logic [31:0] HADDR,
|
||||||
|
input logic [2:0] HSIZE, HBURST,
|
||||||
|
input logic HWRITE,
|
||||||
|
input logic AtomicAccessM, ExecuteAccessF, WriteAccessM, ReadAccessM,
|
||||||
|
output logic Cacheable, Idempotent, AtomicAllowed,
|
||||||
|
output logic SquashBusAccess,
|
||||||
|
output logic [5:0] HSELRegions
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
// Translation lookaside buffer
|
||||||
|
|
||||||
|
tlb tlb #(.ENTRY_BITS(.ENTRY_BITS), .ITLB(IMMU)) itlb(.*);
|
||||||
|
|
||||||
|
///////////////////////////////////////////
|
||||||
|
// Check physical memory accesses
|
||||||
|
///////////////////////////////////////////
|
||||||
|
|
||||||
|
pmachecker pmachecker(.*);
|
||||||
|
pmpchecker pmpchecker(.*);
|
||||||
|
|
||||||
|
*** to edit
|
||||||
|
edit PMP/PMA to use phyisical address information instead of HADDR / AHB signals [Later after it works]
|
||||||
|
*move PMA checker to MMU from privileged
|
||||||
|
*move PMP checker to MMU from privileged
|
||||||
|
*delete PMA/PMP signals from priviliged & above no longer needed
|
||||||
|
replace TLB with MMU in IFU and DMEM
|
||||||
|
adjust for two PMA/PMP outputs (IFU, DMEM) instead of just one for Bus
|
||||||
|
Move M_MODE, other constants from each config file to wally-constants, #include wally-constants as needed
|
||||||
|
|
||||||
|
endmodule
|
@ -66,7 +66,7 @@ module pmachecker (
|
|||||||
|
|
||||||
assign ValidBootTim = '1;
|
assign ValidBootTim = '1;
|
||||||
assign ValidTim = '1;
|
assign ValidTim = '1;
|
||||||
assign ValidCLINT = ~ExecuteAccessF && ((HSIZE == 3'b011) || (HSIZE == 3'b010));
|
assign ValidCLINT = ~ExecuteAccessF && ((HSIZE == 3'b011 && `XLEN==64) || (HSIZE == 3'b010 && `XLEN==32));
|
||||||
assign ValidGPIO = ~ExecuteAccessF && (HSIZE == 3'b010);
|
assign ValidGPIO = ~ExecuteAccessF && (HSIZE == 3'b010);
|
||||||
assign ValidUART = ~ExecuteAccessF && (HSIZE == 3'b000);
|
assign ValidUART = ~ExecuteAccessF && (HSIZE == 3'b000);
|
||||||
assign ValidPLIC = ~ExecuteAccessF && (HSIZE == 3'b010);
|
assign ValidPLIC = ~ExecuteAccessF && (HSIZE == 3'b010);
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
`include "wally-config.vh"
|
`include "wally-config.vh"
|
||||||
|
|
||||||
|
// *** remove signals not needed by PMA/PMP now that it is moved
|
||||||
module privileged (
|
module privileged (
|
||||||
input logic clk, reset,
|
input logic clk, reset,
|
||||||
input logic FlushW,
|
input logic FlushW,
|
||||||
@ -58,15 +59,6 @@ module privileged (
|
|||||||
output logic STATUS_MXR, STATUS_SUM,
|
output logic STATUS_MXR, STATUS_SUM,
|
||||||
output logic [2:0] FRM_REGW,
|
output logic [2:0] FRM_REGW,
|
||||||
input logic FlushD, FlushE, FlushM, StallD, StallW, StallE, StallM,
|
input logic FlushD, FlushE, FlushM, StallD, StallW, StallE, StallM,
|
||||||
|
|
||||||
// PMA checker signals
|
|
||||||
input logic [31:0] HADDR,
|
|
||||||
input logic [2:0] HSIZE, HBURST,
|
|
||||||
input logic HWRITE,
|
|
||||||
input logic AtomicAccessM, ExecuteAccessF, WriteAccessM, ReadAccessM,
|
|
||||||
output logic Cacheable, Idempotent, AtomicAllowed,
|
|
||||||
output logic SquashBusAccess,
|
|
||||||
output logic [5:0] HSELRegions
|
|
||||||
);
|
);
|
||||||
|
|
||||||
logic [1:0] NextPrivilegeModeM;
|
logic [1:0] NextPrivilegeModeM;
|
||||||
@ -143,13 +135,6 @@ module privileged (
|
|||||||
|
|
||||||
csr csr(.*);
|
csr csr(.*);
|
||||||
|
|
||||||
///////////////////////////////////////////
|
|
||||||
// Check physical memory accesses
|
|
||||||
///////////////////////////////////////////
|
|
||||||
|
|
||||||
pmachecker pmachecker(.*);
|
|
||||||
pmpchecker pmpchecker(.*);
|
|
||||||
|
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
// Extract exceptions by name and handle them
|
// Extract exceptions by name and handle them
|
||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
|
Loading…
Reference in New Issue
Block a user