blob: 522632b86f51a33986120dc363f4bb0086e2fb4a [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////
// SPDX-FileCopyrightText: 2022 , Julien OURY
//
// 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.
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileContributor: Created by Julien OURY <julien.oury@outlook.fr>
//
////////////////////////////////////////////////////////////////////////////
module inferred_sram_1rw1r #(
parameter ASIZE = 32 , // Size of address bus (bits)
parameter DSIZE = 32 // Size of data bus (bits)
)(
input wire clk , // Clock (rising edge)
// Port 0 (R/W)
input wire cs0_n , // Chip select (active low)
input wire we0_n , // Write enable (active low)
input wire [ASIZE-1:0] addr0 , // Adress bus
input wire [DSIZE-1:0] wdata0 , // Data bus (write)
output reg [DSIZE-1:0] rdata0 , // Data bus (read)
// Port 1 (R/W)
input wire cs1_n , // Chip select (active low)
input wire [ASIZE-1:0] addr1 , // Adress bus
output reg [DSIZE-1:0] rdata1 // Data bus (read)
);
reg r_cs0_n ;
reg r_we0_n ;
reg [ASIZE-1:0] r_addr0 ;
reg [DSIZE-1:0] r_wdata0;
reg r_cs1_n ;
reg [ASIZE-1:0] r_addr1 ;
reg [DSIZE-1:0] memory[(2**ASIZE)-1:0];
// Registers inputs
always @(posedge clk) begin
r_cs0_n <= cs0_n ;
r_we0_n <= we0_n ;
r_addr0 <= addr0 ;
r_wdata0 <= wdata0;
r_cs1_n <= cs1_n ;
r_addr1 <= addr1 ;
end
// Port 0 : Write operation
always @(posedge clk) begin
if (!r_cs0_n && !r_we0_n) begin
memory[r_addr0] <= r_wdata0;
end
end
// Port 0 : Read operation
always @(posedge clk) begin
if (!r_cs0_n && r_we0_n) begin
rdata0 <= memory[r_addr0];
end
end
// Port 1 : Read operation
always @(posedge clk) begin
if (!r_cs1_n) begin
rdata1 <= memory[r_addr1];
end
end
endmodule