forked from Github_Repos/cvw
		
	Major icache cleanup.
This commit is contained in:
		
							parent
							
								
									5a438a9498
								
							
						
					
					
						commit
						c2a9b3bc79
					
				
							
								
								
									
										36
									
								
								wally-pipelined/src/cache/icache.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								wally-pipelined/src/cache/icache.sv
									
									
									
									
										vendored
									
									
								
							@ -49,7 +49,6 @@ module icache
 | 
				
			|||||||
   output logic 							ICacheStallF,
 | 
					   output logic 							ICacheStallF,
 | 
				
			||||||
   input logic 								CacheableF,
 | 
					   input logic 								CacheableF,
 | 
				
			||||||
   input logic 								ITLBMissF,
 | 
					   input logic 								ITLBMissF,
 | 
				
			||||||
   input logic 								ITLBWriteF,
 | 
					 | 
				
			||||||
   input logic 								InvalidateICacheM,
 | 
					   input logic 								InvalidateICacheM,
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
   // The raw (not decompressed) instruction that was requested
 | 
					   // The raw (not decompressed) instruction that was requested
 | 
				
			||||||
@ -66,23 +65,18 @@ module icache
 | 
				
			|||||||
  localparam integer 		  INDEXLEN = $clog2(NUMLINES);
 | 
					  localparam integer 		  INDEXLEN = $clog2(NUMLINES);
 | 
				
			||||||
  localparam integer 		  TAGLEN = `PA_BITS - OFFSETLEN - INDEXLEN;
 | 
					  localparam integer 		  TAGLEN = `PA_BITS - OFFSETLEN - INDEXLEN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // *** not used?
 | 
				
			||||||
  localparam WORDSPERLINE = BLOCKLEN/`XLEN;
 | 
					  localparam WORDSPERLINE = BLOCKLEN/`XLEN;
 | 
				
			||||||
  localparam LOGWPL = $clog2(WORDSPERLINE);
 | 
					  localparam LOGWPL = $clog2(WORDSPERLINE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  localparam integer 		  PA_WIDTH = `PA_BITS - 2;
 | 
					 | 
				
			||||||
  localparam integer 		  NUMWAYS = `ICACHE_NUMWAYS;
 | 
					  localparam integer 		  NUMWAYS = `ICACHE_NUMWAYS;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Input signals to cache memory
 | 
					  // Input signals to cache memory
 | 
				
			||||||
  logic 					  ICacheMemWriteEnable;
 | 
					  logic 					  ICacheMemWriteEnable;
 | 
				
			||||||
  logic [`PA_BITS-1:0] 		  FinalPCPF;  
 | 
					 | 
				
			||||||
  // Output signals from cache memory
 | 
					  // Output signals from cache memory
 | 
				
			||||||
  logic 					  ICacheReadEn;
 | 
					 | 
				
			||||||
  logic [BLOCKLEN-1:0] 		  ReadLineF;
 | 
					  logic [BLOCKLEN-1:0] 		  ReadLineF;
 | 
				
			||||||
  
 | 
					  logic       				  SelAdr;
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  logic [1:0] 				  SelAdr;
 | 
					 | 
				
			||||||
  logic [INDEXLEN-1:0] 		  RAdr;
 | 
					  logic [INDEXLEN-1:0] 		  RAdr;
 | 
				
			||||||
  logic [NUMWAYS-1:0] 		  VictimWay;
 | 
					  logic [NUMWAYS-1:0] 		  VictimWay;
 | 
				
			||||||
  logic 					  LRUWriteEn;
 | 
					  logic 					  LRUWriteEn;
 | 
				
			||||||
@ -94,24 +88,20 @@ module icache
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  logic [31:0] 				  ReadLineSetsF [`ICACHE_BLOCKLENINBITS/16-1:0];
 | 
					  logic [31:0] 				  ReadLineSetsF [`ICACHE_BLOCKLENINBITS/16-1:0];
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  logic [`PA_BITS-1:0] 		  BasePAdrMaskedF;
 | 
					 | 
				
			||||||
  logic [OFFSETLEN-1:0] 	  BasePAdrOffsetF;
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  logic [NUMWAYS-1:0] 		  SRAMWayWriteEnable;
 | 
					  logic [NUMWAYS-1:0] 		  SRAMWayWriteEnable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mux2 #(INDEXLEN)
 | 
					  mux2 #(INDEXLEN)
 | 
				
			||||||
  AdrSelMux(.d0(PCNextF[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
 | 
					  AdrSelMux(.d0(PCNextF[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
 | 
				
			||||||
			.d1(PCF[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
 | 
								.d1(PCF[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
 | 
				
			||||||
			.s(SelAdr[0]),
 | 
								.s(SelAdr),
 | 
				
			||||||
			.y(RAdr));
 | 
								.y(RAdr));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cacheway #(.NUMLINES(NUMLINES), .BLOCKLEN(BLOCKLEN), .TAGLEN(TAGLEN), 
 | 
					  cacheway #(.NUMLINES(NUMLINES), .BLOCKLEN(BLOCKLEN), .TAGLEN(TAGLEN), 
 | 
				
			||||||
			 .OFFSETLEN(OFFSETLEN), .INDEXLEN(INDEXLEN), .DIRTY_BITS(0))
 | 
								 .OFFSETLEN(OFFSETLEN), .INDEXLEN(INDEXLEN), .DIRTY_BITS(0))
 | 
				
			||||||
  MemWay[NUMWAYS-1:0](.clk, .reset, .RAdr,
 | 
					  MemWay[NUMWAYS-1:0](.clk, .reset, .RAdr,
 | 
				
			||||||
					  .PAdr(FinalPCPF),
 | 
										  .PAdr(PCPF),
 | 
				
			||||||
					  .WriteEnable(SRAMWayWriteEnable),
 | 
										  .WriteEnable(SRAMWayWriteEnable),
 | 
				
			||||||
					  .VDWriteEnable(1'b0),
 | 
										  .VDWriteEnable(1'b0),
 | 
				
			||||||
					  .WriteWordEnable({{(BLOCKLEN/`XLEN){1'b1}}}),
 | 
										  .WriteWordEnable({{(BLOCKLEN/`XLEN){1'b1}}}),
 | 
				
			||||||
@ -131,7 +121,7 @@ module icache
 | 
				
			|||||||
      cachereplacementpolicy(.clk, .reset,
 | 
					      cachereplacementpolicy(.clk, .reset,
 | 
				
			||||||
							 .WayHit,
 | 
												 .WayHit,
 | 
				
			||||||
							 .VictimWay,
 | 
												 .VictimWay,
 | 
				
			||||||
							 .LsuPAdrM(FinalPCPF[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
 | 
												 .LsuPAdrM(PCPF[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
 | 
				
			||||||
							 .RAdr,
 | 
												 .RAdr,
 | 
				
			||||||
							 .LRUWriteEn);
 | 
												 .LRUWriteEn);
 | 
				
			||||||
    end else begin:vict
 | 
					    end else begin:vict
 | 
				
			||||||
@ -154,19 +144,9 @@ module icache
 | 
				
			|||||||
	assign ReadLineSetsF[BLOCKLEN/16-1] = {16'b0, ReadLineF[BLOCKLEN-1:BLOCKLEN-16]};
 | 
						assign ReadLineSetsF[BLOCKLEN/16-1] = {16'b0, ReadLineF[BLOCKLEN-1:BLOCKLEN-16]};
 | 
				
			||||||
  endgenerate
 | 
					  endgenerate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assign FinalInstrRawF = ReadLineSetsF[FinalPCPF[$clog2(BLOCKLEN / 32) + 1 : 1]];
 | 
					  assign FinalInstrRawF = ReadLineSetsF[PCPF[$clog2(BLOCKLEN / 32) + 1 : 1]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  
 | 
					  assign ICacheBusAdr = {PCPF[`PA_BITS-1:OFFSETLEN], {{OFFSETLEN}{1'b0}}};
 | 
				
			||||||
  assign FinalPCPF = PCPF;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // *** CHANGE ME
 | 
					 | 
				
			||||||
  // if not cacheable the offset bits needs to be sent to the EBU.
 | 
					 | 
				
			||||||
  // if cacheable the offset bits are discarded.  $ FSM will fetch the whole block.
 | 
					 | 
				
			||||||
  //assign BasePAdrOffsetF = CacheableF ? {{OFFSETLEN}{1'b0}} : FinalPCPF[OFFSETLEN-1:0];
 | 
					 | 
				
			||||||
  //assign BasePAdrMaskedF = {FinalPCPF[`PA_BITS-1:OFFSETLEN], BasePAdrOffsetF};
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  //assign ICacheBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, FetchCount} << $clog2(`XLEN/8)) + BasePAdrMaskedF;
 | 
					 | 
				
			||||||
  assign ICacheBusAdr = {FinalPCPF[`PA_BITS-1:OFFSETLEN], {{OFFSETLEN}{1'b0}}};
 | 
					 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  // truncate the offset from PCPF for memory address generation
 | 
					  // truncate the offset from PCPF for memory address generation
 | 
				
			||||||
@ -177,11 +157,9 @@ module icache
 | 
				
			|||||||
  icachefsm  icachefsm(.clk,
 | 
					  icachefsm  icachefsm(.clk,
 | 
				
			||||||
					   .reset,
 | 
										   .reset,
 | 
				
			||||||
					   .CPUBusy,
 | 
										   .CPUBusy,
 | 
				
			||||||
					   .ICacheReadEn,
 | 
					 | 
				
			||||||
					   .ICacheMemWriteEnable,
 | 
										   .ICacheMemWriteEnable,
 | 
				
			||||||
					   .ICacheStallF,
 | 
										   .ICacheStallF,
 | 
				
			||||||
					   .ITLBMissF,
 | 
										   .ITLBMissF,
 | 
				
			||||||
					   .ITLBWriteF,
 | 
					 | 
				
			||||||
					   .IgnoreRequest,
 | 
										   .IgnoreRequest,
 | 
				
			||||||
					   .ICacheBusAck,
 | 
										   .ICacheBusAck,
 | 
				
			||||||
					   .ICacheFetchLine,
 | 
										   .ICacheFetchLine,
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										39
									
								
								wally-pipelined/src/cache/icachefsm.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								wally-pipelined/src/cache/icachefsm.sv
									
									
									
									
										vendored
									
									
								
							@ -33,7 +33,6 @@ module icachefsm
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   // inputs from mmu
 | 
					   // inputs from mmu
 | 
				
			||||||
   input logic 		  ITLBMissF,
 | 
					   input logic 		  ITLBMissF,
 | 
				
			||||||
   input logic 		  ITLBWriteF,
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
   input logic 		  IgnoreRequest,
 | 
					   input logic 		  IgnoreRequest,
 | 
				
			||||||
   input logic 		  CacheableF,
 | 
					   input logic 		  CacheableF,
 | 
				
			||||||
@ -44,8 +43,6 @@ module icachefsm
 | 
				
			|||||||
   // icache internal inputs
 | 
					   // icache internal inputs
 | 
				
			||||||
   input logic 		  hit,
 | 
					   input logic 		  hit,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // icache internal outputs
 | 
					 | 
				
			||||||
   output logic 	  ICacheReadEn,
 | 
					 | 
				
			||||||
   // Load data into the cache
 | 
					   // Load data into the cache
 | 
				
			||||||
   output logic 	  ICacheMemWriteEnable,
 | 
					   output logic 	  ICacheMemWriteEnable,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -56,7 +53,7 @@ module icachefsm
 | 
				
			|||||||
   output logic 	  ICacheFetchLine,
 | 
					   output logic 	  ICacheFetchLine,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // icache internal outputs
 | 
					   // icache internal outputs
 | 
				
			||||||
   output logic [1:0] SelAdr,
 | 
					   output logic       SelAdr,
 | 
				
			||||||
   output logic 	  LRUWriteEn
 | 
					   output logic 	  LRUWriteEn
 | 
				
			||||||
   );
 | 
					   );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -83,21 +80,19 @@ module icachefsm
 | 
				
			|||||||
  always_comb begin
 | 
					  always_comb begin
 | 
				
			||||||
    //IfuBusFetch = 1'b0;
 | 
					    //IfuBusFetch = 1'b0;
 | 
				
			||||||
    ICacheMemWriteEnable = 1'b0;
 | 
					    ICacheMemWriteEnable = 1'b0;
 | 
				
			||||||
    SelAdr = 2'b00;
 | 
					    SelAdr = 1'b0;
 | 
				
			||||||
    ICacheReadEn = 1'b0;
 | 
					 | 
				
			||||||
    ICacheStallF = 1'b1;
 | 
					    ICacheStallF = 1'b1;
 | 
				
			||||||
    LRUWriteEn = 1'b0;
 | 
					    LRUWriteEn = 1'b0;
 | 
				
			||||||
    case (CurrState)
 | 
					    case (CurrState)
 | 
				
			||||||
      STATE_READY: begin
 | 
					      STATE_READY: begin
 | 
				
			||||||
        SelAdr = 2'b00;
 | 
					        SelAdr = 1'b0;
 | 
				
			||||||
        ICacheReadEn = 1'b1;
 | 
					 | 
				
			||||||
		if(IgnoreRequest) begin
 | 
							if(IgnoreRequest) begin
 | 
				
			||||||
		  SelAdr = 2'b01;
 | 
							  SelAdr = 1'b1;
 | 
				
			||||||
		  NextState = STATE_READY;
 | 
							  NextState = STATE_READY;
 | 
				
			||||||
		end else 
 | 
							end else 
 | 
				
			||||||
		if(ITLBMissF) begin
 | 
							if(ITLBMissF) begin
 | 
				
			||||||
		  NextState = STATE_READY;
 | 
							  NextState = STATE_READY;
 | 
				
			||||||
		  SelAdr = 2'b01;
 | 
							  SelAdr = 1'b1;
 | 
				
			||||||
		  ICacheStallF = 1'b0;
 | 
							  ICacheStallF = 1'b0;
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		else if (CacheableF & hit) begin
 | 
							else if (CacheableF & hit) begin
 | 
				
			||||||
@ -105,17 +100,17 @@ module icachefsm
 | 
				
			|||||||
		  LRUWriteEn = 1'b1;
 | 
							  LRUWriteEn = 1'b1;
 | 
				
			||||||
		  if(CPUBusy) begin
 | 
							  if(CPUBusy) begin
 | 
				
			||||||
			NextState = STATE_CPU_BUSY;
 | 
								NextState = STATE_CPU_BUSY;
 | 
				
			||||||
			SelAdr = 2'b01;
 | 
								SelAdr = 1'b1;
 | 
				
			||||||
		  end else begin
 | 
							  end else begin
 | 
				
			||||||
            NextState = STATE_READY;
 | 
					            NextState = STATE_READY;
 | 
				
			||||||
		  end
 | 
							  end
 | 
				
			||||||
        end else if (CacheableF & ~hit) begin
 | 
					        end else if (CacheableF & ~hit) begin
 | 
				
			||||||
		  SelAdr = 2'b01;                                         /// *********(
 | 
							  SelAdr = 1'b1;                                         /// *********(
 | 
				
			||||||
          NextState = STATE_MISS_FETCH_WDV;
 | 
					          NextState = STATE_MISS_FETCH_WDV;
 | 
				
			||||||
        end else begin
 | 
					        end else begin
 | 
				
			||||||
		  if(CPUBusy) begin
 | 
							  if(CPUBusy) begin
 | 
				
			||||||
			NextState = STATE_CPU_BUSY;
 | 
								NextState = STATE_CPU_BUSY;
 | 
				
			||||||
			SelAdr = 2'b01;
 | 
								SelAdr = 1'b1;
 | 
				
			||||||
		  end else begin
 | 
							  end else begin
 | 
				
			||||||
            NextState = STATE_READY;
 | 
					            NextState = STATE_READY;
 | 
				
			||||||
		  end
 | 
							  end
 | 
				
			||||||
@ -123,7 +118,7 @@ module icachefsm
 | 
				
			|||||||
      end
 | 
					      end
 | 
				
			||||||
      // branch 3 miss no spill
 | 
					      // branch 3 miss no spill
 | 
				
			||||||
      STATE_MISS_FETCH_WDV: begin
 | 
					      STATE_MISS_FETCH_WDV: begin
 | 
				
			||||||
        SelAdr = 2'b01;
 | 
					        SelAdr = 1'b1;
 | 
				
			||||||
        //IfuBusFetch = 1'b1;
 | 
					        //IfuBusFetch = 1'b1;
 | 
				
			||||||
        if (ICacheBusAck) begin
 | 
					        if (ICacheBusAck) begin
 | 
				
			||||||
          NextState = STATE_MISS_FETCH_DONE;	  
 | 
					          NextState = STATE_MISS_FETCH_DONE;	  
 | 
				
			||||||
@ -132,24 +127,21 @@ module icachefsm
 | 
				
			|||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
      STATE_MISS_FETCH_DONE: begin
 | 
					      STATE_MISS_FETCH_DONE: begin
 | 
				
			||||||
        SelAdr = 2'b01;
 | 
					        SelAdr = 1'b1;
 | 
				
			||||||
        ICacheMemWriteEnable = 1'b1;
 | 
					        ICacheMemWriteEnable = 1'b1;
 | 
				
			||||||
        NextState = STATE_MISS_READ;
 | 
					        NextState = STATE_MISS_READ;
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
      STATE_MISS_READ: begin
 | 
					      STATE_MISS_READ: begin
 | 
				
			||||||
        SelAdr = 2'b01;
 | 
					        SelAdr = 1'b1;
 | 
				
			||||||
        ICacheReadEn = 1'b1;
 | 
					 | 
				
			||||||
        NextState = STATE_MISS_READ_DELAY;
 | 
					        NextState = STATE_MISS_READ_DELAY;
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
      STATE_MISS_READ_DELAY: begin
 | 
					      STATE_MISS_READ_DELAY: begin
 | 
				
			||||||
        //SelAdr = 2'b01;
 | 
					 | 
				
			||||||
        ICacheReadEn = 1'b1;
 | 
					 | 
				
			||||||
		ICacheStallF = 1'b0;
 | 
							ICacheStallF = 1'b0;
 | 
				
			||||||
		LRUWriteEn = 1'b1;
 | 
							LRUWriteEn = 1'b1;
 | 
				
			||||||
		if(CPUBusy) begin
 | 
							if(CPUBusy) begin
 | 
				
			||||||
		  SelAdr = 2'b01;
 | 
							  SelAdr = 1'b1;
 | 
				
			||||||
		  NextState = STATE_CPU_BUSY;
 | 
							  NextState = STATE_CPU_BUSY;
 | 
				
			||||||
		  SelAdr = 2'b01;
 | 
							  SelAdr = 1'b1;
 | 
				
			||||||
		end else begin
 | 
							end else begin
 | 
				
			||||||
          NextState = STATE_READY;
 | 
					          NextState = STATE_READY;
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
@ -158,17 +150,16 @@ module icachefsm
 | 
				
			|||||||
		ICacheStallF = 1'b0;
 | 
							ICacheStallF = 1'b0;
 | 
				
			||||||
        if(CPUBusy) begin
 | 
					        if(CPUBusy) begin
 | 
				
			||||||
		  NextState = STATE_CPU_BUSY;
 | 
							  NextState = STATE_CPU_BUSY;
 | 
				
			||||||
		  SelAdr = 2'b01;
 | 
							  SelAdr = 1'b1;
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		else begin
 | 
							else begin
 | 
				
			||||||
		  NextState = STATE_READY;
 | 
							  NextState = STATE_READY;
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
      default: begin
 | 
					      default: begin
 | 
				
			||||||
        SelAdr = 2'b01;
 | 
					        SelAdr = 1'b1;
 | 
				
			||||||
        NextState = STATE_READY;
 | 
					        NextState = STATE_READY;
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
      // *** add in error handling and invalidate/evict
 | 
					 | 
				
			||||||
    endcase
 | 
					    endcase
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -247,7 +247,7 @@ module ifu (
 | 
				
			|||||||
  generate
 | 
					  generate
 | 
				
			||||||
	if(`MEM_ICACHE) begin : icache
 | 
						if(`MEM_ICACHE) begin : icache
 | 
				
			||||||
	  icache icache(.clk, .reset, .CPUBusy, .IgnoreRequest, .ICacheMemWriteData , .ICacheBusAck,
 | 
						  icache icache(.clk, .reset, .CPUBusy, .IgnoreRequest, .ICacheMemWriteData , .ICacheBusAck,
 | 
				
			||||||
					.ICacheBusAdr, .ICacheStallF, .ITLBMissF, .ITLBWriteF, .FinalInstrRawF, 
 | 
										.ICacheBusAdr, .ICacheStallF, .ITLBMissF, .FinalInstrRawF, 
 | 
				
			||||||
					.ICacheFetchLine,
 | 
										.ICacheFetchLine,
 | 
				
			||||||
					.CacheableF,
 | 
										.CacheableF,
 | 
				
			||||||
					.PCNextF(PCNextFMux),
 | 
										.PCNextF(PCNextFMux),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user