mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
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 FinalPCPF = PCPF;
|
|
||||||
|
|
||||||
// *** CHANGE ME
|
assign ICacheBusAdr = {PCPF[`PA_BITS-1:OFFSETLEN], {{OFFSETLEN}{1'b0}}};
|
||||||
// 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