mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Removed all possilbe paths to PreSelAdr from TrapM.
This commit is contained in:
		
							parent
							
								
									600c18845f
								
							
						
					
					
						commit
						36ab78ef3b
					
				
							
								
								
									
										6
									
								
								pipelined/src/cache/cache.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								pipelined/src/cache/cache.sv
									
									
									
									
										vendored
									
									
								
							@ -49,7 +49,8 @@ module cache #(parameter LINELEN,  NUMLINES,  NUMWAYS, DCACHE = 1) (
 | 
			
		||||
  output logic                CacheAccess,
 | 
			
		||||
  output logic                save, restore,
 | 
			
		||||
   // lsu control
 | 
			
		||||
  input logic                 IgnoreRequest,
 | 
			
		||||
  input logic                 IgnoreRequestTLB,
 | 
			
		||||
  input logic                 IgnoreRequestTrapM,                                                                    
 | 
			
		||||
   // Bus fsm interface
 | 
			
		||||
  output logic                CacheFetchLine,
 | 
			
		||||
  output logic                CacheWriteLine,
 | 
			
		||||
@ -182,6 +183,7 @@ module cache #(parameter LINELEN,  NUMLINES,  NUMWAYS, DCACHE = 1) (
 | 
			
		||||
  // Write Path: Write Enables
 | 
			
		||||
  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
  // *** change to structural
 | 
			
		||||
  assign SelectedWay = SelFlush ? FlushWay : (FSMLineWriteEn ? VictimWay : WayHit);
 | 
			
		||||
  assign SetValidWay = SetValid ? SelectedWay : '0;
 | 
			
		||||
  assign ClearValidWay = ClearValid ? SelectedWay : '0;
 | 
			
		||||
@ -196,7 +198,7 @@ module cache #(parameter LINELEN,  NUMLINES,  NUMWAYS, DCACHE = 1) (
 | 
			
		||||
  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
  cachefsm cachefsm(.clk, .reset, .CacheFetchLine, .CacheWriteLine, .CacheBusAck, 
 | 
			
		||||
		.RW, .Atomic, .CPUBusy, .IgnoreRequest,
 | 
			
		||||
		.RW, .Atomic, .CPUBusy, .IgnoreRequestTLB, .IgnoreRequestTrapM,
 | 
			
		||||
 		.CacheHit, .VictimDirty, .CacheStall, .CacheCommitted, 
 | 
			
		||||
		.CacheMiss, .CacheAccess, .SelAdr, .SetValid, 
 | 
			
		||||
		.ClearValid, .SetDirty, .ClearDirty, .FSMWordWriteEn,
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										47
									
								
								pipelined/src/cache/cachefsm.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								pipelined/src/cache/cachefsm.sv
									
									
									
									
										vendored
									
									
								
							@ -40,7 +40,8 @@ module cachefsm
 | 
			
		||||
   // hazard inputs
 | 
			
		||||
   input logic        CPUBusy,
 | 
			
		||||
   // interlock fsm
 | 
			
		||||
   input logic        IgnoreRequest,
 | 
			
		||||
   input logic        IgnoreRequestTLB,
 | 
			
		||||
   input logic        IgnoreRequestTrapM,   
 | 
			
		||||
   // Bus inputs
 | 
			
		||||
   input logic        CacheBusAck,
 | 
			
		||||
   // dcache internals
 | 
			
		||||
@ -79,6 +80,7 @@ module cachefsm
 | 
			
		||||
  
 | 
			
		||||
  logic [1:0]         PreSelAdr;
 | 
			
		||||
  logic               resetDelay;
 | 
			
		||||
  logic               Read, Write, AMO;
 | 
			
		||||
  logic               DoAMO, DoRead, DoWrite, DoFlush;
 | 
			
		||||
  logic               DoAMOHit, DoReadHit, DoWriteHit;
 | 
			
		||||
  logic               DoAMOMiss, DoReadMiss, DoWriteMiss;
 | 
			
		||||
@ -104,15 +106,23 @@ module cachefsm
 | 
			
		||||
					   STATE_FLUSH_CLEAR_DIRTY} statetype;
 | 
			
		||||
 | 
			
		||||
  (* mark_debug = "true" *) statetype CurrState, NextState;
 | 
			
		||||
  logic               IgnoreRequest;
 | 
			
		||||
  assign IgnoreRequest = IgnoreRequestTLB | IgnoreRequestTrapM;
 | 
			
		||||
 | 
			
		||||
  assign DoFlush = FlushCache & ~IgnoreRequest; // *** have to fix ignorerequest timing path
 | 
			
		||||
  assign DoAMO = Atomic[1] & (&RW) & ~IgnoreRequest; // ***
 | 
			
		||||
  // if the command is used in the READY state then the cache needs to be able to supress
 | 
			
		||||
  // using both IgnoreRequestTLB and IgnoreRequestTrapM.  Otherwise we can just use IgnoreRequestTLB.
 | 
			
		||||
 | 
			
		||||
  assign DoFlush = FlushCache & ~IgnoreRequest;
 | 
			
		||||
  assign AMO = Atomic[1] & (&RW);  
 | 
			
		||||
  assign DoAMO = AMO & ~IgnoreRequest; // ***
 | 
			
		||||
  assign DoAMOHit = DoAMO & CacheHit;
 | 
			
		||||
  assign DoAMOMiss = DoAMO & ~CacheHit;
 | 
			
		||||
  assign DoRead = RW[1] & ~IgnoreRequest; // ***
 | 
			
		||||
  assign Read = RW[1];
 | 
			
		||||
  assign DoRead = Read & ~IgnoreRequest; // ***
 | 
			
		||||
  assign DoReadHit = DoRead & CacheHit;
 | 
			
		||||
  assign DoReadMiss = DoRead & ~CacheHit;
 | 
			
		||||
  assign DoWrite = RW[0] & ~IgnoreRequest; // ***
 | 
			
		||||
  assign Write = RW[0];
 | 
			
		||||
  assign DoWrite = Write & ~IgnoreRequest; // ***
 | 
			
		||||
  assign DoWriteHit = DoWrite & CacheHit;
 | 
			
		||||
  assign DoWriteMiss = DoWrite & ~CacheHit;
 | 
			
		||||
 | 
			
		||||
@ -135,20 +145,21 @@ module cachefsm
 | 
			
		||||
  always_comb begin
 | 
			
		||||
    NextState = STATE_READY;
 | 
			
		||||
    case (CurrState)
 | 
			
		||||
      STATE_READY: if(DoFlush)                                      NextState = STATE_FLUSH;
 | 
			
		||||
                   else if(DoAMOHit & CPUBusy)                      NextState = STATE_CPU_BUSY_FINISH_AMO;
 | 
			
		||||
      STATE_READY: if(IgnoreRequest)                                NextState = STATE_READY;
 | 
			
		||||
                   else if(DoFlush)                                 NextState = STATE_FLUSH;
 | 
			
		||||
                   else if(DoAMOHit & CPUBusy)                      NextState = STATE_CPU_BUSY_FINISH_AMO; // change
 | 
			
		||||
                   else if(DoReadHit & CPUBusy)                     NextState = STATE_CPU_BUSY;
 | 
			
		||||
                   else if(DoWriteHit & CPUBusy)                    NextState = STATE_CPU_BUSY;
 | 
			
		||||
                   else if(DoReadMiss | DoWriteMiss | DoAMOMiss)    NextState = STATE_MISS_FETCH_WDV;
 | 
			
		||||
                   else if(DoReadMiss | DoWriteMiss | DoAMOMiss)    NextState = STATE_MISS_FETCH_WDV; // change
 | 
			
		||||
                   else                                             NextState = STATE_READY;
 | 
			
		||||
      STATE_MISS_FETCH_WDV: if (CacheBusAck)                        NextState = STATE_MISS_FETCH_DONE;
 | 
			
		||||
                            else                                    NextState = STATE_MISS_FETCH_WDV;
 | 
			
		||||
      STATE_MISS_FETCH_DONE: if(VictimDirty)                        NextState = STATE_MISS_EVICT_DIRTY;
 | 
			
		||||
                             else                                   NextState = STATE_MISS_WRITE_CACHE_LINE;
 | 
			
		||||
      STATE_MISS_WRITE_CACHE_LINE:                                  NextState = STATE_MISS_READ_WORD;
 | 
			
		||||
      STATE_MISS_READ_WORD: if (DoWrite & ~DoAMO)                   NextState = STATE_MISS_WRITE_WORD;
 | 
			
		||||
      STATE_MISS_READ_WORD: if (Write & ~AMO)                       NextState = STATE_MISS_WRITE_WORD;
 | 
			
		||||
                            else                                    NextState = STATE_MISS_READ_WORD_DELAY;
 | 
			
		||||
      STATE_MISS_READ_WORD_DELAY: if(DoAMO & CPUBusy)               NextState = STATE_CPU_BUSY_FINISH_AMO;
 | 
			
		||||
      STATE_MISS_READ_WORD_DELAY: if(AMO & CPUBusy)                 NextState = STATE_CPU_BUSY_FINISH_AMO;
 | 
			
		||||
                                  else if(CPUBusy)                  NextState = STATE_CPU_BUSY;
 | 
			
		||||
                                  else                              NextState = STATE_READY;
 | 
			
		||||
      STATE_MISS_WRITE_WORD: if(CPUBusy)                            NextState = STATE_CPU_BUSY;
 | 
			
		||||
@ -192,12 +203,12 @@ module cachefsm
 | 
			
		||||
  assign ClearValid = '0;
 | 
			
		||||
  assign SetDirty = (CurrState == STATE_READY & DoAMO) |
 | 
			
		||||
                    (CurrState == STATE_READY & DoWrite) |
 | 
			
		||||
                    (CurrState == STATE_MISS_READ_WORD_DELAY & DoAMO) |
 | 
			
		||||
                    (CurrState == STATE_MISS_READ_WORD_DELAY & AMO) |
 | 
			
		||||
                    (CurrState == STATE_MISS_WRITE_WORD);
 | 
			
		||||
  assign ClearDirty = (CurrState == STATE_MISS_WRITE_CACHE_LINE) |
 | 
			
		||||
                      (CurrState == STATE_FLUSH_CLEAR_DIRTY);
 | 
			
		||||
  assign FSMWordWriteEn = (CurrState == STATE_READY & (DoAMOHit | DoWriteHit)) |
 | 
			
		||||
                          (CurrState == STATE_MISS_READ_WORD_DELAY & DoAMO) |
 | 
			
		||||
                          (CurrState == STATE_MISS_READ_WORD_DELAY & AMO) |
 | 
			
		||||
                          (CurrState == STATE_MISS_WRITE_WORD);
 | 
			
		||||
  assign FSMLineWriteEn = (CurrState == STATE_MISS_WRITE_CACHE_LINE);
 | 
			
		||||
  assign LRUWriteEn = (CurrState == STATE_READY & (DoAMOHit | DoReadHit | DoWriteHit)) |
 | 
			
		||||
@ -221,19 +232,19 @@ module cachefsm
 | 
			
		||||
  // handle cpu stall.
 | 
			
		||||
  assign restore = ((CurrState == STATE_CPU_BUSY) | (CurrState == STATE_CPU_BUSY_FINISH_AMO)) & ~`REPLAY;
 | 
			
		||||
  assign save = ((CurrState == STATE_READY & (DoAMOHit | DoReadHit | DoWriteHit) & CPUBusy) |
 | 
			
		||||
                 (CurrState == STATE_MISS_READ_WORD_DELAY & (DoAMO | DoRead) & CPUBusy) |
 | 
			
		||||
                 (CurrState == STATE_MISS_READ_WORD_DELAY & (AMO | Read) & CPUBusy) |
 | 
			
		||||
                 (CurrState == STATE_MISS_WRITE_WORD & DoWrite & CPUBusy)) & ~`REPLAY;
 | 
			
		||||
 | 
			
		||||
  // **** can this be simplified?
 | 
			
		||||
  assign PreSelAdr = ((CurrState == STATE_READY & IgnoreRequest) | // *** ignorerequest comes from TrapM. Have to fix.  why is ignorerequest here anyway?
 | 
			
		||||
                      (CurrState == STATE_READY & DoAMOHit) |  //<opHit> also depends on ignorerequest
 | 
			
		||||
                      (CurrState == STATE_READY & DoReadHit & (CPUBusy & `REPLAY)) |
 | 
			
		||||
                      (CurrState == STATE_READY & DoWriteHit) |
 | 
			
		||||
  assign PreSelAdr = ((CurrState == STATE_READY & IgnoreRequestTLB) | // Ignore Request is needed on TLB miss.
 | 
			
		||||
                      (CurrState == STATE_READY & (AMO & CacheHit)) |  // change
 | 
			
		||||
                      (CurrState == STATE_READY & (Read & CacheHit) & (CPUBusy & `REPLAY)) |
 | 
			
		||||
                      (CurrState == STATE_READY & (Write & CacheHit)) |
 | 
			
		||||
                      (CurrState == STATE_MISS_FETCH_WDV) |
 | 
			
		||||
                      (CurrState == STATE_MISS_FETCH_DONE) | 
 | 
			
		||||
                      (CurrState == STATE_MISS_WRITE_CACHE_LINE) | 
 | 
			
		||||
                      (CurrState == STATE_MISS_READ_WORD) |
 | 
			
		||||
                      (CurrState == STATE_MISS_READ_WORD_DELAY & (DoAMO | (CPUBusy & `REPLAY))) | // ***
 | 
			
		||||
                      (CurrState == STATE_MISS_READ_WORD_DELAY & (AMO | (CPUBusy & `REPLAY))) | // ***
 | 
			
		||||
                      (CurrState == STATE_MISS_WRITE_WORD) |
 | 
			
		||||
                      (CurrState == STATE_MISS_EVICT_DIRTY) |
 | 
			
		||||
                      (CurrState == STATE_CPU_BUSY & (CPUBusy & `REPLAY)) |
 | 
			
		||||
 | 
			
		||||
@ -210,7 +210,7 @@ module ifu (
 | 
			
		||||
      cache #(.LINELEN(`ICACHE_LINELENINBITS),
 | 
			
		||||
              .NUMLINES(`ICACHE_WAYSIZEINBYTES*8/`ICACHE_LINELENINBITS),
 | 
			
		||||
              .NUMWAYS(`ICACHE_NUMWAYS), .DCACHE(0))
 | 
			
		||||
      icache(.clk, .reset, .CPUBusy, .IgnoreRequest(ITLBMissF), 
 | 
			
		||||
      icache(.clk, .reset, .CPUBusy, .IgnoreRequestTLB(ITLBMissF), .IgnoreRequestTrapM('0),
 | 
			
		||||
             .CacheMemWriteData(ICacheMemWriteData), .CacheBusAck(ICacheBusAck),
 | 
			
		||||
             .CacheBusAdr(ICacheBusAdr), .CacheStall(ICacheStallF), 
 | 
			
		||||
             .CacheFetchLine(ICacheFetchLine),
 | 
			
		||||
 | 
			
		||||
@ -45,7 +45,8 @@ module interlockfsm
 | 
			
		||||
   output logic InterlockStall,
 | 
			
		||||
   output logic SelReplayCPURequest,
 | 
			
		||||
   output logic SelHPTW,
 | 
			
		||||
   output logic IgnoreRequest);
 | 
			
		||||
   output logic IgnoreRequestTLB,
 | 
			
		||||
   output logic IgnoreRequestTrapM);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  typedef enum  {STATE_T0_READY,
 | 
			
		||||
@ -111,7 +112,8 @@ module interlockfsm
 | 
			
		||||
  assign SelReplayCPURequest = (InterlockNextState == STATE_T0_REPLAY);
 | 
			
		||||
  assign SelHPTW = (InterlockCurrState == STATE_T3_DTLB_MISS) | (InterlockCurrState == STATE_T4_ITLB_MISS) |
 | 
			
		||||
				   (InterlockCurrState == STATE_T5_ITLB_MISS) | (InterlockCurrState == STATE_T7_DITLB_MISS);
 | 
			
		||||
	  assign IgnoreRequest = (InterlockCurrState == STATE_T0_READY & (ITLBMissF | DTLBMissM | TrapM)) |
 | 
			
		||||
  assign IgnoreRequestTLB = (InterlockCurrState == STATE_T0_READY & (ITLBMissF | DTLBMissM));
 | 
			
		||||
  assign IgnoreRequestTrapM = (InterlockCurrState == STATE_T0_READY & (TrapM)) |
 | 
			
		||||
							  ((InterlockCurrState == STATE_T0_REPLAY) & (TrapM));
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
@ -98,7 +98,7 @@ module lsu (
 | 
			
		||||
  logic                     SelHPTW;
 | 
			
		||||
  logic                     BusStall;
 | 
			
		||||
  logic                     InterlockStall;
 | 
			
		||||
  logic                     IgnoreRequest;
 | 
			
		||||
  logic                     IgnoreRequestTLB, IgnoreRequestTrapM;
 | 
			
		||||
  logic                     BusCommittedM, DCacheCommittedM;
 | 
			
		||||
 | 
			
		||||
  flopenrc #(`XLEN) AddressMReg(clk, reset, FlushM, ~StallM, IEUAdrE, IEUAdrM);
 | 
			
		||||
@ -116,11 +116,11 @@ module lsu (
 | 
			
		||||
                          .ReadDataM, .Funct3M, .LSUFunct3M, .Funct7M, .LSUFunct7M, .IEUAdrM,
 | 
			
		||||
                          .IEUAdrExtM, .PTE, .PageType, .PreLSURWM, .LSUAtomicM, .IEUAdrE,
 | 
			
		||||
                          .LSUAdrE, .PreLSUPAdrM, .CPUBusy, .InterlockStall, .SelHPTW,
 | 
			
		||||
                          .IgnoreRequest);
 | 
			
		||||
                          .IgnoreRequestTLB, .IgnoreRequestTrapM);
 | 
			
		||||
 | 
			
		||||
  end else begin
 | 
			
		||||
    assign {InterlockStall, SelHPTW, PTE, PageType, DTLBWriteM, ITLBWriteF} = '0;
 | 
			
		||||
    assign IgnoreRequest = TrapM; assign CPUBusy = StallW; assign PreLSURWM = MemRWM; 
 | 
			
		||||
    assign {InterlockStall, SelHPTW, PTE, PageType, DTLBWriteM, ITLBWriteF, IgnoreRequestTLB} = '0;
 | 
			
		||||
    assign IgnoreRequestTrapM = TrapM; assign CPUBusy = StallW; assign PreLSURWM = MemRWM; 
 | 
			
		||||
    assign LSUAdrE = PreLSUAdrE; assign PreLSUAdrE = IEUAdrE[11:0]; 
 | 
			
		||||
    assign PreLSUPAdrM = IEUAdrExtM[`PA_BITS-1:0];
 | 
			
		||||
    assign LSUFunct3M = Funct3M;  assign LSUFunct7M = Funct7M; assign LSUAtomicM = AtomicM;
 | 
			
		||||
@ -202,7 +202,7 @@ module lsu (
 | 
			
		||||
      .WordCount,
 | 
			
		||||
      .LSUFunct3M, .LSUBusAdr, .DCacheBusAdr, .DCacheFetchLine,
 | 
			
		||||
      .DCacheWriteLine, .DCacheBusAck, .DCacheMemWriteData, .LSUPAdrM, .FinalAMOWriteDataM,
 | 
			
		||||
      .ReadDataWordM, .ReadDataWordMuxM, .IgnoreRequest, .LSURWM, .CPUBusy, .CacheableM,
 | 
			
		||||
      .ReadDataWordM, .ReadDataWordMuxM, .IgnoreRequest(IgnoreRequestTLB | IgnoreRequestTrapM), .LSURWM, .CPUBusy, .CacheableM,
 | 
			
		||||
      .BusStall, .BusCommittedM);
 | 
			
		||||
 | 
			
		||||
    assign WordOffsetAddr = LSUBusWrite ? ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) : LSUPAdrM;
 | 
			
		||||
@ -217,7 +217,7 @@ module lsu (
 | 
			
		||||
        .save, .restore,
 | 
			
		||||
        .FinalWriteData(FinalWriteDataM),
 | 
			
		||||
        .CacheStall(DCacheStallM), .CacheMiss(DCacheMiss), .CacheAccess(DCacheAccess),
 | 
			
		||||
        .IgnoreRequest, .CacheCommitted(DCacheCommittedM), .CacheBusAdr(DCacheBusAdr),
 | 
			
		||||
        .IgnoreRequestTLB, .IgnoreRequestTrapM, .CacheCommitted(DCacheCommittedM), .CacheBusAdr(DCacheBusAdr),
 | 
			
		||||
        .ReadDataLine(ReadDataLineM), .CacheMemWriteData(DCacheMemWriteData),
 | 
			
		||||
        .CacheFetchLine(DCacheFetchLine), .CacheWriteLine(DCacheWriteLine), 
 | 
			
		||||
        .CacheBusAck(DCacheBusAck), .InvalidateCacheM(1'b0));
 | 
			
		||||
@ -248,7 +248,7 @@ module lsu (
 | 
			
		||||
 | 
			
		||||
  if (`A_SUPPORTED) begin:atomic
 | 
			
		||||
    atomic atomic(.clk, .reset, .FlushW, .CPUBusy, .ReadDataM, .WriteDataM, .LSUPAdrM, 
 | 
			
		||||
      .LSUFunct7M, .LSUFunct3M, .LSUAtomicM, .PreLSURWM, .IgnoreRequest, 
 | 
			
		||||
      .LSUFunct7M, .LSUFunct3M, .LSUAtomicM, .PreLSURWM, .IgnoreRequest(IgnoreRequestTLB | IgnoreRequestTrapM), 
 | 
			
		||||
      .DTLBMissM, .FinalAMOWriteDataM, .SquashSCW, .LSURWM);
 | 
			
		||||
  end else begin:lrsc
 | 
			
		||||
    assign SquashSCW = 0; assign LSURWM = PreLSURWM; assign FinalAMOWriteDataM = WriteDataM;
 | 
			
		||||
 | 
			
		||||
@ -59,7 +59,8 @@ module lsuvirtmem(
 | 
			
		||||
  output logic                InterlockStall,
 | 
			
		||||
  output logic                CPUBusy,
 | 
			
		||||
  output logic                SelHPTW,
 | 
			
		||||
  output logic                IgnoreRequest);
 | 
			
		||||
  output logic                IgnoreRequestTLB, 
 | 
			
		||||
  output logic                IgnoreRequestTrapM);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  logic                       AnyCPUReqM;
 | 
			
		||||
@ -76,7 +77,7 @@ module lsuvirtmem(
 | 
			
		||||
  interlockfsm interlockfsm (
 | 
			
		||||
    .clk, .reset, .AnyCPUReqM, .ITLBMissF, .ITLBWriteF,
 | 
			
		||||
    .DTLBMissM, .DTLBWriteM, .TrapM, .DCacheStallM,
 | 
			
		||||
    .InterlockStall, .SelReplayCPURequest, .SelHPTW, .IgnoreRequest);
 | 
			
		||||
    .InterlockStall, .SelReplayCPURequest, .SelHPTW, .IgnoreRequestTLB, .IgnoreRequestTrapM);
 | 
			
		||||
  hptw hptw( // *** remove logic from (), mention this in style guide CH3
 | 
			
		||||
    .clk, .reset, .SATP_REGW, .PCF, .IEUAdrM,
 | 
			
		||||
    .ITLBMissF(ITLBMissF & ~TrapM), .DTLBMissM(DTLBMissM & ~TrapM),
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user