2021-03-04 07:39:08 +00:00
///////////////////////////////////////////
2021-03-18 18:35:46 +00:00
// tlb.sv
2021-03-04 07:39:08 +00:00
//
// Written: jtorrey@hmc.edu 16 February 2021
2021-06-01 21:50:37 +00:00
// Modified: kmacsaigoren@hmc.edu 1 June 2021
// Implemented SV48 on top of SV39. This included adding the SvMode signal,
// and using it to decide the translate signal and get the virtual page number
2021-03-04 07:39:08 +00:00
//
2021-04-13 17:37:24 +00:00
// Purpose: Translation lookaside buffer
// Cache of virtural-to-physical address translations
2021-03-04 07:39:08 +00:00
//
// 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-06-01 21:50:37 +00:00
* SV32 specs
2021-03-04 07:39:08 +00:00
* - - - - - - - - - -
* Virtual address [ 31 : 0 ] ( 32 bits )
* [ ________________________________ ]
* | - - VPN1 - - | | - - VPN0 - - | | - - - - OFF - - - |
* 10 10 12
*
* Physical address [ 33 : 0 ] ( 34 bits )
* [ __________________________________ ]
* | - - - PPN1 - - - | | - - PPN0 - - | | - - - - OFF - - - |
* 12 10 12
*
* Page Table Entry [ 31 : 0 ] ( 32 bits )
* [ ________________________________ ]
* | - - - PPN1 - - - | | - - PPN0 - - | | | DAGUXWRV
* 12 10 ^ ^
* RSW ( 2 ) - - for OS
*/
2021-04-13 16:27:12 +00:00
`include " wally-config.vh "
2021-03-04 07:39:08 +00:00
// The TLB will have 2**ENTRY_BITS total entries
2021-07-04 21:52:00 +00:00
module tlb # ( parameter TLB_ENTRIES = 8 ,
2021-04-21 23:58:36 +00:00
parameter ITLB = 0 ) (
2021-06-04 21:05:07 +00:00
input logic clk , reset ,
2021-03-04 07:39:08 +00:00
// Current value of satp CSR (from privileged unit)
2021-06-04 21:05:07 +00:00
input logic [ `XLEN - 1 : 0 ] SATP_REGW ,
2021-07-04 17:20:29 +00:00
input logic STATUS_MXR , STATUS_SUM , STATUS_MPRV ,
input logic [ 1 : 0 ] STATUS_MPP ,
2021-03-04 07:39:08 +00:00
2021-03-18 18:35:46 +00:00
// Current privilege level of the processeor
2021-06-04 21:05:07 +00:00
input logic [ 1 : 0 ] PrivilegeModeW ,
2021-03-18 18:35:46 +00:00
2021-04-21 23:58:36 +00:00
// 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
2021-07-06 07:25:11 +00:00
input logic ReadAccess , WriteAccess ,
2021-06-23 21:43:22 +00:00
input logic DisableTranslation ,
2021-03-31 02:19:27 +00:00
2021-03-04 07:39:08 +00:00
// Virtual address input
2021-06-04 21:05:07 +00:00
input logic [ `XLEN - 1 : 0 ] VirtualAddress ,
2021-03-04 07:39:08 +00:00
// Controls for writing a new entry to the TLB
2021-07-06 07:25:11 +00:00
input logic [ `XLEN - 1 : 0 ] PTE ,
2021-06-08 17:39:32 +00:00
input logic [ 1 : 0 ] PageTypeWriteVal ,
2021-06-04 21:05:07 +00:00
input logic TLBWrite ,
2021-03-04 07:39:08 +00:00
// Invalidate all TLB entries
2021-06-04 21:05:07 +00:00
input logic TLBFlush ,
2021-03-04 07:39:08 +00:00
// Physical address outputs
2021-06-18 13:11:31 +00:00
output logic [ `PA_BITS - 1 : 0 ] PhysicalAddress ,
2021-06-04 21:05:07 +00:00
output logic TLBMiss ,
output logic TLBHit ,
2021-04-08 06:44:59 +00:00
// Faults
2021-06-04 21:05:07 +00:00
output logic TLBPageFault
2021-03-04 07:39:08 +00:00
) ;
2021-03-18 18:35:46 +00:00
logic Translate ;
2021-03-04 07:39:08 +00:00
2021-06-01 21:50:37 +00:00
// Store current virtual memory mode (SV32, SV39, SV48, ect...)
2021-07-06 14:38:30 +00:00
//logic [`SVMODE_BITS-1:0] SvMode;
2021-07-04 17:20:29 +00:00
logic [ 1 : 0 ] EffectivePrivilegeMode ; // privilege mode, possibly modified by MPRV
2021-03-05 18:35:24 +00:00
2021-07-06 14:38:30 +00:00
logic [ TLB_ENTRIES - 1 : 0 ] ReadLines , WriteEnables , PTE_G ; // used as the one-hot encoding of WriteIndex
2021-03-04 07:39:08 +00:00
// Sections of the virtual and physical addresses
2021-03-05 18:35:24 +00:00
logic [ `VPN_BITS - 1 : 0 ] VirtualPageNumber ;
2021-04-08 06:44:59 +00:00
logic [ `PPN_BITS - 1 : 0 ] PhysicalPageNumber , PhysicalPageNumberMixed ;
2021-04-08 07:24:10 +00:00
logic [ `PA_BITS - 1 : 0 ] PhysicalAddressFull ;
2021-07-04 16:53:52 +00:00
logic [ `XLEN + 1 : 0 ] VAExt ;
2021-04-08 07:24:10 +00:00
// Sections of the page table entry
2021-04-08 06:44:59 +00:00
logic [ 7 : 0 ] PTEAccessBits ;
2021-03-05 18:35:24 +00:00
logic [ 11 : 0 ] PageOffset ;
2021-03-04 07:39:08 +00:00
2021-07-06 14:38:30 +00:00
logic PTE_D , PTE_A , PTE_U , PTE_X , PTE_W , PTE_R ; // Useful PTE Control Bits
2021-04-08 06:44:59 +00:00
logic [ 1 : 0 ] HitPageType ;
2021-04-08 07:24:10 +00:00
logic CAMHit ;
2021-07-06 14:38:30 +00:00
logic SV39Mode ;
2021-07-04 21:52:00 +00:00
logic [ `ASID_BITS - 1 : 0 ] ASID ;
2021-03-31 02:19:27 +00:00
2021-07-04 18:30:56 +00:00
// Grab the sv mode from SATP and determine whether translation should occur
2021-07-04 21:52:00 +00:00
assign ASID = SATP_REGW [ `ASID_BASE + `ASID_BITS - 1 : `ASID_BASE ] ;
2021-06-01 21:50:37 +00:00
2021-07-04 21:52:00 +00:00
// Determine whether to write TLB
2021-07-06 14:38:30 +00:00
assign VirtualPageNumber = VirtualAddress [ `VPN_BITS + 11 : 12 ] ;
2021-04-21 23:58:36 +00:00
2021-07-06 07:25:11 +00:00
tlbcontrol tlbcontrol ( . * ) ;
2021-04-21 23:58:36 +00:00
// TLB entries are evicted according to the LRU algorithm
2021-07-04 21:52:00 +00:00
tlblru # ( TLB_ENTRIES ) lru ( . * ) ;
2021-03-04 07:39:08 +00:00
2021-07-04 18:37:53 +00:00
// TLB memory
2021-07-04 21:52:00 +00:00
tlbram # ( TLB_ENTRIES ) tlbram ( . * ) ;
tlbcam # ( TLB_ENTRIES , `VPN_BITS + `ASID_BITS , `VPN_SEGMENT_BITS ) tlbcam ( . * ) ;
2021-04-08 06:44:59 +00:00
2021-07-04 18:59:04 +00:00
// Replace segments of the virtual page number with segments of the physical
// page number. For 4 KB pages, the entire virtual page number is replaced.
// For superpages, some segments are considered offsets into a larger page.
tlbphysicalpagemask PageMask ( VirtualPageNumber , PhysicalPageNumber , HitPageType , PhysicalPageNumberMixed ) ;
2021-04-08 07:24:10 +00:00
// Output the hit physical address if translation is currently on.
2021-07-04 18:59:04 +00:00
// Provide physical address of zero if not TLBHits, to cause segmentation error if miss somehow percolated through signal
2021-07-04 16:53:52 +00:00
assign VAExt = { 2 'b00 , VirtualAddress } ; // extend length of virtual address if necessary for RV32
2021-07-06 14:44:05 +00:00
mux2 # ( `PA_BITS ) hitmux ( '0 , { PhysicalPageNumberMixed , VirtualAddress [ 11 : 0 ] } , TLBHit , PhysicalAddressFull ) ; // set PA to 0 if TLB misses, to cause segementation error if this miss somehow passes through system
2021-07-04 16:53:52 +00:00
mux2 # ( `PA_BITS ) addressmux ( VAExt [ `PA_BITS - 1 : 0 ] , PhysicalAddressFull , Translate , PhysicalAddress ) ;
2021-03-04 07:39:08 +00:00
endmodule