mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Merged together the two sub cache line read muxes.
One mux was used for loads and the other for eviction.
This commit is contained in:
		
							parent
							
								
									290430cda8
								
							
						
					
					
						commit
						40eb055861
					
				@ -180,6 +180,7 @@ module ifu (
 | 
			
		||||
  end else begin : bus
 | 
			
		||||
    localparam integer   WORDSPERLINE = (`IMEM == `MEM_CACHE) ? `ICACHE_LINELENINBITS/`XLEN : 1;
 | 
			
		||||
    localparam integer   LINELEN = (`IMEM == `MEM_CACHE) ? `ICACHE_LINELENINBITS : `XLEN;
 | 
			
		||||
    localparam integer   LOGWPL = (`DMEM == `MEM_CACHE) ? $clog2(WORDSPERLINE) : 1;
 | 
			
		||||
    logic [LINELEN-1:0]  ReadDataLine;
 | 
			
		||||
    logic [LINELEN-1:0]  ICacheMemWriteData;
 | 
			
		||||
    logic [`PA_BITS-1:0] ICacheBusAdr;
 | 
			
		||||
@ -187,11 +188,12 @@ module ifu (
 | 
			
		||||
    logic                save,restore;
 | 
			
		||||
    logic [31:0]         temp;
 | 
			
		||||
    
 | 
			
		||||
    busdp #(WORDSPERLINE, LINELEN, 32) 
 | 
			
		||||
    busdp #(WORDSPERLINE, LINELEN, 32, LOGWPL) 
 | 
			
		||||
    busdp(.clk, .reset,
 | 
			
		||||
          .LSUBusHRDATA(IFUBusHRDATA), .LSUBusAck(IFUBusAck), .LSUBusWrite(), 
 | 
			
		||||
          .LSUBusRead(IFUBusRead), .LSUBusHWDATA(), .LSUBusSize(), 
 | 
			
		||||
          .LSUBusRead(IFUBusRead), .LSUBusSize(), 
 | 
			
		||||
          .LSUFunct3M(3'b010), .LSUBusAdr(IFUBusAdr), .DCacheBusAdr(ICacheBusAdr),
 | 
			
		||||
          .WordCount(), .SelUncachedAdr(),
 | 
			
		||||
          .ReadDataLineSetsM(), .DCacheFetchLine(ICacheFetchLine),
 | 
			
		||||
          .DCacheWriteLine(1'b0), .DCacheBusAck(ICacheBusAck), 
 | 
			
		||||
          .DCacheMemWriteData(ICacheMemWriteData), .LSUPAdrM(PCPF),
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,7 @@
 | 
			
		||||
 | 
			
		||||
`include "wally-config.vh"
 | 
			
		||||
 | 
			
		||||
module busdp #(parameter WORDSPERLINE, parameter LINELEN, WORDLEN)
 | 
			
		||||
module busdp #(parameter WORDSPERLINE, LINELEN, WORDLEN, LOGWPL)
 | 
			
		||||
  (
 | 
			
		||||
  input logic                 clk, reset,
 | 
			
		||||
  // bus interface
 | 
			
		||||
@ -42,14 +42,15 @@ module busdp #(parameter WORDSPERLINE, parameter LINELEN, WORDLEN)
 | 
			
		||||
  input logic                 LSUBusAck,
 | 
			
		||||
  output logic                LSUBusWrite,
 | 
			
		||||
  output logic                LSUBusRead,
 | 
			
		||||
  output logic [`XLEN-1:0]    LSUBusHWDATA,
 | 
			
		||||
//  output logic [`XLEN-1:0]    LSUBusHWDATA,
 | 
			
		||||
  output logic [2:0]          LSUBusSize, 
 | 
			
		||||
  input logic [2:0]           LSUFunct3M,
 | 
			
		||||
  output logic [`PA_BITS-1:0] LSUBusAdr,
 | 
			
		||||
 | 
			
		||||
  output logic [LOGWPL-1:0]   WordCount,
 | 
			
		||||
  output logic                SelUncachedAdr,
 | 
			
		||||
  // cache interface.
 | 
			
		||||
  input logic [`PA_BITS-1:0]  DCacheBusAdr,
 | 
			
		||||
  input var logic [`XLEN-1:0] ReadDataLineSetsM [WORDSPERLINE-1:0],
 | 
			
		||||
  input var                   logic [`XLEN-1:0] ReadDataLineSetsM [WORDSPERLINE-1:0],
 | 
			
		||||
  input logic                 DCacheFetchLine,
 | 
			
		||||
  input logic                 DCacheWriteLine,
 | 
			
		||||
  output logic                DCacheBusAck,
 | 
			
		||||
@ -69,12 +70,10 @@ module busdp #(parameter WORDSPERLINE, parameter LINELEN, WORDLEN)
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  localparam integer   WordCountThreshold = (`DMEM == `MEM_CACHE) ? WORDSPERLINE - 1 : 0;
 | 
			
		||||
  localparam integer   LOGWPL = (`DMEM == `MEM_CACHE) ? $clog2(WORDSPERLINE) : 1;
 | 
			
		||||
 | 
			
		||||
  logic                       SelUncachedAdr;
 | 
			
		||||
  logic [`XLEN-1:0]           PreLSUBusHWDATA;
 | 
			
		||||
  logic [`PA_BITS-1:0]        LocalLSUBusAdr;
 | 
			
		||||
  logic [LOGWPL-1:0]          WordCount;
 | 
			
		||||
 | 
			
		||||
  genvar                      index;
 | 
			
		||||
 | 
			
		||||
  for (index = 0; index < WORDSPERLINE; index++) begin:fetchbuffer
 | 
			
		||||
@ -85,9 +84,7 @@ module busdp #(parameter WORDSPERLINE, parameter LINELEN, WORDLEN)
 | 
			
		||||
 | 
			
		||||
  mux2 #(`PA_BITS) localadrmux(DCacheBusAdr, LSUPAdrM, SelUncachedAdr, LocalLSUBusAdr);
 | 
			
		||||
  assign LSUBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalLSUBusAdr;
 | 
			
		||||
  assign PreLSUBusHWDATA = ReadDataLineSetsM[WordCount]; // only in lsu, not ifu
 | 
			
		||||
  mux2 #(`XLEN) lsubushwdatamux(
 | 
			
		||||
    .d0(PreLSUBusHWDATA), .d1(FinalAMOWriteDataM), .s(SelUncachedAdr), .y(LSUBusHWDATA));
 | 
			
		||||
  //assign PreLSUBusHWDATA = ReadDataWordM;// ReadDataLineSetsM[WordCount]; // only in lsu, not ifu
 | 
			
		||||
  mux2 #(3) lsubussizemux(
 | 
			
		||||
    .d0(`XLEN == 32 ? 3'b010 : 3'b011), .d1(LSUFunct3M), .s(SelUncachedAdr), .y(LSUBusSize));
 | 
			
		||||
  mux2 #(WORDLEN) UnCachedDataMux(
 | 
			
		||||
 | 
			
		||||
@ -173,6 +173,8 @@ module lsu (
 | 
			
		||||
  logic [`XLEN-1:0]    FinalAMOWriteDataM, FinalWriteDataM;
 | 
			
		||||
  logic [`XLEN-1:0]    ReadDataWordM;
 | 
			
		||||
  logic [`XLEN-1:0]    ReadDataWordMuxM;
 | 
			
		||||
  logic                SelUncachedAdr;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if (`DMEM == `MEM_TIM) begin : dtim
 | 
			
		||||
    dtim dtim(.clk, .reset, .CPUBusy, .LSURWM, .IEUAdrM, .IEUAdrE, .TrapM, .FinalWriteDataM, 
 | 
			
		||||
@ -183,25 +185,37 @@ module lsu (
 | 
			
		||||
  end else begin : bus  
 | 
			
		||||
    localparam integer   WORDSPERLINE = (`DMEM == `MEM_CACHE) ? `DCACHE_LINELENINBITS/`XLEN : 1;
 | 
			
		||||
    localparam integer   LINELEN = (`DMEM == `MEM_CACHE) ? `DCACHE_LINELENINBITS : `XLEN;
 | 
			
		||||
    logic [`XLEN-1:0]    ReadDataLineSetsM [WORDSPERLINE-1:0];
 | 
			
		||||
    localparam integer   LOGWPL = (`DMEM == `MEM_CACHE) ? $clog2(WORDSPERLINE) : 1;
 | 
			
		||||
    logic [LINELEN-1:0]  ReadDataLineM;
 | 
			
		||||
    logic [LINELEN-1:0]  DCacheMemWriteData;
 | 
			
		||||
    logic [`PA_BITS-1:0] DCacheBusAdr;
 | 
			
		||||
    logic                DCacheWriteLine;
 | 
			
		||||
    logic                DCacheFetchLine;
 | 
			
		||||
    logic                DCacheBusAck;
 | 
			
		||||
    logic                save,restore;
 | 
			
		||||
 | 
			
		||||
    busdp #(WORDSPERLINE, LINELEN, `XLEN) busdp(
 | 
			
		||||
    logic                save, restore;
 | 
			
		||||
    logic [`PA_BITS-1:0] WordOffsetAddr;
 | 
			
		||||
    logic                SelBus;
 | 
			
		||||
    logic [LOGWPL-1:0]   WordCount;
 | 
			
		||||
    logic [`XLEN-1:0]    ReadDataLineSetsM [WORDSPERLINE-1:0];
 | 
			
		||||
    logic [`PA_BITS-1-`XLEN/8-LOGWPL:0] Pad;
 | 
			
		||||
            
 | 
			
		||||
    busdp #(WORDSPERLINE, LINELEN, `XLEN, LOGWPL) busdp(
 | 
			
		||||
      .clk, .reset,
 | 
			
		||||
      .LSUBusHRDATA, .LSUBusAck, .LSUBusWrite, .LSUBusRead, .LSUBusHWDATA, .LSUBusSize, 
 | 
			
		||||
      .LSUBusHRDATA, .LSUBusAck, .LSUBusWrite, .LSUBusRead, .LSUBusSize,
 | 
			
		||||
                                                        .WordCount, .SelUncachedAdr,
 | 
			
		||||
      .LSUFunct3M, .LSUBusAdr, .DCacheBusAdr, .ReadDataLineSetsM, .DCacheFetchLine,
 | 
			
		||||
      .DCacheWriteLine, .DCacheBusAck, .DCacheMemWriteData, .LSUPAdrM, .FinalAMOWriteDataM,
 | 
			
		||||
      .ReadDataWordM, .ReadDataWordMuxM, .IgnoreRequest, .LSURWM, .CPUBusy, .CacheableM,
 | 
			
		||||
      .BusStall, .BusCommittedM);
 | 
			
		||||
 | 
			
		||||
    assign Pad = '0;
 | 
			
		||||
    assign WordOffsetAddr = LSUBusWrite ? ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) : LSUPAdrM;
 | 
			
		||||
      mux2 #(`XLEN) lsubushwdatamux(
 | 
			
		||||
    .d0(ReadDataWordM), .d1(FinalAMOWriteDataM), .s(SelUncachedAdr), .y(LSUBusHWDATA));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    subcachelineread #(LINELEN, `XLEN, `XLEN) subcachelineread(
 | 
			
		||||
      .clk, .reset, .PAdr(LSUPAdrM), .save, .restore,
 | 
			
		||||
      .clk, .reset, .PAdr(WordOffsetAddr), .save, .restore,
 | 
			
		||||
      .ReadDataLine(ReadDataLineM), .ReadDataWord(ReadDataWordM));
 | 
			
		||||
    
 | 
			
		||||
    if(`DMEM == `MEM_CACHE) begin : dcache
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user