| // Copyright 2020-2022 F4PGA Authors |
| // |
| // 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 |
| |
| `default_nettype wire |
| module sram1024x18 ( |
| clk_a, |
| cen_a, |
| wen_a, |
| addr_a, |
| wmsk_a, |
| wdata_a, |
| rdata_a, |
| clk_b, |
| cen_b, |
| wen_b, |
| addr_b, |
| wmsk_b, |
| wdata_b, |
| rdata_b |
| ); |
| (* clkbuf_sink *) |
| input wire clk_a; |
| input wire cen_a; |
| input wire wen_a; |
| input wire [9:0] addr_a; |
| input wire [17:0] wmsk_a; |
| input wire [17:0] wdata_a; |
| output reg [17:0] rdata_a; |
| (* clkbuf_sink *) |
| input wire clk_b; |
| input wire cen_b; |
| input wire wen_b; |
| input wire [9:0] addr_b; |
| input wire [17:0] wmsk_b; |
| input wire [17:0] wdata_b; |
| output reg [17:0] rdata_b; |
| reg [17:0] ram [1023:0]; |
| reg [9:0] laddr_a; |
| reg [9:0] laddr_b; |
| reg lcen_a; |
| reg lwen_a; |
| reg [17:0] lwdata_a; |
| reg lcen_b; |
| reg lwen_b; |
| reg [17:0] lwdata_b; |
| reg [17:0] lwmsk_a; |
| reg [17:0] lwmsk_b; |
| always @(posedge clk_a) begin |
| laddr_a <= addr_a; |
| lwdata_a <= wdata_a; |
| lwmsk_a <= wmsk_a; |
| lcen_a <= cen_a; |
| lwen_a <= wen_a; |
| end |
| always @(posedge clk_b) begin |
| laddr_b <= addr_b; |
| lwdata_b <= wdata_b; |
| lwmsk_b <= wmsk_b; |
| lcen_b <= cen_b; |
| lwen_b <= wen_b; |
| end |
| always @(*) begin |
| if ((lwen_b == 0) && (lcen_b == 0)) begin |
| ram[laddr_b][0] = (lwmsk_b[0] ? ram[laddr_b][0] : lwdata_b[0]); |
| ram[laddr_b][1] = (lwmsk_b[1] ? ram[laddr_b][1] : lwdata_b[1]); |
| ram[laddr_b][2] = (lwmsk_b[2] ? ram[laddr_b][2] : lwdata_b[2]); |
| ram[laddr_b][3] = (lwmsk_b[3] ? ram[laddr_b][3] : lwdata_b[3]); |
| ram[laddr_b][4] = (lwmsk_b[4] ? ram[laddr_b][4] : lwdata_b[4]); |
| ram[laddr_b][5] = (lwmsk_b[5] ? ram[laddr_b][5] : lwdata_b[5]); |
| ram[laddr_b][6] = (lwmsk_b[6] ? ram[laddr_b][6] : lwdata_b[6]); |
| ram[laddr_b][7] = (lwmsk_b[7] ? ram[laddr_b][7] : lwdata_b[7]); |
| ram[laddr_b][8] = (lwmsk_b[8] ? ram[laddr_b][8] : lwdata_b[8]); |
| ram[laddr_b][9] = (lwmsk_b[9] ? ram[laddr_b][9] : lwdata_b[9]); |
| ram[laddr_b][10] = (lwmsk_b[10] ? ram[laddr_b][10] : lwdata_b[10]); |
| ram[laddr_b][11] = (lwmsk_b[11] ? ram[laddr_b][11] : lwdata_b[11]); |
| ram[laddr_b][12] = (lwmsk_b[12] ? ram[laddr_b][12] : lwdata_b[12]); |
| ram[laddr_b][13] = (lwmsk_b[13] ? ram[laddr_b][13] : lwdata_b[13]); |
| ram[laddr_b][14] = (lwmsk_b[14] ? ram[laddr_b][14] : lwdata_b[14]); |
| ram[laddr_b][15] = (lwmsk_b[15] ? ram[laddr_b][15] : lwdata_b[15]); |
| ram[laddr_b][16] = (lwmsk_b[16] ? ram[laddr_b][16] : lwdata_b[16]); |
| ram[laddr_b][17] = (lwmsk_b[17] ? ram[laddr_b][17] : lwdata_b[17]); |
| lwen_b = 1; |
| end |
| if (lcen_b == 0) begin |
| rdata_b = ram[laddr_b]; |
| lcen_b = 1; |
| end |
| else |
| rdata_b = rdata_b; |
| end |
| always @(*) begin |
| if ((lwen_a == 0) && (lcen_a == 0)) begin |
| ram[laddr_a][0] = (lwmsk_a[0] ? ram[laddr_a][0] : lwdata_a[0]); |
| ram[laddr_a][1] = (lwmsk_a[1] ? ram[laddr_a][1] : lwdata_a[1]); |
| ram[laddr_a][2] = (lwmsk_a[2] ? ram[laddr_a][2] : lwdata_a[2]); |
| ram[laddr_a][3] = (lwmsk_a[3] ? ram[laddr_a][3] : lwdata_a[3]); |
| ram[laddr_a][4] = (lwmsk_a[4] ? ram[laddr_a][4] : lwdata_a[4]); |
| ram[laddr_a][5] = (lwmsk_a[5] ? ram[laddr_a][5] : lwdata_a[5]); |
| ram[laddr_a][6] = (lwmsk_a[6] ? ram[laddr_a][6] : lwdata_a[6]); |
| ram[laddr_a][7] = (lwmsk_a[7] ? ram[laddr_a][7] : lwdata_a[7]); |
| ram[laddr_a][8] = (lwmsk_a[8] ? ram[laddr_a][8] : lwdata_a[8]); |
| ram[laddr_a][9] = (lwmsk_a[9] ? ram[laddr_a][9] : lwdata_a[9]); |
| ram[laddr_a][10] = (lwmsk_a[10] ? ram[laddr_a][10] : lwdata_a[10]); |
| ram[laddr_a][11] = (lwmsk_a[11] ? ram[laddr_a][11] : lwdata_a[11]); |
| ram[laddr_a][12] = (lwmsk_a[12] ? ram[laddr_a][12] : lwdata_a[12]); |
| ram[laddr_a][13] = (lwmsk_a[13] ? ram[laddr_a][13] : lwdata_a[13]); |
| ram[laddr_a][14] = (lwmsk_a[14] ? ram[laddr_a][14] : lwdata_a[14]); |
| ram[laddr_a][15] = (lwmsk_a[15] ? ram[laddr_a][15] : lwdata_a[15]); |
| ram[laddr_a][16] = (lwmsk_a[16] ? ram[laddr_a][16] : lwdata_a[16]); |
| ram[laddr_a][17] = (lwmsk_a[17] ? ram[laddr_a][17] : lwdata_a[17]); |
| lwen_a = 1; |
| end |
| if (lcen_a == 0) begin |
| rdata_a = ram[laddr_a]; |
| lcen_a = 1; |
| end |
| else |
| rdata_a = rdata_a; |
| end |
| endmodule |
| `default_nettype none |