forked from Github_Repos/cvw
		
	Cleanup + critical path optimizations.
This commit is contained in:
		
							parent
							
								
									88c7a94aa9
								
							
						
					
					
						commit
						fdb4f909fc
					
				
							
								
								
									
										14
									
								
								pipelined/src/cache/cache.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								pipelined/src/cache/cache.sv
									
									
									
									
										vendored
									
									
								
							@ -97,7 +97,7 @@ module cache #(parameter LINELEN,  NUMLINES,  NUMWAYS, DCACHE = 1) (
 | 
			
		||||
  logic                       LRUWriteEn;
 | 
			
		||||
  logic                       SelFlush;
 | 
			
		||||
  logic                       ResetOrFlushAdr, ResetOrFlushWay;
 | 
			
		||||
  logic [NUMWAYS-1:0]         WayHitSaved, WayHitRaw;
 | 
			
		||||
  logic [NUMWAYS-1:0]         WayHitSaved, WayHitFinal;
 | 
			
		||||
  logic [NUMWAYS-1:0]         SelectedWay;
 | 
			
		||||
  logic [NUMWAYS-1:0]         SetValidWay, ClearValidWay, SetDirtyWay, ClearDirtyWay;
 | 
			
		||||
  logic [NUMWAYS-1:0]         WriteWordWayEn, WriteLineWayEn;
 | 
			
		||||
@ -121,11 +121,11 @@ module cache #(parameter LINELEN,  NUMLINES,  NUMWAYS, DCACHE = 1) (
 | 
			
		||||
        .SetValidWay, .ClearValidWay, .SetDirtyWay, .ClearDirtyWay,
 | 
			
		||||
        .SelEvict, .VictimWay, .FlushWay, 
 | 
			
		||||
        .SelFlush,
 | 
			
		||||
		.ReadDataLineWay, .WayHit(WayHitRaw), .VictimDirty(VictimDirtyWay), .VictimTag(VictimTagWay),
 | 
			
		||||
		.ReadDataLineWay, .WayHit, .VictimDirty(VictimDirtyWay), .VictimTag(VictimTagWay),
 | 
			
		||||
		.InvalidateAll(InvalidateCacheM));
 | 
			
		||||
  if(NUMWAYS > 1) begin:vict
 | 
			
		||||
    cachereplacementpolicy #(NUMWAYS, SETLEN, OFFSETLEN, NUMLINES) cachereplacementpolicy(
 | 
			
		||||
      .clk, .reset, .WayHit, .VictimWay, .PAdr(PAdr[SETTOP-1:OFFSETLEN]), .RAdr, .LRUWriteEn);
 | 
			
		||||
      .clk, .reset, .WayHit(WayHitFinal), .VictimWay, .PAdr(PAdr[SETTOP-1:OFFSETLEN]), .RAdr, .LRUWriteEn);
 | 
			
		||||
  end else assign VictimWay = 1'b1; // one hot.
 | 
			
		||||
  assign CacheHit = | WayHit;
 | 
			
		||||
  assign VictimDirty = | VictimDirtyWay;
 | 
			
		||||
@ -141,9 +141,9 @@ module cache #(parameter LINELEN,  NUMLINES,  NUMWAYS, DCACHE = 1) (
 | 
			
		||||
  // the data.  Replay is eaiser but creates a longer critical path.
 | 
			
		||||
  // save/restore only wayhit and readdata.
 | 
			
		||||
  if(!`REPLAY) begin
 | 
			
		||||
    flopenr #(NUMWAYS) wayhitsavereg(clk, save, reset, WayHitRaw, WayHitSaved);
 | 
			
		||||
    mux2 #(NUMWAYS) saverestoremux(WayHitRaw, WayHitSaved, restore, WayHit);
 | 
			
		||||
  end else assign WayHit = WayHitRaw;
 | 
			
		||||
    flopenr #(NUMWAYS) wayhitsavereg(clk, save, reset, WayHit, WayHitSaved);
 | 
			
		||||
    mux2 #(NUMWAYS) saverestoremux(WayHit, WayHitSaved, restore, WayHitFinal);
 | 
			
		||||
  end else assign WayHitFinal = WayHit;
 | 
			
		||||
  
 | 
			
		||||
  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Write Path: Write data and address. Muxes between writes from bus and writes from CPU.
 | 
			
		||||
@ -179,7 +179,7 @@ module cache #(parameter LINELEN,  NUMLINES,  NUMWAYS, DCACHE = 1) (
 | 
			
		||||
  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
  // *** change to structural
 | 
			
		||||
  mux3 #(NUMWAYS) selectwaymux(WayHit, VictimWay, FlushWay, {SelFlush, FSMLineWriteEn}, SelectedWay);
 | 
			
		||||
  mux3 #(NUMWAYS) selectwaymux(WayHitFinal, VictimWay, FlushWay, {SelFlush, FSMLineWriteEn}, SelectedWay);
 | 
			
		||||
  assign SetValidWay = SetValid ? SelectedWay : '0;
 | 
			
		||||
  assign ClearValidWay = ClearValid ? SelectedWay : '0;
 | 
			
		||||
  assign SetDirtyWay = SetDirty ? SelectedWay : '0;
 | 
			
		||||
 | 
			
		||||
@ -192,7 +192,7 @@ module ifu (
 | 
			
		||||
    
 | 
			
		||||
    busdp #(WORDSPERLINE, LINELEN, 32, LOGWPL) 
 | 
			
		||||
    busdp(.clk, .reset,
 | 
			
		||||
          .LSUBusHRDATA(IFUBusHRDATA), .LSUBusAck(IFUBusAck), .LSUBusWrite(), 
 | 
			
		||||
          .LSUBusHRDATA(IFUBusHRDATA), .LSUBusAck(IFUBusAck), .LSUBusWrite(), .LSUBusWriteCrit(),
 | 
			
		||||
          .LSUBusRead(IFUBusRead), .LSUBusSize(), 
 | 
			
		||||
          .LSUFunct3M(3'b010), .LSUBusAdr(IFUBusAdr), .DCacheBusAdr(ICacheBusAdr),
 | 
			
		||||
          .WordCount(), .LSUBusHWDATA(),
 | 
			
		||||
 | 
			
		||||
@ -63,6 +63,7 @@ module busdp #(parameter WORDSPERLINE, LINELEN, WORDLEN, LOGWPL, LSU=0)
 | 
			
		||||
  input logic [1:0]           LSURWM,
 | 
			
		||||
  input logic                 CPUBusy,
 | 
			
		||||
  input logic                 CacheableM,
 | 
			
		||||
  output logic                LSUBusWriteCrit,
 | 
			
		||||
  output logic                BusStall,
 | 
			
		||||
  output logic                BusCommittedM);
 | 
			
		||||
  
 | 
			
		||||
@ -92,7 +93,7 @@ module busdp #(parameter WORDSPERLINE, LINELEN, WORDLEN, LOGWPL, LSU=0)
 | 
			
		||||
 | 
			
		||||
  busfsm #(WordCountThreshold, LOGWPL, (`DMEM == `MEM_CACHE)) // *** cleanup  Icache? must fix.
 | 
			
		||||
  busfsm(.clk, .reset, .IgnoreRequest, .LSURWM, .DCacheFetchLine, .DCacheWriteLine,
 | 
			
		||||
		 .LSUBusAck, .CPUBusy, .CacheableM, .BusStall, .LSUBusWrite, .LSUBusRead,
 | 
			
		||||
		 .LSUBusAck, .CPUBusy, .CacheableM, .BusStall, .LSUBusWrite, .LSUBusWriteCrit, .LSUBusRead,
 | 
			
		||||
		 .DCacheBusAck, .BusCommittedM, .SelUncachedAdr, .WordCount);
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
@ -46,6 +46,7 @@ module busfsm #(parameter integer   WordCountThreshold,
 | 
			
		||||
 | 
			
		||||
   output logic              BusStall,
 | 
			
		||||
   output logic              LSUBusWrite,
 | 
			
		||||
   output logic              LSUBusWriteCrit,
 | 
			
		||||
   output logic              LSUBusRead,
 | 
			
		||||
   output logic              DCacheBusAck,
 | 
			
		||||
   output logic              BusCommittedM,
 | 
			
		||||
@ -130,6 +131,9 @@ module busfsm #(parameter integer   WordCountThreshold,
 | 
			
		||||
  assign UnCachedLSUBusWrite = (BusCurrState == STATE_BUS_READY & UnCachedAccess & (LSURWM[0] & ~IgnoreRequest)) |
 | 
			
		||||
							   (BusCurrState == STATE_BUS_UNCACHED_WRITE);
 | 
			
		||||
  assign LSUBusWrite = UnCachedLSUBusWrite | (BusCurrState == STATE_BUS_WRITE);
 | 
			
		||||
  assign LSUBusWriteCrit = (BusCurrState == STATE_BUS_READY & UnCachedAccess & (LSURWM[0])) |
 | 
			
		||||
						   (BusCurrState == STATE_BUS_UNCACHED_WRITE) |
 | 
			
		||||
                           (BusCurrState == STATE_BUS_WRITE);
 | 
			
		||||
 | 
			
		||||
  assign UnCachedLSUBusRead = (BusCurrState == STATE_BUS_READY & UnCachedAccess & (|LSURWM[1] & IgnoreRequest)) |
 | 
			
		||||
							  (BusCurrState == STATE_BUS_UNCACHED_READ);
 | 
			
		||||
 | 
			
		||||
@ -100,6 +100,7 @@ module lsu (
 | 
			
		||||
  logic                     InterlockStall;
 | 
			
		||||
  logic                     IgnoreRequestTLB, IgnoreRequestTrapM;
 | 
			
		||||
  logic                     BusCommittedM, DCacheCommittedM;
 | 
			
		||||
  logic                     LSUBusWriteCrit;
 | 
			
		||||
 | 
			
		||||
  flopenrc #(`XLEN) AddressMReg(clk, reset, FlushM, ~StallM, IEUAdrE, IEUAdrM);
 | 
			
		||||
  assign IEUAdrExtM = {2'b00, IEUAdrM}; 
 | 
			
		||||
@ -199,13 +200,13 @@ module lsu (
 | 
			
		||||
    busdp #(WORDSPERLINE, LINELEN, `XLEN, LOGWPL, 1) busdp(
 | 
			
		||||
      .clk, .reset,
 | 
			
		||||
      .LSUBusHRDATA, .LSUBusHWDATA, .LSUBusAck, .LSUBusWrite, .LSUBusRead, .LSUBusSize,
 | 
			
		||||
      .WordCount,
 | 
			
		||||
      .WordCount, .LSUBusWriteCrit,
 | 
			
		||||
      .LSUFunct3M, .LSUBusAdr, .DCacheBusAdr, .DCacheFetchLine,
 | 
			
		||||
      .DCacheWriteLine, .DCacheBusAck, .DCacheMemWriteData, .LSUPAdrM, .FinalAMOWriteDataM,
 | 
			
		||||
      .ReadDataWordM, .ReadDataWordMuxM, .IgnoreRequest(IgnoreRequestTLB | IgnoreRequestTrapM), .LSURWM, .CPUBusy, .CacheableM,
 | 
			
		||||
      .BusStall, .BusCommittedM);
 | 
			
		||||
 | 
			
		||||
    assign WordOffsetAddr = LSUBusWrite ? ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) : LSUPAdrM;
 | 
			
		||||
    assign WordOffsetAddr = LSUBusWriteCrit ? ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) : LSUPAdrM;
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    if(`DMEM == `MEM_CACHE) begin : dcache
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user