forked from Github_Repos/cvw
		
	Merged cacheable with seluncachedadr.
This commit is contained in:
		
							parent
							
								
									6ab6467777
								
							
						
					
					
						commit
						2c80c2b35f
					
				@ -53,7 +53,7 @@ module ahbcacheinterface #(parameter WORDSPERLINE, LINELEN, LOGWPL, CACHE_ENABLE
 | 
				
			|||||||
  input logic [1:0]           CacheBusRW,
 | 
					  input logic [1:0]           CacheBusRW,
 | 
				
			||||||
  output logic                CacheBusAck,
 | 
					  output logic                CacheBusAck,
 | 
				
			||||||
  output logic [LINELEN-1:0]  FetchBuffer, 
 | 
					  output logic [LINELEN-1:0]  FetchBuffer, 
 | 
				
			||||||
  output logic                SelUncachedAdr,
 | 
					  input logic                 Cacheable,
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  // lsu/ifu interface
 | 
					  // lsu/ifu interface
 | 
				
			||||||
  input logic [`PA_BITS-1:0]  PAdr,
 | 
					  input logic [`PA_BITS-1:0]  PAdr,
 | 
				
			||||||
@ -77,13 +77,13 @@ module ahbcacheinterface #(parameter WORDSPERLINE, LINELEN, LOGWPL, CACHE_ENABLE
 | 
				
			|||||||
      .q(FetchBuffer[(index+1)*`XLEN-1:index*`XLEN]));
 | 
					      .q(FetchBuffer[(index+1)*`XLEN-1:index*`XLEN]));
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mux2 #(`PA_BITS) localadrmux(CacheBusAdr, PAdr, SelUncachedAdr, LocalHADDR);
 | 
					  mux2 #(`PA_BITS) localadrmux(PAdr, CacheBusAdr, Cacheable, LocalHADDR);
 | 
				
			||||||
  assign HADDR = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalHADDR;
 | 
					  assign HADDR = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalHADDR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mux2 #(3) sizemux(.d0(`XLEN == 32 ? 3'b010 : 3'b011), .d1(Funct3), .s(SelUncachedAdr), .y(HSIZE));
 | 
					  mux2 #(3) sizemux(.d0(Funct3), .d1(`XLEN == 32 ? 3'b010 : 3'b011), .s(Cacheable), .y(HSIZE));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  buscachefsm #(WordCountThreshold, LOGWPL, CACHE_ENABLED) AHBBuscachefsm(
 | 
					  buscachefsm #(WordCountThreshold, LOGWPL, CACHE_ENABLED) AHBBuscachefsm(
 | 
				
			||||||
    .HCLK, .HRESETn, .BusRW, .CPUBusy, .BusCommitted, .BusStall, .CaptureEn, .SelBusWord,
 | 
					    .HCLK, .HRESETn, .BusRW, .CPUBusy, .BusCommitted, .BusStall, .CaptureEn, .SelBusWord,
 | 
				
			||||||
    .CacheBusRW, .CacheBusAck, .SelUncachedAdr, .WordCount, .WordCountDelayed,
 | 
					    .CacheBusRW, .CacheBusAck, .WordCount, .WordCountDelayed,
 | 
				
			||||||
	.HREADY, .HTRANS, .HWRITE, .HBURST);
 | 
						.HREADY, .HTRANS, .HWRITE, .HBURST);
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
 | 
				
			|||||||
@ -49,7 +49,6 @@ module buscachefsm #(parameter integer   WordCountThreshold,
 | 
				
			|||||||
   output logic              CacheBusAck,
 | 
					   output logic              CacheBusAck,
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   // lsu interface
 | 
					   // lsu interface
 | 
				
			||||||
   output logic              SelUncachedAdr,
 | 
					 | 
				
			||||||
   output logic [LOGWPL-1:0] WordCount, WordCountDelayed,
 | 
					   output logic [LOGWPL-1:0] WordCount, WordCountDelayed,
 | 
				
			||||||
   output logic              SelBusWord,
 | 
					   output logic              SelBusWord,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -134,9 +133,6 @@ module buscachefsm #(parameter integer   WordCountThreshold,
 | 
				
			|||||||
                    (CurrState == CACHE_FETCH) |
 | 
					                    (CurrState == CACHE_FETCH) |
 | 
				
			||||||
                    (CurrState == CACHE_EVICT);
 | 
					                    (CurrState == CACHE_EVICT);
 | 
				
			||||||
  assign BusCommitted = CurrState != ADR_PHASE;
 | 
					  assign BusCommitted = CurrState != ADR_PHASE;
 | 
				
			||||||
  assign SelUncachedAdr = (CurrState == ADR_PHASE & |BusRW) |
 | 
					 | 
				
			||||||
                          (CurrState == DATA_PHASE) |
 | 
					 | 
				
			||||||
                          (CurrState == MEM3);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // AHB bus interface
 | 
					  // AHB bus interface
 | 
				
			||||||
  assign HTRANS = (CurrState == ADR_PHASE & HREADY & (|BusRW | |CacheBusRW)) |
 | 
					  assign HTRANS = (CurrState == ADR_PHASE & HREADY & (|BusRW | |CacheBusRW)) |
 | 
				
			||||||
 | 
				
			|||||||
@ -212,7 +212,6 @@ module ifu (
 | 
				
			|||||||
      logic [LINELEN-1:0]  FetchBuffer;
 | 
					      logic [LINELEN-1:0]  FetchBuffer;
 | 
				
			||||||
      logic [`PA_BITS-1:0] ICacheBusAdr;
 | 
					      logic [`PA_BITS-1:0] ICacheBusAdr;
 | 
				
			||||||
      logic                ICacheBusAck;
 | 
					      logic                ICacheBusAck;
 | 
				
			||||||
      logic                SelUncachedAdr;
 | 
					 | 
				
			||||||
      logic [1:0]          CacheBusRW, BusRW;
 | 
					      logic [1:0]          CacheBusRW, BusRW;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
@ -241,14 +240,14 @@ module ifu (
 | 
				
			|||||||
            .HRDATA,
 | 
					            .HRDATA,
 | 
				
			||||||
            .CacheBusRW, .HSIZE(IFUHSIZE), .HBURST(IFUHBURST), .HTRANS(IFUHTRANS),
 | 
					            .CacheBusRW, .HSIZE(IFUHSIZE), .HBURST(IFUHBURST), .HTRANS(IFUHTRANS),
 | 
				
			||||||
            .Funct3(3'b010), .HADDR(IFUHADDR), .HREADY(IFUHREADY), .HWRITE(IFUHWRITE), .CacheBusAdr(ICacheBusAdr),
 | 
					            .Funct3(3'b010), .HADDR(IFUHADDR), .HREADY(IFUHREADY), .HWRITE(IFUHWRITE), .CacheBusAdr(ICacheBusAdr),
 | 
				
			||||||
            .WordCount(), .SelUncachedAdr, .SelBusWord(),
 | 
					            .WordCount(), .Cacheable(CacheableF), .SelBusWord(),
 | 
				
			||||||
              .CacheBusAck(ICacheBusAck), 
 | 
					              .CacheBusAck(ICacheBusAck), 
 | 
				
			||||||
            .FetchBuffer, .PAdr(PCPF),
 | 
					            .FetchBuffer, .PAdr(PCPF),
 | 
				
			||||||
            .BusRW, .CPUBusy,
 | 
					            .BusRW, .CPUBusy,
 | 
				
			||||||
            .BusStall, .BusCommitted(BusCommittedF));
 | 
					            .BusStall, .BusCommitted(BusCommittedF));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      mux3 #(32) UnCachedDataMux(.d0(ICacheInstrF), .d1(FetchBuffer[32-1:0]), .d2(IROMInstrF),
 | 
					      mux3 #(32) UnCachedDataMux(.d0(ICacheInstrF), .d1(FetchBuffer[32-1:0]), .d2(IROMInstrF),
 | 
				
			||||||
                                 .s({SelIROM, SelUncachedAdr}), .y(InstrRawF[31:0]));
 | 
					                                 .s({SelIROM, ~CacheableF}), .y(InstrRawF[31:0]));
 | 
				
			||||||
    end else begin : passthrough
 | 
					    end else begin : passthrough
 | 
				
			||||||
      assign IFUHADDR = PCPF;
 | 
					      assign IFUHADDR = PCPF;
 | 
				
			||||||
      logic CaptureEn;
 | 
					      logic CaptureEn;
 | 
				
			||||||
 | 
				
			|||||||
@ -231,21 +231,23 @@ module lsu (
 | 
				
			|||||||
      logic                DCacheWriteLine;
 | 
					      logic                DCacheWriteLine;
 | 
				
			||||||
      logic                DCacheFetchLine;
 | 
					      logic                DCacheFetchLine;
 | 
				
			||||||
      logic [AHBWLOGBWPL-1:0]  WordCount;
 | 
					      logic [AHBWLOGBWPL-1:0]  WordCount;
 | 
				
			||||||
      logic                SelUncachedAdr, DCacheBusAck;
 | 
					      logic                DCacheBusAck;
 | 
				
			||||||
      logic                SelBusWord;
 | 
					      logic                SelBusWord;
 | 
				
			||||||
      logic [`XLEN-1:0]    PreHWDATA; //*** change name
 | 
					      logic [`XLEN-1:0]    PreHWDATA; //*** change name
 | 
				
			||||||
      logic [`XLEN/8-1:0]  ByteMaskMDelay;
 | 
					      logic [`XLEN/8-1:0]  ByteMaskMDelay;
 | 
				
			||||||
      logic [1:0]          CacheBusRW, BusRW;
 | 
					      logic [1:0]          CacheBusRW, BusRW;
 | 
				
			||||||
      localparam integer   LLENPOVERAHBW = `LLEN / `AHBW;
 | 
					      localparam integer   LLENPOVERAHBW = `LLEN / `AHBW;
 | 
				
			||||||
 | 
					      logic                CacheableOrFlushCacheM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      assign BusRW = ~CacheableM & ~IgnoreRequest & ~SelDTIM ? LSURWM : '0;
 | 
					      assign BusRW = ~CacheableM & ~IgnoreRequest & ~SelDTIM ? LSURWM : '0;
 | 
				
			||||||
 | 
					      assign CacheableOrFlushCacheM = CacheableM | FlushDCacheM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      cache #(.LINELEN(`DCACHE_LINELENINBITS), .NUMLINES(`DCACHE_WAYSIZEINBYTES*8/LINELEN),
 | 
					      cache #(.LINELEN(`DCACHE_LINELENINBITS), .NUMLINES(`DCACHE_WAYSIZEINBYTES*8/LINELEN),
 | 
				
			||||||
              .NUMWAYS(`DCACHE_NUMWAYS), .LOGBWPL(LLENLOGBWPL), .WORDLEN(`LLEN), .MUXINTERVAL(`LLEN), .DCACHE(1)) dcache(
 | 
					              .NUMWAYS(`DCACHE_NUMWAYS), .LOGBWPL(LLENLOGBWPL), .WORDLEN(`LLEN), .MUXINTERVAL(`LLEN), .DCACHE(1)) dcache(
 | 
				
			||||||
        .clk, .reset, .CPUBusy, .SelBusWord, .RW(LSURWM), .Atomic(LSUAtomicM),
 | 
					        .clk, .reset, .CPUBusy, .SelBusWord, .RW(LSURWM), .Atomic(LSUAtomicM),
 | 
				
			||||||
        .FlushCache(FlushDCacheM), .NextAdr(IEUAdrE[11:0]), .PAdr(PAdrM), 
 | 
					        .FlushCache(FlushDCacheM), .NextAdr(IEUAdrE[11:0]), .PAdr(PAdrM), 
 | 
				
			||||||
        .ByteMask(ByteMaskM), .WordCount(WordCount[AHBWLOGBWPL-1:AHBWLOGBWPL-LLENLOGBWPL]),
 | 
					        .ByteMask(ByteMaskM), .WordCount(WordCount[AHBWLOGBWPL-1:AHBWLOGBWPL-LLENLOGBWPL]),
 | 
				
			||||||
        .FinalWriteData(LSUWriteDataM), .Cacheable(CacheableM), .SelReplay,
 | 
					        .FinalWriteData(LSUWriteDataM), .Cacheable(CacheableOrFlushCacheM), .SelReplay,
 | 
				
			||||||
        .CacheStall(DCacheStallM), .CacheMiss(DCacheMiss), .CacheAccess(DCacheAccess),
 | 
					        .CacheStall(DCacheStallM), .CacheMiss(DCacheMiss), .CacheAccess(DCacheAccess),
 | 
				
			||||||
        .IgnoreRequestTLB, .TrapM, .CacheCommitted(DCacheCommittedM), 
 | 
					        .IgnoreRequestTLB, .TrapM, .CacheCommitted(DCacheCommittedM), 
 | 
				
			||||||
        .CacheBusAdr(DCacheBusAdr), .ReadDataWord(DCacheReadDataWordM), 
 | 
					        .CacheBusAdr(DCacheBusAdr), .ReadDataWord(DCacheReadDataWordM), 
 | 
				
			||||||
@ -258,14 +260,14 @@ module lsu (
 | 
				
			|||||||
        .WordCount, .SelBusWord,
 | 
					        .WordCount, .SelBusWord,
 | 
				
			||||||
        .Funct3(LSUFunct3M), .HADDR(LSUHADDR), .CacheBusAdr(DCacheBusAdr), .CacheBusRW,
 | 
					        .Funct3(LSUFunct3M), .HADDR(LSUHADDR), .CacheBusAdr(DCacheBusAdr), .CacheBusRW,
 | 
				
			||||||
        .CacheBusAck(DCacheBusAck), .FetchBuffer, .PAdr(PAdrM),
 | 
					        .CacheBusAck(DCacheBusAck), .FetchBuffer, .PAdr(PAdrM),
 | 
				
			||||||
        .SelUncachedAdr, .BusRW, .CPUBusy,
 | 
					        .Cacheable(CacheableOrFlushCacheM), .BusRW, .CPUBusy,
 | 
				
			||||||
        .BusStall, .BusCommitted(BusCommittedM));
 | 
					        .BusStall, .BusCommitted(BusCommittedM));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // FetchBuffer[`AHBW-1:0] needs to be duplicated LLENPOVERAHBW times.
 | 
					      // FetchBuffer[`AHBW-1:0] needs to be duplicated LLENPOVERAHBW times.
 | 
				
			||||||
      // DTIMReadDataWordM should be increased to LLEN.
 | 
					      // DTIMReadDataWordM should be increased to LLEN.
 | 
				
			||||||
      mux3 #(`LLEN) UnCachedDataMux(.d0(DCacheReadDataWordM), .d1({LLENPOVERAHBW{FetchBuffer[`XLEN-1:0]}}),
 | 
					      mux3 #(`LLEN) UnCachedDataMux(.d0(DCacheReadDataWordM), .d1({LLENPOVERAHBW{FetchBuffer[`XLEN-1:0]}}),
 | 
				
			||||||
                                    .d2({{`LLEN-`XLEN{1'b0}}, DTIMReadDataWordM[`XLEN-1:0]}),
 | 
					                                    .d2({{`LLEN-`XLEN{1'b0}}, DTIMReadDataWordM[`XLEN-1:0]}),
 | 
				
			||||||
                                    .s({SelDTIM, SelUncachedAdr}), .y(ReadDataWordMuxM));
 | 
					                                    .s({SelDTIM, ~(CacheableOrFlushCacheM)}), .y(ReadDataWordMuxM));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // When AHBW is less than LLEN need extra muxes to select the subword from cache's read data.
 | 
					      // When AHBW is less than LLEN need extra muxes to select the subword from cache's read data.
 | 
				
			||||||
      logic [`AHBW-1:0]    DCacheReadDataWordAHB;
 | 
					      logic [`AHBW-1:0]    DCacheReadDataWordAHB;
 | 
				
			||||||
@ -278,7 +280,7 @@ module lsu (
 | 
				
			|||||||
        assign DCacheReadDataWordAHB = AHBWordSets[WordCount[$clog2(LLENPOVERAHBW)-1:0]];
 | 
					        assign DCacheReadDataWordAHB = AHBWordSets[WordCount[$clog2(LLENPOVERAHBW)-1:0]];
 | 
				
			||||||
      end else assign DCacheReadDataWordAHB = DCacheReadDataWordM[`AHBW-1:0];      
 | 
					      end else assign DCacheReadDataWordAHB = DCacheReadDataWordM[`AHBW-1:0];      
 | 
				
			||||||
      mux2 #(`XLEN) LSUHWDATAMux(.d0(DCacheReadDataWordAHB), .d1(LSUWriteDataM[`AHBW-1:0]),
 | 
					      mux2 #(`XLEN) LSUHWDATAMux(.d0(DCacheReadDataWordAHB), .d1(LSUWriteDataM[`AHBW-1:0]),
 | 
				
			||||||
        .s(SelUncachedAdr), .y(PreHWDATA));
 | 
					        .s(~(CacheableOrFlushCacheM)), .y(PreHWDATA));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      flopen #(`AHBW) wdreg(clk, LSUHREADY, PreHWDATA, LSUHWDATA); // delay HWDATA by 1 cycle per spec
 | 
					      flopen #(`AHBW) wdreg(clk, LSUHREADY, PreHWDATA, LSUHWDATA); // delay HWDATA by 1 cycle per spec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user