+ Microarchitecture optimizations + 64-bit support + Xilinx FPGA support + LLVM-16 support + Refactoring and quality control fixes minor update minor update minor update minor update minor update minor update cleanup cleanup cache bindings and memory perf refactory minor update minor update hw unit tests fixes minor update minor update minor update minor update minor update minor udpate minor update minor update minor update minor update minor update minor update minor update minor updates minor updates minor update minor update minor update minor update minor update minor update minor updates minor updates minor updates minor updates minor update minor update
169 lines
5.8 KiB
Systemverilog
169 lines
5.8 KiB
Systemverilog
// Copyright © 2019-2023
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
`include "VX_cache_define.vh"
|
|
|
|
module VX_cache_top #(
|
|
parameter `STRING INSTANCE_ID = "",
|
|
|
|
// Number of Word requests per cycle
|
|
parameter NUM_REQS = 4,
|
|
|
|
// Size of cache in bytes
|
|
parameter CACHE_SIZE = 16384,
|
|
// Size of line inside a bank in bytes
|
|
parameter LINE_SIZE = 16,
|
|
// Number of banks
|
|
parameter NUM_BANKS = 4,
|
|
// Number of associative ways
|
|
parameter NUM_WAYS = 4,
|
|
// Size of a word in bytes
|
|
parameter WORD_SIZE = 4,
|
|
|
|
// Core Response Queue Size
|
|
parameter CRSQ_SIZE = 2,
|
|
// Miss Reserv Queue Knob
|
|
parameter MSHR_SIZE = 16,
|
|
// Memory Response Queue Size
|
|
parameter MRSQ_SIZE = 0,
|
|
// Memory Request Queue Size
|
|
parameter MREQ_SIZE = 4,
|
|
|
|
// Enable cache writeable
|
|
parameter WRITE_ENABLE = 1,
|
|
|
|
// Request debug identifier
|
|
parameter UUID_WIDTH = 0,
|
|
|
|
// core request tag size
|
|
parameter TAG_WIDTH = 16,
|
|
|
|
// Core response output register
|
|
parameter CORE_OUT_REG = 2,
|
|
|
|
// Memory request output register
|
|
parameter MEM_OUT_REG = 2,
|
|
|
|
parameter MEM_TAG_WIDTH = `CLOG2(MSHR_SIZE) + `CLOG2(NUM_BANKS)
|
|
) (
|
|
input wire clk,
|
|
input wire reset,
|
|
|
|
// PERF
|
|
`ifdef PERF_ENABLE
|
|
output cache_perf_t cache_perf,
|
|
`endif
|
|
|
|
// Core request
|
|
input wire [NUM_REQS-1:0] core_req_valid,
|
|
input wire [NUM_REQS-1:0] core_req_rw,
|
|
input wire [NUM_REQS-1:0][WORD_SIZE-1:0] core_req_byteen,
|
|
input wire [NUM_REQS-1:0][`CS_WORD_ADDR_WIDTH-1:0] core_req_addr,
|
|
input wire [NUM_REQS-1:0][`CS_WORD_WIDTH-1:0] core_req_data,
|
|
input wire [NUM_REQS-1:0][TAG_WIDTH-1:0] core_req_tag,
|
|
output wire [NUM_REQS-1:0] core_req_ready,
|
|
|
|
// Core response
|
|
output wire [NUM_REQS-1:0] core_rsp_valid,
|
|
output wire [NUM_REQS-1:0][`CS_WORD_WIDTH-1:0] core_rsp_data,
|
|
output wire [NUM_REQS-1:0][TAG_WIDTH-1:0] core_rsp_tag,
|
|
input wire [NUM_REQS-1:0] core_rsp_ready,
|
|
|
|
// Memory request
|
|
output wire mem_req_valid,
|
|
output wire mem_req_rw,
|
|
output wire [LINE_SIZE-1:0] mem_req_byteen,
|
|
output wire [`CS_MEM_ADDR_WIDTH-1:0] mem_req_addr,
|
|
output wire [`CS_LINE_WIDTH-1:0] mem_req_data,
|
|
output wire [MEM_TAG_WIDTH-1:0] mem_req_tag,
|
|
input wire mem_req_ready,
|
|
|
|
// Memory response
|
|
input wire mem_rsp_valid,
|
|
input wire [`CS_LINE_WIDTH-1:0] mem_rsp_data,
|
|
input wire [MEM_TAG_WIDTH-1:0] mem_rsp_tag,
|
|
output wire mem_rsp_ready
|
|
);
|
|
VX_mem_bus_if #(
|
|
.DATA_SIZE (WORD_SIZE),
|
|
.TAG_WIDTH (TAG_WIDTH)
|
|
) core_bus_if[NUM_REQS]();
|
|
|
|
VX_mem_bus_if #(
|
|
.DATA_SIZE (LINE_SIZE),
|
|
.TAG_WIDTH (MEM_TAG_WIDTH)
|
|
) mem_bus_if();
|
|
|
|
// Core request
|
|
for (genvar i = 0; i < NUM_REQS; ++i) begin
|
|
assign core_bus_if[i].req_valid = core_req_valid[i];
|
|
assign core_bus_if[i].req_data.rw = core_req_rw[i];
|
|
assign core_bus_if[i].req_data.byteen = core_req_byteen[i];
|
|
assign core_bus_if[i].req_data.addr = core_req_addr[i];
|
|
assign core_bus_if[i].req_data.data = core_req_data[i];
|
|
assign core_bus_if[i].req_data.tag = core_req_tag[i];
|
|
assign core_req_ready[i] = core_bus_if[i].req_ready;
|
|
end
|
|
|
|
// Core response
|
|
for (genvar i = 0; i < NUM_REQS; ++i) begin
|
|
assign core_rsp_valid[i] = core_bus_if[i].rsp_valid;
|
|
assign core_rsp_data[i] = core_bus_if[i].rsp_data.data;
|
|
assign core_rsp_tag[i] = core_bus_if[i].rsp_data.tag;
|
|
assign core_bus_if[i].rsp_ready = core_rsp_ready[i];
|
|
end
|
|
|
|
// Memory request
|
|
assign mem_req_valid = mem_bus_if.req_valid;
|
|
assign mem_req_rw = mem_bus_if.req_data.rw;
|
|
assign mem_req_byteen = mem_bus_if.req_data.byteen;
|
|
assign mem_req_addr = mem_bus_if.req_data.addr;
|
|
assign mem_req_data = mem_bus_if.req_data.data;
|
|
assign mem_req_tag = mem_bus_if.req_data.tag;
|
|
assign mem_bus_if.req_ready = mem_req_ready;
|
|
|
|
// Memory response
|
|
assign mem_bus_if.rsp_valid = mem_rsp_valid;
|
|
assign mem_bus_if.rsp_data.data = mem_rsp_data;
|
|
assign mem_bus_if.rsp_data.tag = mem_rsp_tag;
|
|
assign mem_rsp_ready = mem_bus_if.rsp_ready;
|
|
|
|
VX_cache #(
|
|
.INSTANCE_ID (INSTANCE_ID),
|
|
.CACHE_SIZE (CACHE_SIZE),
|
|
.LINE_SIZE (LINE_SIZE),
|
|
.NUM_BANKS (NUM_BANKS),
|
|
.NUM_WAYS (NUM_WAYS),
|
|
.WORD_SIZE (WORD_SIZE),
|
|
.NUM_REQS (NUM_REQS),
|
|
.CRSQ_SIZE (CRSQ_SIZE),
|
|
.MSHR_SIZE (MSHR_SIZE),
|
|
.MRSQ_SIZE (MRSQ_SIZE),
|
|
.MREQ_SIZE (MREQ_SIZE),
|
|
.TAG_WIDTH (TAG_WIDTH),
|
|
.UUID_WIDTH (UUID_WIDTH),
|
|
.WRITE_ENABLE (WRITE_ENABLE),
|
|
.CORE_OUT_REG (CORE_OUT_REG),
|
|
.MEM_OUT_REG (MEM_OUT_REG)
|
|
) cache (
|
|
`ifdef PERF_ENABLE
|
|
.cache_perf (cache_perf),
|
|
`endif
|
|
.clk (clk),
|
|
.reset (reset),
|
|
.core_bus_if (core_bus_if),
|
|
.mem_bus_if (mem_bus_if)
|
|
);
|
|
|
|
endmodule
|