forked from Github_Repos/cvw
Begin changes to direct-mapped cache
This commit is contained in:
parent
631454ccf9
commit
5afb255251
100
wally-pipelined/src/cache/dmapped.sv
vendored
100
wally-pipelined/src/cache/dmapped.sv
vendored
@ -26,7 +26,7 @@
|
||||
|
||||
`include "wally-config.vh"
|
||||
|
||||
module rodirectmappedmem #(parameter LINESIZE = 256, parameter NUMLINES = 512, parameter WORDSIZE = `XLEN) (
|
||||
module rodirectmappedmem #(parameter NUMLINES=512, parameter LINESIZE = 256, parameter WORDSIZE = `XLEN) (
|
||||
// Pipeline stuff
|
||||
input logic clk,
|
||||
input logic reset,
|
||||
@ -44,50 +44,76 @@ module rodirectmappedmem #(parameter LINESIZE = 256, parameter NUMLINES = 512, p
|
||||
output logic DataValid
|
||||
);
|
||||
|
||||
localparam integer SETWIDTH = $clog2(NUMLINES);
|
||||
localparam integer OFFSETWIDTH = $clog2(LINESIZE/8);
|
||||
localparam integer TAGWIDTH = `XLEN-SETWIDTH-OFFSETWIDTH;
|
||||
// Various compile-time constants
|
||||
localparam integer WORDWIDTH = $clog2(WORDSIZE);
|
||||
localparam integer LINEWIDTH = $clog2(LINESIZE/8);
|
||||
localparam integer OFFSETWIDTH = $clog2(LINESIZE) - WORDWIDTH;
|
||||
localparam integer SETWIDTH = $clog2(NUMLINES);
|
||||
localparam integer TAGWIDTH = $clog2(`XLEN) - $clog2(LINESIZE) - SETWIDTH;
|
||||
|
||||
logic [NUMLINES-1:0][WORDSIZE-1:0] LineOutputs;
|
||||
logic [NUMLINES-1:0] ValidOutputs;
|
||||
logic [NUMLINES-1:0][TAGWIDTH-1:0] TagOutputs;
|
||||
logic [OFFSETWIDTH-1:0] WordSelect;
|
||||
logic [`XLEN-1:0] ReadPAdr;
|
||||
logic [SETWIDTH-1:0] ReadSet, WriteSet;
|
||||
logic [TAGWIDTH-1:0] ReadTag, WriteTag;
|
||||
// Machinery to read from and write to the correct addresses in memory
|
||||
logic [`XLEN-1:0] ReadPAdr;
|
||||
logic [OFFSETWIDTH-1:0] ReadOffset, WriteOffset;
|
||||
logic [SETWIDTH-1:0] ReadSet, WriteSet;
|
||||
logic [TAGWIDTH-1:0] ReadTag, WriteTag;
|
||||
|
||||
// Swizzle bits to get the offset, set, and tag out of the read and write addresses
|
||||
// Machinery to check if a given read is valid and is the desired value
|
||||
logic [TAGWIDTH-1:0] DataTag;
|
||||
logic [NUMLINES-1:0] ValidOut, NextValidOut;
|
||||
|
||||
// Assign the read and write addresses in cache memory
|
||||
always_comb begin
|
||||
// Read address
|
||||
assign WordSelect = ReadLowerAdr[OFFSETWIDTH-1:0];
|
||||
assign ReadOffset = ReadLowerAdr[WORDWIDTH+OFFSETWIDTH-1:WORDWIDTH];
|
||||
assign ReadPAdr = {ReadUpperPAdr, ReadLowerAdr};
|
||||
assign ReadSet = ReadPAdr[SETWIDTH+OFFSETWIDTH-1:OFFSETWIDTH];
|
||||
assign ReadTag = ReadPAdr[`XLEN-1:SETWIDTH+OFFSETWIDTH];
|
||||
// Write address
|
||||
assign WriteSet = WritePAdr[SETWIDTH+OFFSETWIDTH-1:OFFSETWIDTH];
|
||||
assign WriteTag = WritePAdr[`XLEN-1:SETWIDTH+OFFSETWIDTH];
|
||||
assign ReadSet = ReadPAdr[LINEWIDTH+SETWIDTH-1:LINEWIDTH];
|
||||
assign ReadTag = ReadPAdr[`XLEN-1:LINEWIDTH+SETWIDTH];
|
||||
|
||||
assign WriteOffset = WritePAdr[WORDWIDTH+OFFSETWIDTH-1:WORDWIDTH];
|
||||
assign WriteSet = WritePAdr[LINEWIDTH+SETWIDTH-1:LINEWIDTH];
|
||||
assign WriteTag = WritePAdr[`XLEN-1:LINEWIDTH+SETWIDTH];
|
||||
end
|
||||
|
||||
genvar i;
|
||||
generate
|
||||
for (i=0; i < NUMLINES; i++) begin
|
||||
rocacheline #(LINESIZE, TAGWIDTH, WORDSIZE) lines (
|
||||
.*,
|
||||
.WriteEnable(WriteEnable & (WriteSet == i)),
|
||||
.WriteData(WriteLine),
|
||||
.WriteTag(WriteTag),
|
||||
.DataWord(LineOutputs[i]),
|
||||
.DataTag(TagOutputs[i]),
|
||||
.DataValid(ValidOutputs[i])
|
||||
);
|
||||
end
|
||||
endgenerate
|
||||
SRAM2P1R1W #(.Depth(OFFSETWIDTH), .Width(WORDSIZE)) cachemem (
|
||||
.*,
|
||||
.RA1(ReadOffset),
|
||||
.RD1(DataWord),
|
||||
.REN1(1'b1),
|
||||
.WA1(WriteOffset),
|
||||
.WD1(WriteSet),
|
||||
.WEN1(WriteEnable),
|
||||
.BitWEN1(0)
|
||||
);
|
||||
|
||||
// Get the data and valid out of the lines
|
||||
SRAM2P1R1W #(.Depth(OFFSETWIDTH), .Width(TAGWIDTH)) cachetags (
|
||||
.*,
|
||||
.RA1(ReadOffset),
|
||||
.RD1(DataTag),
|
||||
.REN1(1'b1),
|
||||
.WA1(WriteOffset),
|
||||
.WD1(WriteTag),
|
||||
.WEN1(WriteEnable),
|
||||
.BitWEN1(0)
|
||||
);
|
||||
|
||||
// Correctly handle the valid bits
|
||||
always_comb begin
|
||||
assign DataWord = LineOutputs[ReadSet];
|
||||
assign DataValid = ValidOutputs[ReadSet] & (TagOutputs[ReadSet] == ReadTag);
|
||||
if (WriteEnable) begin
|
||||
assign NextValidOut = {NextValidOut[NUMLINES-1:WriteSet+1], 1'b1, NextValidOut[WriteSet-1:0]};
|
||||
end else begin
|
||||
assign NextValidOut = ValidOut;
|
||||
end
|
||||
end
|
||||
always_ff @(posedge clk, reset, flush) begin
|
||||
if (reset || flush) begin
|
||||
ValidOut <= {NUMLINES{1'b0}};
|
||||
end else begin
|
||||
ValidOut <= NextValidOut;
|
||||
end
|
||||
end
|
||||
|
||||
// Determine if the line coming out is valid and matches the desired data
|
||||
always_comb begin
|
||||
assign DataValid = ValidOut[ReadSet] && (DataTag == ReadTag);
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user