2019-06-04 22:57:48 +08:00
|
|
|
//********************************************************************************
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Copyright 2019 Western Digital Corporation or its affiliates.
|
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
//********************************************************************************
|
|
|
|
|
|
|
|
module mem
|
|
|
|
import swerv_types::*;
|
|
|
|
(
|
2019-08-14 03:48:48 +08:00
|
|
|
input logic clk,
|
|
|
|
input logic rst_l,
|
2019-06-04 22:57:48 +08:00
|
|
|
input logic lsu_freeze_dc3,
|
|
|
|
input logic dccm_clk_override,
|
|
|
|
input logic icm_clk_override,
|
|
|
|
input logic dec_tlu_core_ecc_disable,
|
2019-08-14 03:48:48 +08:00
|
|
|
|
2019-06-04 22:57:48 +08:00
|
|
|
//DCCM ports
|
|
|
|
input logic dccm_wren,
|
|
|
|
input logic dccm_rden,
|
|
|
|
input logic [`RV_DCCM_BITS-1:0] dccm_wr_addr,
|
|
|
|
input logic [`RV_DCCM_BITS-1:0] dccm_rd_addr_lo,
|
|
|
|
input logic [`RV_DCCM_BITS-1:0] dccm_rd_addr_hi,
|
|
|
|
input logic [`RV_DCCM_FDATA_WIDTH-1:0] dccm_wr_data,
|
|
|
|
|
|
|
|
|
|
|
|
output logic [`RV_DCCM_FDATA_WIDTH-1:0] dccm_rd_data_lo,
|
|
|
|
output logic [`RV_DCCM_FDATA_WIDTH-1:0] dccm_rd_data_hi,
|
|
|
|
|
|
|
|
|
|
|
|
`ifdef RV_ICCM_ENABLE
|
|
|
|
//ICCM ports
|
|
|
|
input logic [`RV_ICCM_BITS-1:2] iccm_rw_addr,
|
|
|
|
input logic iccm_wren,
|
|
|
|
input logic iccm_rden,
|
|
|
|
input logic [2:0] iccm_wr_size,
|
|
|
|
input logic [77:0] iccm_wr_data,
|
2019-08-14 03:48:48 +08:00
|
|
|
|
2019-06-04 22:57:48 +08:00
|
|
|
output logic [155:0] iccm_rd_data,
|
|
|
|
`endif
|
|
|
|
// Icache and Itag Ports
|
|
|
|
`ifdef RV_ICACHE_ENABLE //temp
|
|
|
|
input logic [31:3] ic_rw_addr,
|
|
|
|
input logic [3:0] ic_tag_valid,
|
|
|
|
input logic [3:0] ic_wr_en,
|
|
|
|
input logic ic_rd_en,
|
|
|
|
input logic [127:0] ic_premux_data, // Premux data to be muxed with each way of the Icache.
|
|
|
|
input logic ic_sel_premux_data, // Premux data sel
|
|
|
|
|
|
|
|
`ifdef RV_ICACHE_ECC
|
|
|
|
input logic [83:0] ic_wr_data, // Data to fill to the Icache. With ECC
|
|
|
|
input logic [41:0] ic_debug_wr_data, // Debug wr cache.
|
|
|
|
`else
|
|
|
|
input logic [67:0] ic_wr_data, // Data to fill to the Icache. With Parity
|
|
|
|
input logic [33:0] ic_debug_wr_data, // Debug wr cache.
|
|
|
|
`endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
input logic [15:2] ic_debug_addr, // Read/Write addresss to the Icache.
|
|
|
|
input logic ic_debug_rd_en, // Icache debug rd
|
|
|
|
input logic ic_debug_wr_en, // Icache debug wr
|
|
|
|
input logic ic_debug_tag_array, // Debug tag array
|
|
|
|
input logic [3:0] ic_debug_way, // Debug way. Rd or Wr.
|
|
|
|
|
|
|
|
`endif
|
|
|
|
|
|
|
|
`ifdef RV_ICACHE_ECC
|
|
|
|
output logic [167:0] ic_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With ECC
|
|
|
|
output logic [24:0] ictag_debug_rd_data,// Debug icache tag.
|
|
|
|
`else
|
|
|
|
output logic [135:0] ic_rd_data , // Data read from Icache. 2x64bits + parity bits. F2 stage. With Parity
|
|
|
|
output logic [20:0] ictag_debug_rd_data,// Debug icache tag.
|
|
|
|
`endif
|
|
|
|
|
|
|
|
output logic [3:0] ic_rd_hit,
|
|
|
|
output logic ic_tag_perr, // Icache Tag parity error
|
|
|
|
|
|
|
|
|
|
|
|
input logic scan_mode
|
|
|
|
|
|
|
|
);
|
|
|
|
`include "global.h"
|
|
|
|
|
|
|
|
`ifdef RV_DCCM_ENABLE
|
|
|
|
localparam DCCM_ENABLE = 1'b1;
|
|
|
|
`else
|
|
|
|
localparam DCCM_ENABLE = 1'b0;
|
|
|
|
`endif
|
|
|
|
|
|
|
|
// DCCM Instantiation
|
|
|
|
if (DCCM_ENABLE == 1) begin: Gen_dccm_enable
|
|
|
|
lsu_dccm_mem dccm (
|
|
|
|
.clk_override(dccm_clk_override),
|
|
|
|
.*
|
|
|
|
);
|
|
|
|
end else begin: Gen_dccm_disable
|
|
|
|
assign dccm_rd_data_lo = '0;
|
|
|
|
assign dccm_rd_data_hi = '0;
|
|
|
|
end
|
|
|
|
|
|
|
|
`ifdef RV_ICACHE_ENABLE
|
|
|
|
ifu_ic_mem icm (
|
|
|
|
.clk_override(icm_clk_override),
|
|
|
|
.*
|
|
|
|
);
|
|
|
|
`else
|
|
|
|
assign ic_rd_hit[3:0] = '0;
|
|
|
|
assign ic_tag_perr = '0 ;
|
|
|
|
assign ic_rd_data = '0 ;
|
|
|
|
assign ictag_debug_rd_data = '0 ;
|
|
|
|
`endif
|
|
|
|
|
|
|
|
`ifdef RV_ICCM_ENABLE
|
|
|
|
ifu_iccm_mem iccm (.*,
|
|
|
|
.clk_override(icm_clk_override),
|
|
|
|
.iccm_rw_addr(iccm_rw_addr[`RV_ICCM_BITS-1:2]),
|
|
|
|
.iccm_rd_data(iccm_rd_data[155:0])
|
|
|
|
);
|
|
|
|
`endif
|
|
|
|
|
|
|
|
endmodule
|