203 lines
5.5 KiB
Systemverilog
203 lines
5.5 KiB
Systemverilog
// SPDX-License-Identifier: Apache-2.0
|
|
// Copyright 2020 Western Digital Corporation or it's 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.
|
|
|
|
`define EL2_LOCAL_RAM_TEST_IO \
|
|
input logic WE, \
|
|
input logic ME, \
|
|
input logic CLK
|
|
|
|
`define EL2_RAM(depth, width) \
|
|
module ram_``depth``x``width( \
|
|
input logic [$clog2(depth)-1:0] ADR, \
|
|
input logic [(width-1):0] D, \
|
|
output logic [(width-1):0] Q, \
|
|
`EL2_LOCAL_RAM_TEST_IO \
|
|
); \
|
|
reg [(width-1):0] ram_core [(depth-1):0]; \
|
|
\
|
|
always @(posedge CLK) begin \
|
|
if (ME && WE) ram_core[ADR] <= D; \
|
|
if (ME && ~WE) Q <= ram_core[ADR]; \
|
|
end \
|
|
\
|
|
endmodule
|
|
|
|
`define EL2_RAM_BE(depth, width) \
|
|
module ram_be_``depth``x``width( \
|
|
input logic [$clog2(depth)-1:0] ADR, \
|
|
input logic [(width-1):0] D, WEM, \
|
|
output logic [(width-1):0] Q, \
|
|
`EL2_LOCAL_RAM_TEST_IO \
|
|
); \
|
|
reg [(width-1):0] ram_core [(depth-1):0]; \
|
|
\
|
|
always @(posedge CLK) begin \
|
|
if (ME && WE) ram_core[ADR] = D & WEM | ~WEM & ram_core[ADR];\
|
|
if (ME && ~WE) Q <= ram_core[ADR]; \
|
|
end \
|
|
\
|
|
\
|
|
endmodule
|
|
|
|
// parameterizable RAM for verilator sims
|
|
module el2_ram #(depth=4096, width=39) (
|
|
input logic [$clog2(depth)-1:0] ADR,
|
|
input logic [(width-1):0] D,
|
|
output logic [(width-1):0] Q,
|
|
`EL2_LOCAL_RAM_TEST_IO
|
|
);
|
|
reg [(width-1):0] ram_core [(depth-1):0];
|
|
|
|
always @(posedge CLK) begin
|
|
if (ME && WE) ram_core[ADR] = D;
|
|
if (ME && ~WE) Q <= ram_core[ADR];
|
|
end
|
|
endmodule
|
|
|
|
//=========================================================================================================================
|
|
//=================================== START OF CCM =======================================================================
|
|
//============= Possible sram sizes for a 39 bit wide memory ( 4 bytes + 7 bits ECC ) =====================================
|
|
//-------------------------------------------------------------------------------------------------------------------------
|
|
`EL2_RAM(32768, 39)
|
|
`EL2_RAM(16384, 39)
|
|
`EL2_RAM(8192, 39)
|
|
`EL2_RAM(4096, 39)
|
|
`EL2_RAM(3072, 39)
|
|
`EL2_RAM(2048, 39)
|
|
`EL2_RAM(1536, 39) // need this for the 48KB DCCM option)
|
|
`EL2_RAM(1024, 39)
|
|
`EL2_RAM(768, 39)
|
|
`EL2_RAM(512, 39)
|
|
`EL2_RAM(256, 39)
|
|
`EL2_RAM(128, 39)
|
|
`EL2_RAM(1024, 20)
|
|
`EL2_RAM(512, 20)
|
|
`EL2_RAM(256, 20)
|
|
`EL2_RAM(128, 20)
|
|
`EL2_RAM(64, 20)
|
|
`EL2_RAM(4096, 34)
|
|
`EL2_RAM(2048, 34)
|
|
`EL2_RAM(1024, 34)
|
|
`EL2_RAM(512, 34)
|
|
`EL2_RAM(256, 34)
|
|
`EL2_RAM(128, 34)
|
|
`EL2_RAM(64, 34)
|
|
`EL2_RAM(8192, 68)
|
|
`EL2_RAM(4096, 68)
|
|
`EL2_RAM(2048, 68)
|
|
`EL2_RAM(1024, 68)
|
|
`EL2_RAM(512, 68)
|
|
`EL2_RAM(256, 68)
|
|
`EL2_RAM(128, 68)
|
|
`EL2_RAM(64, 68)
|
|
`EL2_RAM(8192, 71)
|
|
`EL2_RAM(4096, 71)
|
|
`EL2_RAM(2048, 71)
|
|
`EL2_RAM(1024, 71)
|
|
`EL2_RAM(512, 71)
|
|
`EL2_RAM(256, 71)
|
|
`EL2_RAM(128, 71)
|
|
`EL2_RAM(64, 71)
|
|
`EL2_RAM(4096, 42)
|
|
`EL2_RAM(2048, 42)
|
|
`EL2_RAM(1024, 42)
|
|
`EL2_RAM(512, 42)
|
|
`EL2_RAM(256, 42)
|
|
`EL2_RAM(128, 42)
|
|
`EL2_RAM(64, 42)
|
|
`EL2_RAM(4096, 22)
|
|
`EL2_RAM(2048, 22)
|
|
`EL2_RAM(1024, 22)
|
|
`EL2_RAM(512, 22)
|
|
`EL2_RAM(256, 22)
|
|
`EL2_RAM(128, 22)
|
|
`EL2_RAM(64, 22)
|
|
`EL2_RAM(1024, 26)
|
|
`EL2_RAM(4096, 26)
|
|
`EL2_RAM(2048, 26)
|
|
`EL2_RAM(512, 26)
|
|
`EL2_RAM(256, 26)
|
|
`EL2_RAM(128, 26)
|
|
`EL2_RAM(64, 26)
|
|
`EL2_RAM(32, 26)
|
|
`EL2_RAM(32, 22)
|
|
`EL2_RAM_BE(8192, 142)
|
|
`EL2_RAM_BE(4096, 142)
|
|
`EL2_RAM_BE(2048, 142)
|
|
`EL2_RAM_BE(1024, 142)
|
|
`EL2_RAM_BE(512, 142)
|
|
`EL2_RAM_BE(256, 142)
|
|
`EL2_RAM_BE(128, 142)
|
|
`EL2_RAM_BE(64, 142)
|
|
`EL2_RAM_BE(8192, 284)
|
|
`EL2_RAM_BE(4096, 284)
|
|
`EL2_RAM_BE(2048, 284)
|
|
`EL2_RAM_BE(1024, 284)
|
|
`EL2_RAM_BE(512, 284)
|
|
`EL2_RAM_BE(256, 284)
|
|
`EL2_RAM_BE(128, 284)
|
|
`EL2_RAM_BE(64, 284)
|
|
`EL2_RAM_BE(8192, 136)
|
|
`EL2_RAM_BE(4096, 136)
|
|
`EL2_RAM_BE(2048, 136)
|
|
`EL2_RAM_BE(1024, 136)
|
|
`EL2_RAM_BE(512, 136)
|
|
`EL2_RAM_BE(256, 136)
|
|
`EL2_RAM_BE(128, 136)
|
|
`EL2_RAM_BE(64, 136)
|
|
`EL2_RAM_BE(8192, 272)
|
|
`EL2_RAM_BE(4096, 272)
|
|
`EL2_RAM_BE(2048, 272)
|
|
`EL2_RAM_BE(1024, 272)
|
|
`EL2_RAM_BE(512, 272)
|
|
`EL2_RAM_BE(256, 272)
|
|
`EL2_RAM_BE(128, 272)
|
|
`EL2_RAM_BE(64, 272)
|
|
`EL2_RAM_BE(4096, 52)
|
|
`EL2_RAM_BE(2048, 52)
|
|
`EL2_RAM_BE(1024, 52)
|
|
`EL2_RAM_BE(512, 52)
|
|
`EL2_RAM_BE(256, 52)
|
|
`EL2_RAM_BE(128, 52)
|
|
`EL2_RAM_BE(64, 52)
|
|
`EL2_RAM_BE(4096, 104)
|
|
`EL2_RAM_BE(2048, 104)
|
|
`EL2_RAM_BE(1024, 104)
|
|
`EL2_RAM_BE(512, 104)
|
|
`EL2_RAM_BE(256, 104)
|
|
`EL2_RAM_BE(128, 104)
|
|
`EL2_RAM_BE(64, 104)
|
|
`EL2_RAM_BE(4096, 44)
|
|
`EL2_RAM_BE(2048, 44)
|
|
`EL2_RAM_BE(1024, 44)
|
|
`EL2_RAM_BE(512, 44)
|
|
`EL2_RAM_BE(256, 44)
|
|
`EL2_RAM_BE(128, 44)
|
|
`EL2_RAM_BE(64, 44)
|
|
`EL2_RAM_BE(4096, 88)
|
|
`EL2_RAM_BE(2048, 88)
|
|
`EL2_RAM_BE(1024, 88)
|
|
`EL2_RAM_BE(512, 88)
|
|
`EL2_RAM_BE(256, 88)
|
|
`EL2_RAM_BE(128, 88)
|
|
`EL2_RAM_BE(64, 88)
|
|
|
|
|
|
`undef EL2_RAM
|
|
`undef EL2_RAM_BE
|
|
`undef EL2_LOCAL_RAM_TEST_IO
|
|
|
|
|