Merge pull request #264 from rakeshm75/update_cells_sim
Rectified cells_sim & dsp_map files
diff --git a/Makefile_test.common b/Makefile_test.common
index 84af520..db3cc3c 100644
--- a/Makefile_test.common
+++ b/Makefile_test.common
@@ -70,12 +70,14 @@
endef
+DEV = $(shell echo $(1) | cut -d "/" -f 1)
+SIM_LIBS = $(shell find ../$(DEV) -name "*.v" -not -name "*map.v" -not -name "cells_sim.v")
define test_sim_tpl =
$(1): $(1)/ok
@printf "Test %-18s \e[32mPASSED\e[0m @ %s\n" $(1) $(CURDIR);
$(1)/$$(notdir $(1).vvp): $(1)/$$(notdir $(1).v)
- @iverilog -vvvv -g2005 -o $$@ $$< -I../ -DVCD_FILE=\"$(1)/$$(notdir $(1).vcd)\" >$(1)/$$(notdir $(1).vvp.log) 2>&1; \
+ @iverilog -vvvv -g2005 -o $$@ $$< $(SIM_LIBS) -I../ -DVCD_FILE=\"$(1)/$$(notdir $(1).vcd)\" >$(1)/$$(notdir $(1).vvp.log) 2>&1; \
if [ $$$$? -ne 0 ]; then \
printf "Test %-18s \e[31;1mFAILED\e[0m @ %s\n" $(1) $(CURDIR); \
false; \
diff --git a/ql-qlf-plugin/qlf_k6n10f/TDP18Kx18_FIFO.v b/ql-qlf-plugin/qlf_k6n10f/TDP18Kx18_FIFO.v
new file mode 100644
index 0000000..bec428b
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/TDP18Kx18_FIFO.v
@@ -0,0 +1,360 @@
+// Copyright (C) 2022 The SymbiFlow Authors.
+//
+// Use of this source code is governed by a ISC-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/ISC
+//
+// SPDX-License-Identifier:ISC
+
+module TDP18K_FIFO (
+ RMODE_A,
+ RMODE_B,
+ WMODE_A,
+ WMODE_B,
+ WEN_A,
+ WEN_B,
+ REN_A,
+ REN_B,
+ CLK_A,
+ CLK_B,
+ BE_A,
+ BE_B,
+ ADDR_A,
+ ADDR_B,
+ WDATA_A,
+ WDATA_B,
+ RDATA_A,
+ RDATA_B,
+ EMPTY,
+ EPO,
+ EWM,
+ UNDERRUN,
+ FULL,
+ FMO,
+ FWM,
+ OVERRUN,
+ FLUSH,
+ FMODE,
+ SYNC_FIFO,
+ POWERDN,
+ SLEEP,
+ PROTECT,
+ UPAF,
+ UPAE,
+ PL_INIT,
+ PL_ENA,
+ PL_WEN,
+ PL_REN,
+ PL_CLK,
+ PL_ADDR,
+ PL_DATA_IN,
+ PL_DATA_OUT,
+ RAM_ID
+);
+ input wire [2:0] RMODE_A;
+ input wire [2:0] RMODE_B;
+ input wire [2:0] WMODE_A;
+ input wire [2:0] WMODE_B;
+ input wire WEN_A;
+ input wire WEN_B;
+ input wire REN_A;
+ input wire REN_B;
+ (* clkbuf_sink *)
+ input wire CLK_A;
+ (* clkbuf_sink *)
+ input wire CLK_B;
+ input wire [1:0] BE_A;
+ input wire [1:0] BE_B;
+ input wire [13:0] ADDR_A;
+ input wire [13:0] ADDR_B;
+ input wire [17:0] WDATA_A;
+ input wire [17:0] WDATA_B;
+ output reg [17:0] RDATA_A;
+ output reg [17:0] RDATA_B;
+ output wire EMPTY;
+ output wire EPO;
+ output wire EWM;
+ output wire UNDERRUN;
+ output wire FULL;
+ output wire FMO;
+ output wire FWM;
+ output wire OVERRUN;
+ input wire FLUSH;
+ input wire FMODE;
+ input wire SYNC_FIFO;
+ input wire POWERDN;
+ input wire SLEEP;
+ input wire PROTECT;
+ input wire [10:0] UPAF;
+ input wire [10:0] UPAE;
+ input PL_INIT;
+ input PL_ENA;
+ input PL_WEN;
+ input PL_REN;
+ input PL_CLK;
+ input [31:0] PL_ADDR;
+ input [17:0] PL_DATA_IN;
+ output reg [17:0] PL_DATA_OUT;
+ input [15:0] RAM_ID;
+ reg [17:0] wmsk_a;
+ reg [17:0] wmsk_b;
+ wire [8:0] addr_a;
+ wire [8:0] addr_b;
+ reg [4:0] addr_a_d;
+ reg [4:0] addr_b_d;
+ wire [17:0] ram_rdata_a;
+ wire [17:0] ram_rdata_b;
+ reg [17:0] aligned_wdata_a;
+ reg [17:0] aligned_wdata_b;
+ wire ren_o;
+ wire [10:0] ff_raddr;
+ wire [10:0] ff_waddr;
+ wire [13:0] ram_addr_a;
+ wire [13:0] ram_addr_b;
+ wire [3:0] ram_waddr_a;
+ wire [3:0] ram_waddr_b;
+ wire preload;
+ wire my_id;
+ wire initn;
+ wire smux_rclk;
+ wire smux_wclk;
+ wire real_fmode;
+ wire [3:0] raw_fflags;
+ reg [1:0] fifo_rmode;
+ reg [1:0] fifo_wmode;
+ wire smux_clk_a;
+ wire smux_clk_b;
+ wire ram_ren_a;
+ wire ram_ren_b;
+ wire ram_wen_a;
+ wire ram_wen_b;
+ wire cen_a;
+ wire cen_b;
+ localparam MODE_9 = 3'b101;
+ always @(*) begin
+ fifo_rmode = (RMODE_B == MODE_9 ? 2'b10 : 2'b01);
+ fifo_wmode = (WMODE_A == MODE_9 ? 2'b10 : 2'b01);
+ end
+ assign my_id = (PL_ADDR[31:16] == RAM_ID) | PL_INIT;
+ assign preload = (PROTECT ? 1'b0 : my_id & PL_ENA);
+ assign smux_clk_a = (preload ? PL_CLK : CLK_A);
+ assign smux_clk_b = (preload ? 0 : (FMODE ? (SYNC_FIFO ? CLK_A : CLK_B) : CLK_B));
+ assign real_fmode = (preload ? 1'b0 : FMODE);
+ assign ram_ren_b = (preload ? PL_REN : (real_fmode ? ren_o : REN_B));
+ assign ram_wen_a = (preload ? PL_WEN : (FMODE ? ~FULL & WEN_A : WEN_A));
+ assign ram_ren_a = (preload ? 1'b1 : (FMODE ? 0 : REN_A));
+ assign ram_wen_b = (preload ? 1'b1 : (FMODE ? 1'b0 : WEN_B));
+ assign cen_b = ram_ren_b | ram_wen_b;
+ assign cen_a = ram_ren_a | ram_wen_a;
+ assign ram_waddr_b = (preload ? 4'b0000 : (real_fmode ? {ff_raddr[0], 3'b000} : ADDR_B[3:0]));
+ assign ram_waddr_a = (preload ? 4'b0000 : (real_fmode ? {ff_waddr[0], 3'b000} : ADDR_A[3:0]));
+ assign ram_addr_b = (preload ? {PL_ADDR[10:0], 3'h0} : (real_fmode ? {ff_raddr[10:0], 3'h0} : {ADDR_B[13:4], addr_b_d[3:0]}));
+ assign ram_addr_a = (preload ? {PL_ADDR[10:0], 3'h0} : (real_fmode ? {ff_waddr[10:0], 3'b000} : {ADDR_A[13:4], addr_a_d[3:0]}));
+ always @(posedge CLK_A) addr_a_d[3:0] <= ADDR_A[3:0];
+ always @(posedge CLK_B) addr_b_d[3:0] <= ADDR_B[3:0];
+ sram1024x18 uram(
+ .clk_a(smux_clk_a),
+ .cen_a(~cen_a),
+ .wen_a(~ram_wen_a),
+ .addr_a(ram_addr_a[13:4]),
+ .wmsk_a(wmsk_a),
+ .wdata_a(aligned_wdata_a),
+ .rdata_a(ram_rdata_a),
+ .clk_b(smux_clk_b),
+ .cen_b(~cen_b),
+ .wen_b(~ram_wen_b),
+ .addr_b(ram_addr_b[13:4]),
+ .wmsk_b(wmsk_b),
+ .wdata_b(aligned_wdata_b),
+ .rdata_b(ram_rdata_b)
+ );
+ fifo_ctl #(
+ .ADDR_WIDTH(11),
+ .FIFO_WIDTH(2)
+ ) fifo_ctl(
+ .rclk(smux_clk_b),
+ .rst_R_n(~FLUSH),
+ .wclk(smux_clk_a),
+ .rst_W_n(~FLUSH),
+ .ren(REN_B),
+ .wen(ram_wen_a),
+ .depth(3'b000),
+ .sync(SYNC_FIFO),
+ .rmode(fifo_rmode),
+ .wmode(fifo_wmode),
+ .ren_o(ren_o),
+ .fflags({FULL, FMO, FWM, OVERRUN, EMPTY, EPO, EWM, UNDERRUN}),
+ .raddr(ff_raddr),
+ .waddr(ff_waddr),
+ .upaf(UPAF),
+ .upae(UPAE)
+ );
+ always @(*) begin : PRELOAD_DATA
+ if (preload & ram_ren_a)
+ PL_DATA_OUT = ram_rdata_a;
+ else
+ PL_DATA_OUT = PL_DATA_IN;
+ end
+ localparam MODE_1 = 3'b001;
+ localparam MODE_18 = 3'b110;
+ localparam MODE_2 = 3'b010;
+ localparam MODE_4 = 3'b100;
+ always @(*) begin : WDATA_MODE_SEL
+ if (ram_wen_a == 1) begin
+ if (preload) begin
+ aligned_wdata_a = PL_DATA_IN;
+ wmsk_a = 18'h00000;
+ end
+ else
+ case (WMODE_A)
+ MODE_18: begin
+ aligned_wdata_a = WDATA_A;
+ {wmsk_a[17], wmsk_a[15:8]} = (FMODE ? 9'h000 : (BE_A[1] ? 9'h000 : 9'h1ff));
+ {wmsk_a[16], wmsk_a[7:0]} = (FMODE ? 9'h000 : (BE_A[0] ? 9'h000 : 9'h1ff));
+ end
+ MODE_9: begin
+ aligned_wdata_a = {{2 {WDATA_A[8]}}, {2 {WDATA_A[7:0]}}};
+ {wmsk_a[17], wmsk_a[15:8]} = (ram_waddr_a[3] ? 9'h000 : 9'h1ff);
+ {wmsk_a[16], wmsk_a[7:0]} = (ram_waddr_a[3] ? 9'h1ff : 9'h000);
+ end
+ MODE_4: begin
+ aligned_wdata_a = {2'b00, {4 {WDATA_A[3:0]}}};
+ wmsk_a[17:16] = 2'b11;
+ wmsk_a[15:12] = (ram_waddr_a[3:2] == 2'b11 ? 4'h0 : 4'hf);
+ wmsk_a[11:8] = (ram_waddr_a[3:2] == 2'b10 ? 4'h0 : 4'hf);
+ wmsk_a[7:4] = (ram_waddr_a[3:2] == 2'b01 ? 4'h0 : 4'hf);
+ wmsk_a[3:0] = (ram_waddr_a[3:2] == 2'b00 ? 4'h0 : 4'hf);
+ end
+ MODE_2: begin
+ aligned_wdata_a = {2'b00, {8 {WDATA_A[1:0]}}};
+ wmsk_a[17:16] = 2'b11;
+ wmsk_a[15:14] = (ram_waddr_a[3:1] == 3'b111 ? 2'h0 : 2'h3);
+ wmsk_a[13:12] = (ram_waddr_a[3:1] == 3'b110 ? 2'h0 : 2'h3);
+ wmsk_a[11:10] = (ram_waddr_a[3:1] == 3'b101 ? 2'h0 : 2'h3);
+ wmsk_a[9:8] = (ram_waddr_a[3:1] == 3'b100 ? 2'h0 : 2'h3);
+ wmsk_a[7:6] = (ram_waddr_a[3:1] == 3'b011 ? 2'h0 : 2'h3);
+ wmsk_a[5:4] = (ram_waddr_a[3:1] == 3'b010 ? 2'h0 : 2'h3);
+ wmsk_a[3:2] = (ram_waddr_a[3:1] == 3'b001 ? 2'h0 : 2'h3);
+ wmsk_a[1:0] = (ram_waddr_a[3:1] == 3'b000 ? 2'h0 : 2'h3);
+ end
+ MODE_1: begin
+ aligned_wdata_a = {2'b00, {16 {WDATA_A[0]}}};
+ wmsk_a = 18'h3ffff;
+ wmsk_a[{1'b0, ram_waddr_a[3:0]}] = 0;
+ end
+ default: wmsk_a = 18'h3ffff;
+ endcase
+ end
+ else begin
+ aligned_wdata_a = 18'h00000;
+ wmsk_a = 18'h3ffff;
+ end
+ if (ram_wen_b == 1)
+ case (WMODE_B)
+ MODE_18: begin
+ aligned_wdata_b = WDATA_B;
+ {wmsk_b[17], wmsk_b[15:8]} = (BE_B[1] ? 9'h000 : 9'h1ff);
+ {wmsk_b[16], wmsk_b[7:0]} = (BE_B[0] ? 9'h000 : 9'h1ff);
+ end
+ MODE_9: begin
+ aligned_wdata_b = {{2 {WDATA_B[8]}}, {2 {WDATA_B[7:0]}}};
+ {wmsk_b[17], wmsk_b[15:8]} = (ram_waddr_b[3] ? 9'h000 : 9'h1ff);
+ {wmsk_b[16], wmsk_b[7:0]} = (ram_waddr_b[3] ? 9'h1ff : 9'h000);
+ end
+ MODE_4: begin
+ aligned_wdata_b = {2'b00, {4 {WDATA_B[3:0]}}};
+ wmsk_b[17:16] = 2'b11;
+ wmsk_b[15:12] = (ram_waddr_b[3:2] == 2'b11 ? 4'h0 : 4'hf);
+ wmsk_b[11:8] = (ram_waddr_b[3:2] == 2'b10 ? 4'h0 : 4'hf);
+ wmsk_b[7:4] = (ram_waddr_b[3:2] == 2'b01 ? 4'h0 : 4'hf);
+ wmsk_b[3:0] = (ram_waddr_b[3:2] == 2'b00 ? 4'h0 : 4'hf);
+ end
+ MODE_2: begin
+ aligned_wdata_b = {2'b00, {8 {WDATA_B[1:0]}}};
+ wmsk_b[17:16] = 2'b11;
+ wmsk_b[15:14] = (ram_waddr_b[3:1] == 3'b111 ? 2'h0 : 2'h3);
+ wmsk_b[13:12] = (ram_waddr_b[3:1] == 3'b110 ? 2'h0 : 2'h3);
+ wmsk_b[11:10] = (ram_waddr_b[3:1] == 3'b101 ? 2'h0 : 2'h3);
+ wmsk_b[9:8] = (ram_waddr_b[3:1] == 3'b100 ? 2'h0 : 2'h3);
+ wmsk_b[7:6] = (ram_waddr_b[3:1] == 3'b011 ? 2'h0 : 2'h3);
+ wmsk_b[5:4] = (ram_waddr_b[3:1] == 3'b010 ? 2'h0 : 2'h3);
+ wmsk_b[3:2] = (ram_waddr_b[3:1] == 3'b001 ? 2'h0 : 2'h3);
+ wmsk_b[1:0] = (ram_waddr_b[3:1] == 3'b000 ? 2'h0 : 2'h3);
+ end
+ MODE_1: begin
+ aligned_wdata_b = {2'b00, {16 {WDATA_B[0]}}};
+ wmsk_b = 18'h3ffff;
+ wmsk_b[{1'b0, ram_waddr_b[3:0]}] = 0;
+ end
+ default: wmsk_b = 18'h3ffff;
+ endcase
+ else begin
+ aligned_wdata_b = 18'b000000000000000000;
+ wmsk_b = 18'h3ffff;
+ end
+ end
+ always @(*) begin : RDATA_A_MODE_SEL
+ case (RMODE_A)
+ default: RDATA_A = 18'h00000;
+ MODE_18: RDATA_A = ram_rdata_a;
+ MODE_9: begin
+ RDATA_A[17:9] = 9'h000;
+ RDATA_A[8:0] = (ram_addr_a[3] ? {ram_rdata_a[17], ram_rdata_a[15:8]} : {ram_rdata_a[16], ram_rdata_a[7:0]});
+ end
+ MODE_4: begin
+ RDATA_A[17:4] = 14'h0000;
+ case (ram_addr_a[3:2])
+ 3: RDATA_A[3:0] = ram_rdata_a[15:12];
+ 2: RDATA_A[3:0] = ram_rdata_a[11:8];
+ 1: RDATA_A[3:0] = ram_rdata_a[7:4];
+ 0: RDATA_A[3:0] = ram_rdata_a[3:0];
+ endcase
+ end
+ MODE_2: begin
+ RDATA_A[17:2] = 16'h0000;
+ case (ram_addr_a[3:1])
+ 7: RDATA_A[1:0] = ram_rdata_a[15:14];
+ 6: RDATA_A[1:0] = ram_rdata_a[13:12];
+ 5: RDATA_A[1:0] = ram_rdata_a[11:10];
+ 4: RDATA_A[1:0] = ram_rdata_a[9:8];
+ 3: RDATA_A[1:0] = ram_rdata_a[7:6];
+ 2: RDATA_A[1:0] = ram_rdata_a[5:4];
+ 1: RDATA_A[1:0] = ram_rdata_a[3:2];
+ 0: RDATA_A[1:0] = ram_rdata_a[1:0];
+ endcase
+ end
+ MODE_1: begin
+ RDATA_A[17:1] = 17'h00000;
+ RDATA_A[0] = ram_rdata_a[ram_addr_a[3:0]];
+ end
+ endcase
+ end
+ always @(*)
+ case (RMODE_B)
+ default: RDATA_B = 18'h15566;
+ MODE_18: RDATA_B = ram_rdata_b;
+ MODE_9: begin
+ RDATA_B[17:9] = 1'sb1;
+ RDATA_B[8:0] = (ram_addr_b[3] ? {ram_rdata_b[17], ram_rdata_b[15:8]} : {ram_rdata_b[16], ram_rdata_b[7:0]});
+ end
+ MODE_4:
+ case (ram_addr_b[3:2])
+ 3: RDATA_B[3:0] = ram_rdata_b[15:12];
+ 2: RDATA_B[3:0] = ram_rdata_b[11:8];
+ 1: RDATA_B[3:0] = ram_rdata_b[7:4];
+ 0: RDATA_B[3:0] = ram_rdata_b[3:0];
+ endcase
+ MODE_2:
+ case (ram_addr_b[3:1])
+ 7: RDATA_B[1:0] = ram_rdata_b[15:14];
+ 6: RDATA_B[1:0] = ram_rdata_b[13:12];
+ 5: RDATA_B[1:0] = ram_rdata_b[11:10];
+ 4: RDATA_B[1:0] = ram_rdata_b[9:8];
+ 3: RDATA_B[1:0] = ram_rdata_b[7:6];
+ 2: RDATA_B[1:0] = ram_rdata_b[5:4];
+ 1: RDATA_B[1:0] = ram_rdata_b[3:2];
+ 0: RDATA_B[1:0] = ram_rdata_b[1:0];
+ endcase
+ MODE_1: RDATA_B[0] = ram_rdata_b[ram_addr_b[3:0]];
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
index fc5beb4..95f3e78 100644
--- a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
+++ b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
@@ -488,180 +488,770 @@
endmodule
module TDP_BRAM36 (
- (* clkbuf_sink *)
- input CLOCKA,
- (* clkbuf_sink *)
- input CLOCKB,
- input READENABLEA,
- input READENABLEB,
- input [14:0] ADDRA,
- input [14:0] ADDRB,
- input [31:0] WRITEDATAA,
- input [31:0] WRITEDATAB,
- input [3:0] WRITEDATAAP,
- input [3:0] WRITEDATABP,
- input WRITEENABLEA,
- input WRITEENABLEB,
- input [3:0] BYTEENABLEA,
- input [3:0] BYTEENABLEB,
- //input [2:0] WRITEDATAWIDTHA,
- //input [2:0] WRITEDATAWIDTHB,
- //input [2:0] READDATAWIDTHA,
- //input [2:0] READDATAWIDTHB,
- output [31:0] READDATAA,
- output [31:0] READDATAB,
- output [3:0] READDATAAP,
- output [3:0] READDATABP
+ WEN_A1_i,
+ WEN_B1_i,
+ REN_A1_i,
+ REN_B1_i,
+ CLK_A1_i,
+ CLK_B1_i,
+ BE_A1_i,
+ BE_B1_i,
+ ADDR_A1_i,
+ ADDR_B1_i,
+ WDATA_A1_i,
+ WDATA_B1_i,
+ RDATA_A1_o,
+ RDATA_B1_o,
+ FLUSH1_i,
+ SYNC_FIFO1_i,
+ RMODE_A1_i,
+ RMODE_B1_i,
+ WMODE_A1_i,
+ WMODE_B1_i,
+ FMODE1_i,
+ POWERDN1_i,
+ SLEEP1_i,
+ PROTECT1_i,
+ UPAE1_i,
+ UPAF1_i,
+ WEN_A2_i,
+ WEN_B2_i,
+ REN_A2_i,
+ REN_B2_i,
+ CLK_A2_i,
+ CLK_B2_i,
+ BE_A2_i,
+ BE_B2_i,
+ ADDR_A2_i,
+ ADDR_B2_i,
+ WDATA_A2_i,
+ WDATA_B2_i,
+ RDATA_A2_o,
+ RDATA_B2_o,
+ FLUSH2_i,
+ SYNC_FIFO2_i,
+ RMODE_A2_i,
+ RMODE_B2_i,
+ WMODE_A2_i,
+ WMODE_B2_i,
+ FMODE2_i,
+ POWERDN2_i,
+ SLEEP2_i,
+ PROTECT2_i,
+ UPAE2_i,
+ UPAF2_i,
+ SPLIT_i,
+ RAM_ID_i,
+ PL_INIT_i,
+ PL_ENA_i,
+ PL_REN_i,
+ PL_CLK_i,
+ PL_WEN_i,
+ PL_ADDR_i,
+ PL_DATA_i,
+ PL_INIT_o,
+ PL_ENA_o,
+ PL_REN_o,
+ PL_CLK_o,
+ PL_WEN_o,
+ PL_ADDR_o,
+ PL_DATA_o
);
- parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INITP_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_40 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_41 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_42 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_43 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_44 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_45 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_46 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_47 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_48 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_49 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_4A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_4B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_4C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_4D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_4E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_4F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_50 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_51 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_52 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_53 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_54 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_55 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_56 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_57 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_58 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_59 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_5A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_5B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_5C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_5D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_5E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_5F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_60 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_61 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_62 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_63 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_64 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_65 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_66 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_67 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_68 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_69 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_6A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_6B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_6C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_6D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_6E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_6F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_70 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_71 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_72 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_73 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_74 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_75 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_76 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_77 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_78 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_79 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_7A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_7B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_7C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_7D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_7E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter INIT_7F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
- parameter integer READ_WIDTH_A = 0;
- parameter integer READ_WIDTH_B = 0;
- parameter integer WRITE_WIDTH_A = 0;
- parameter integer WRITE_WIDTH_B = 0;
+ parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INITP_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_40 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_41 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_42 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_43 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_44 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_45 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_46 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_47 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_48 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_49 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_4A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_4B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_4C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_4D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_4E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_4F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_50 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_51 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_52 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_53 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_54 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_55 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_56 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_57 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_58 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_59 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_5A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_5B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_5C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_5D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_5E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_5F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_60 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_61 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_62 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_63 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_64 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_65 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_66 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_67 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_68 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_69 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_6A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_6B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_6C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_6D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_6E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_6F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_70 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_71 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_72 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_73 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_74 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_75 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_76 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_77 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_78 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_79 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_7A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_7B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_7C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_7D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_7E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_7F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ input wire WEN_A1_i;
+ input wire WEN_B1_i;
+ input wire REN_A1_i;
+ input wire REN_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ input wire [1:0] BE_A1_i;
+ input wire [1:0] BE_B1_i;
+ input wire [14:0] ADDR_A1_i;
+ input wire [14:0] ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i;
+ input wire [17:0] WDATA_B1_i;
+ output reg [17:0] RDATA_A1_o;
+ output reg [17:0] RDATA_B1_o;
+ input wire FLUSH1_i;
+ input wire SYNC_FIFO1_i;
+ input wire [2:0] RMODE_A1_i;
+ input wire [2:0] RMODE_B1_i;
+ input wire [2:0] WMODE_A1_i;
+ input wire [2:0] WMODE_B1_i;
+ input wire FMODE1_i;
+ input wire POWERDN1_i;
+ input wire SLEEP1_i;
+ input wire PROTECT1_i;
+ input wire [11:0] UPAE1_i;
+ input wire [11:0] UPAF1_i;
+ input wire WEN_A2_i;
+ input wire WEN_B2_i;
+ input wire REN_A2_i;
+ input wire REN_B2_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+ input wire [1:0] BE_A2_i;
+ input wire [1:0] BE_B2_i;
+ input wire [13:0] ADDR_A2_i;
+ input wire [13:0] ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i;
+ input wire [17:0] WDATA_B2_i;
+ output reg [17:0] RDATA_A2_o;
+ output reg [17:0] RDATA_B2_o;
+ input wire FLUSH2_i;
+ input wire SYNC_FIFO2_i;
+ input wire [2:0] RMODE_A2_i;
+ input wire [2:0] RMODE_B2_i;
+ input wire [2:0] WMODE_A2_i;
+ input wire [2:0] WMODE_B2_i;
+ input wire FMODE2_i;
+ input wire POWERDN2_i;
+ input wire SLEEP2_i;
+ input wire PROTECT2_i;
+ input wire [10:0] UPAE2_i;
+ input wire [10:0] UPAF2_i;
+ input SPLIT_i;
+ input [15:0] RAM_ID_i;
+ input wire PL_INIT_i;
+ input wire PL_ENA_i;
+ input wire PL_REN_i;
+ input wire PL_CLK_i;
+ input wire [1:0] PL_WEN_i;
+ input wire [31:0] PL_ADDR_i;
+ input wire [35:0] PL_DATA_i;
+ output reg PL_INIT_o;
+ output reg PL_ENA_o;
+ output reg PL_REN_o;
+ output reg PL_CLK_o;
+ output reg [1:0] PL_WEN_o;
+ output reg [31:0] PL_ADDR_o;
+ output reg [35:0] PL_DATA_o;
+ wire EMPTY2;
+ wire EPO2;
+ wire EWM2;
+ wire FULL2;
+ wire FMO2;
+ wire FWM2;
+ wire EMPTY1;
+ wire EPO1;
+ wire EWM1;
+ wire FULL1;
+ wire FMO1;
+ wire FWM1;
+ wire UNDERRUN1;
+ wire OVERRUN1;
+ wire UNDERRUN2;
+ wire OVERRUN2;
+ wire UNDERRUN3;
+ wire OVERRUN3;
+ wire EMPTY3;
+ wire EPO3;
+ wire EWM3;
+ wire FULL3;
+ wire FMO3;
+ wire FWM3;
+ wire ram_fmode1;
+ wire ram_fmode2;
+ wire [17:0] ram_rdata_a1;
+ wire [17:0] ram_rdata_b1;
+ wire [17:0] ram_rdata_a2;
+ wire [17:0] ram_rdata_b2;
+ reg [17:0] ram_wdata_a1;
+ reg [17:0] ram_wdata_b1;
+ reg [17:0] ram_wdata_a2;
+ reg [17:0] ram_wdata_b2;
+ reg [14:0] laddr_a1;
+ reg [14:0] laddr_b1;
+ wire [13:0] ram_addr_a1;
+ wire [13:0] ram_addr_b1;
+ wire [13:0] ram_addr_a2;
+ wire [13:0] ram_addr_b2;
+ wire smux_clk_a1;
+ wire smux_clk_b1;
+ wire smux_clk_a2;
+ wire smux_clk_b2;
+ reg [1:0] ram_be_a1;
+ reg [1:0] ram_be_a2;
+ reg [1:0] ram_be_b1;
+ reg [1:0] ram_be_b2;
+ reg [2:0] ram_rmode_a1;
+ reg [2:0] ram_wmode_a1;
+ reg [2:0] ram_rmode_b1;
+ reg [2:0] ram_wmode_b1;
+ reg [2:0] ram_rmode_a2;
+ reg [2:0] ram_wmode_a2;
+ reg [2:0] ram_rmode_b2;
+ reg [2:0] ram_wmode_b2;
+ wire ram_ren_a1;
+ wire ram_ren_b1;
+ wire ram_ren_a2;
+ wire ram_ren_b2;
+ wire ram_wen_a1;
+ wire ram_wen_b1;
+ wire ram_wen_a2;
+ wire ram_wen_b2;
+ wire ren_o;
+ wire [11:0] ff_raddr;
+ wire [11:0] ff_waddr;
+ reg [35:0] fifo_rdata;
+ reg [1:0] fifo_rmode;
+ reg [1:0] fifo_wmode;
+ wire [1:0] bwl;
+ wire [17:0] pl_dout0;
+ wire [17:0] pl_dout1;
+ assign ram_fmode1 = FMODE1_i & SPLIT_i;
+ assign ram_fmode2 = FMODE2_i & SPLIT_i;
+ assign smux_clk_a1 = CLK_A1_i;
+ assign smux_clk_b1 = (FMODE1_i ? (SYNC_FIFO1_i ? CLK_A1_i : CLK_B1_i) : CLK_B1_i);
+ assign smux_clk_a2 = (SPLIT_i ? CLK_A2_i : CLK_A1_i);
+ assign smux_clk_b2 = (SPLIT_i ? CLK_B2_i : (FMODE1_i ? (SYNC_FIFO1_i ? CLK_A1_i : CLK_B1_i) : CLK_B1_i));
+ assign ram_ren_a1 = (SPLIT_i ? REN_A1_i : (FMODE1_i ? 0 : REN_A1_i));
+ assign ram_ren_a2 = (SPLIT_i ? REN_A2_i : (FMODE1_i ? 0 : REN_A1_i));
+ assign ram_ren_b1 = (SPLIT_i ? REN_B1_i : (FMODE1_i ? ren_o : REN_B1_i));
+ assign ram_ren_b2 = (SPLIT_i ? REN_B2_i : (FMODE1_i ? ren_o : REN_B1_i));
+ localparam MODE_36 = 3'b111;
+ assign ram_wen_a1 = (SPLIT_i ? WEN_A1_i : (FMODE1_i ? ~FULL3 & WEN_A1_i : (WMODE_A1_i == MODE_36 ? WEN_A1_i : WEN_A1_i & ~ADDR_A1_i[4])));
+ assign ram_wen_a2 = (SPLIT_i ? WEN_A2_i : (FMODE1_i ? ~FULL3 & WEN_A1_i : (WMODE_A1_i == MODE_36 ? WEN_A1_i : WEN_A1_i & ADDR_A1_i[4])));
+ assign ram_wen_b1 = (SPLIT_i ? WEN_B1_i : (WMODE_B1_i == MODE_36 ? WEN_B1_i : WEN_B1_i & ~ADDR_B1_i[4]));
+ assign ram_wen_b2 = (SPLIT_i ? WEN_B2_i : (WMODE_B1_i == MODE_36 ? WEN_B1_i : WEN_B1_i & ADDR_B1_i[4]));
+ assign ram_addr_a1 = (SPLIT_i ? ADDR_A1_i[13:0] : (FMODE1_i ? {ff_waddr[11:2], ff_waddr[0], 3'b000} : {ADDR_A1_i[14:5], ADDR_A1_i[3:0]}));
+ assign ram_addr_b1 = (SPLIT_i ? ADDR_B1_i[13:0] : (FMODE1_i ? {ff_raddr[11:2], ff_raddr[0], 3'b000} : {ADDR_B1_i[14:5], ADDR_B1_i[3:0]}));
+ assign ram_addr_a2 = (SPLIT_i ? ADDR_A2_i[13:0] : (FMODE1_i ? {ff_waddr[11:2], ff_waddr[0], 3'b000} : {ADDR_A1_i[14:5], ADDR_A1_i[3:0]}));
+ assign ram_addr_b2 = (SPLIT_i ? ADDR_B2_i[13:0] : (FMODE1_i ? {ff_raddr[11:2], ff_raddr[0], 3'b000} : {ADDR_B1_i[14:5], ADDR_B1_i[3:0]}));
+ assign bwl = (SPLIT_i ? ADDR_A1_i[4:3] : (FMODE1_i ? ff_waddr[1:0] : ADDR_A1_i[4:3]));
+ localparam MODE_18 = 3'b110;
+ localparam MODE_9 = 3'b101;
+ always @(*) begin : WDATA_SEL
+ case (SPLIT_i)
+ 1: begin
+ ram_wdata_a1 = WDATA_A1_i;
+ ram_wdata_a2 = WDATA_A2_i;
+ ram_wdata_b1 = WDATA_B1_i;
+ ram_wdata_b2 = WDATA_B2_i;
+ ram_be_a2 = BE_A2_i;
+ ram_be_b2 = BE_B2_i;
+ ram_be_a1 = BE_A1_i;
+ ram_be_b1 = BE_B1_i;
+ end
+ 0: begin
+ case (WMODE_A1_i)
+ MODE_36: begin
+ ram_wdata_a1 = {WDATA_A2_i[15:14], WDATA_A1_i[15:0]};
+ ram_wdata_a2 = {WDATA_A2_i[17:16], WDATA_A2_i[13:0], WDATA_A1_i[17:16]};
+ ram_be_a2 = (FMODE1_i ? 2'b11 : BE_A2_i);
+ ram_be_a1 = (FMODE1_i ? 2'b11 : BE_A1_i);
+ end
+ MODE_18: begin
+ ram_wdata_a1 = WDATA_A1_i;
+ ram_wdata_a2 = WDATA_A1_i;
+ ram_be_a1 = (FMODE1_i ? (ff_waddr[1] ? 2'b00 : 2'b11) : BE_A1_i);
+ ram_be_a2 = (FMODE1_i ? (ff_waddr[1] ? 2'b11 : 2'b00) : BE_A1_i);
+ end
+ MODE_9:
+ case (bwl)
+ 0: begin
+ ram_wdata_a1[8:0] = (FMODE1_i ? {WDATA_A1_i[0], WDATA_A1_i[7:0]} : WDATA_A1_i[8:0]);
+ ram_wdata_a1[17:9] = (FMODE1_i ? {{2 {WDATA_A1_i[8]}}, WDATA_A1_i[7:1]} : 9'b000000000);
+ ram_wdata_a2[8:0] = (FMODE1_i ? {WDATA_A1_i[0], WDATA_A1_i[7:0]} : 9'b000000000);
+ ram_wdata_a2[17:9] = (FMODE1_i ? {{2 {WDATA_A1_i[8]}}, WDATA_A1_i[7:1]} : 9'b000000000);
+ ram_be_a1[0] = (FMODE1_i ? (ff_waddr[1:0] == 0 ? 1'b1 : 1'b0) : 1'b1);
+ ram_be_a1[1] = (FMODE1_i ? (ff_waddr[1:0] == 1 ? 1'b1 : 1'b0) : 1'b0);
+ ram_be_a2[0] = (FMODE1_i ? (ff_waddr[1:0] == 2 ? 1'b1 : 1'b0) : 1'b0);
+ ram_be_a2[1] = (FMODE1_i ? (ff_waddr[1:0] == 3 ? 1'b1 : 1'b0) : 1'b0);
+ end
+ 1: begin
+ ram_wdata_a1[8:0] = (FMODE1_i ? {WDATA_A1_i[0], WDATA_A1_i[7:0]} : WDATA_A1_i[8:0]);
+ ram_wdata_a1[17:9] = (FMODE1_i ? {{2 {WDATA_A1_i[8]}}, WDATA_A1_i[7:1]} : 9'b000000000);
+ ram_wdata_a2[8:0] = (FMODE1_i ? {WDATA_A1_i[0], WDATA_A1_i[7:0]} : 9'b000000000);
+ ram_wdata_a2[17:9] = (FMODE1_i ? {{2 {WDATA_A1_i[8]}}, WDATA_A1_i[7:1]} : 9'b000000000);
+ {ram_be_a2, ram_be_a1} = 4'b0010;
+ end
+ 2: begin
+ ram_wdata_a1[8:0] = (FMODE1_i ? {WDATA_A1_i[0], WDATA_A1_i[7:0]} : 9'b000000000);
+ ram_wdata_a1[17:9] = (FMODE1_i ? {{2 {WDATA_A1_i[8]}}, WDATA_A1_i[7:1]} : 9'b000000000);
+ ram_wdata_a2[8:0] = (FMODE1_i ? {WDATA_A1_i[0], WDATA_A1_i[7:0]} : WDATA_A1_i[8:0]);
+ ram_wdata_a2[17:9] = (FMODE1_i ? {{2 {WDATA_A1_i[8]}}, WDATA_A1_i[7:1]} : 9'b000000000);
+ {ram_be_a2, ram_be_a1} = 4'b0100;
+ end
+ 3: begin
+ ram_wdata_a1[8:0] = (FMODE1_i ? {WDATA_A1_i[0], WDATA_A1_i[7:0]} : 9'b000000000);
+ ram_wdata_a1[17:9] = (FMODE1_i ? {{2 {WDATA_A1_i[8]}}, WDATA_A1_i[7:1]} : 9'b000000000);
+ ram_wdata_a2[8:0] = (FMODE1_i ? {WDATA_A1_i[0], WDATA_A1_i[7:0]} : WDATA_A1_i[8:0]);
+ ram_wdata_a2[17:9] = (FMODE1_i ? {{2 {WDATA_A1_i[8]}}, WDATA_A1_i[7:1]} : 9'b000000000);
+ {ram_be_a2, ram_be_a1} = 4'b1000;
+ end
+ endcase
+ default: begin
+ ram_wdata_a1 = WDATA_A1_i;
+ ram_wdata_a2 = WDATA_A1_i;
+ ram_be_a2 = (FMODE1_i ? 2'b11 : BE_A1_i);
+ ram_be_a1 = (FMODE1_i ? 2'b11 : BE_A1_i);
+ end
+ endcase
+ case (WMODE_B1_i)
+ MODE_36: begin
+ ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : {WDATA_B2_i[15:14], WDATA_B1_i[15:0]});
+ ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : {WDATA_B2_i[17:16], WDATA_B2_i[13:0], WDATA_B1_i[17:16]});
+ ram_be_b2 = BE_B2_i;
+ ram_be_b1 = BE_B1_i;
+ end
+ MODE_18: begin
+ ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
+ ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
+ ram_be_b1 = BE_B1_i;
+ ram_be_b2 = BE_B1_i;
+ end
+ MODE_9:
+ case (ADDR_B1_i[4:3])
+ 0: begin
+ ram_wdata_b1[8:0] = WDATA_B1_i[8:0];
+ ram_wdata_b1[17:9] = 9'b000000000;
+ ram_wdata_b2[8:0] = 9'b000000000;
+ ram_wdata_b2[17:9] = 9'b000000000;
+ {ram_be_b2, ram_be_b1} = 4'b0001;
+ end
+ 1: begin
+ ram_wdata_b1[8:0] = WDATA_B1_i[8:0];
+ ram_wdata_b1[17:9] = 9'b000000000;
+ ram_wdata_b2[8:0] = 9'b000000000;
+ ram_wdata_b2[17:9] = 9'b000000000;
+ {ram_be_b2, ram_be_b1} = 4'b0010;
+ end
+ 2: begin
+ ram_wdata_b1[8:0] = 9'b000000000;
+ ram_wdata_b1[17:9] = 9'b000000000;
+ ram_wdata_b2[8:0] = WDATA_B1_i[8:0];
+ ram_wdata_b2[17:9] = 9'b000000000;
+ {ram_be_b2, ram_be_b1} = 4'b0100;
+ end
+ 3: begin
+ ram_wdata_b1[8:0] = 9'b000000000;
+ ram_wdata_b1[17:9] = 9'b000000000;
+ ram_wdata_b2[8:0] = WDATA_B1_i[8:0];
+ ram_wdata_b2[17:9] = 9'b000000000;
+ {ram_be_b2, ram_be_b1} = 4'b1000;
+ end
+ endcase
+ default: begin
+ ram_wdata_b1 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
+ ram_wdata_b2 = (FMODE1_i ? 18'b000000000000000000 : WDATA_B1_i);
+ ram_be_b2 = BE_B1_i;
+ ram_be_b1 = BE_B1_i;
+ end
+ endcase
+ end
+ endcase
+ end
+ always @(*)
+ case (SPLIT_i)
+ 0: begin
+ ram_rmode_a1 = (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i);
+ ram_rmode_a2 = (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i);
+ ram_wmode_a1 = (WMODE_A1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : WMODE_A1_i));
+ ram_wmode_a2 = (WMODE_A1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : WMODE_A1_i));
+ ram_rmode_b1 = (RMODE_B1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : RMODE_B1_i));
+ ram_rmode_b2 = (RMODE_B1_i == MODE_36 ? MODE_18 : (FMODE1_i ? MODE_18 : RMODE_B1_i));
+ ram_wmode_b1 = (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i);
+ ram_wmode_b2 = (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i);
+ end
+ 1: begin
+ ram_rmode_a1 = (RMODE_A1_i == MODE_36 ? MODE_18 : RMODE_A1_i);
+ ram_rmode_a2 = (RMODE_A2_i == MODE_36 ? MODE_18 : RMODE_A2_i);
+ ram_wmode_a1 = (WMODE_A1_i == MODE_36 ? MODE_18 : WMODE_A1_i);
+ ram_wmode_a2 = (WMODE_A2_i == MODE_36 ? MODE_18 : WMODE_A2_i);
+ ram_rmode_b1 = (RMODE_B1_i == MODE_36 ? MODE_18 : RMODE_B1_i);
+ ram_rmode_b2 = (RMODE_B2_i == MODE_36 ? MODE_18 : RMODE_B2_i);
+ ram_wmode_b1 = (WMODE_B1_i == MODE_36 ? MODE_18 : WMODE_B1_i);
+ ram_wmode_b2 = (WMODE_B2_i == MODE_36 ? MODE_18 : WMODE_B2_i);
+ end
+ endcase
+ always @(*) begin : FIFO_READ_SEL
+ case (RMODE_B1_i)
+ MODE_36: fifo_rdata = {ram_rdata_b2[17:16], ram_rdata_b1[17:16], ram_rdata_b2[15:0], ram_rdata_b1[15:0]};
+ MODE_18: fifo_rdata = (ff_raddr[1] ? {18'b000000000000000000, ram_rdata_b2} : {18'b000000000000000000, ram_rdata_b1});
+ MODE_9:
+ case (ff_raddr[1:0])
+ 0: fifo_rdata = {27'b000000000000000000000000000, ram_rdata_b1[16], ram_rdata_b1[7:0]};
+ 1: fifo_rdata = {27'b000000000000000000000000000, ram_rdata_b1[17], ram_rdata_b1[15:8]};
+ 2: fifo_rdata = {27'b000000000000000000000000000, ram_rdata_b2[16], ram_rdata_b2[7:0]};
+ 3: fifo_rdata = {27'b000000000000000000000000000, ram_rdata_b2[17], ram_rdata_b2[15:8]};
+ endcase
+ default: fifo_rdata = {ram_rdata_b2[17:16], ram_rdata_b1[17:16], ram_rdata_b2[15:0], ram_rdata_b1[15:0]};
+ endcase
+ end
+ localparam MODE_1 = 3'b001;
+ localparam MODE_2 = 3'b010;
+ localparam MODE_4 = 3'b100;
+ always @(*) begin : RDATA_SEL
+ case (SPLIT_i)
+ 1: begin
+ RDATA_A1_o = (FMODE1_i ? {10'b0000000000, EMPTY1, EPO1, EWM1, UNDERRUN1, FULL1, FMO1, FWM1, OVERRUN1} : ram_rdata_a1);
+ RDATA_B1_o = ram_rdata_b1;
+ RDATA_A2_o = (FMODE2_i ? {10'b0000000000, EMPTY2, EPO2, EWM2, UNDERRUN2, FULL2, FMO2, FWM2, OVERRUN2} : ram_rdata_a2);
+ RDATA_B2_o = ram_rdata_b2;
+ end
+ 0: begin
+ if (FMODE1_i) begin
+ RDATA_A1_o = {10'b0000000000, EMPTY3, EPO3, EWM3, UNDERRUN3, FULL3, FMO3, FWM3, OVERRUN3};
+ RDATA_A2_o = 18'b000000000000000000;
+ end
+ else
+ case (RMODE_A1_i)
+ MODE_36: begin
+ RDATA_A1_o = {ram_rdata_a2[1:0], ram_rdata_a1[15:0]};
+ RDATA_A2_o = {ram_rdata_a2[17:16], ram_rdata_a1[17:16], ram_rdata_a2[15:2]};
+ end
+ MODE_18: begin
+ RDATA_A1_o = (laddr_a1[4] ? ram_rdata_a2 : ram_rdata_a1);
+ RDATA_A2_o = 18'b000000000000000000;
+ end
+ MODE_9: begin
+ RDATA_A1_o = (laddr_a1[4] ? {9'b000000000, ram_rdata_a2[8:0]} : {9'b000000000, ram_rdata_a1[8:0]});
+ RDATA_A2_o = 18'b000000000000000000;
+ end
+ MODE_4: begin
+ RDATA_A2_o = 18'b000000000000000000;
+ RDATA_A1_o[17:4] = 14'b00000000000000;
+ RDATA_A1_o[3:0] = (laddr_a1[4] ? ram_rdata_a2[3:0] : ram_rdata_a1[3:0]);
+ end
+ MODE_2: begin
+ RDATA_A2_o = 18'b000000000000000000;
+ RDATA_A1_o[17:2] = 16'b0000000000000000;
+ RDATA_A1_o[1:0] = (laddr_a1[4] ? ram_rdata_a2[1:0] : ram_rdata_a1[1:0]);
+ end
+ MODE_1: begin
+ RDATA_A2_o = 18'b000000000000000000;
+ RDATA_A1_o[17:1] = 17'b00000000000000000;
+ RDATA_A1_o[0] = (laddr_a1[4] ? ram_rdata_a2[0] : ram_rdata_a1[0]);
+ end
+ default: begin
+ RDATA_A1_o = {ram_rdata_a2[1:0], ram_rdata_a1[15:0]};
+ RDATA_A2_o = {ram_rdata_a2[17:16], ram_rdata_a1[17:16], ram_rdata_a2[15:2]};
+ end
+ endcase
+ case (RMODE_B1_i)
+ MODE_36: begin
+ RDATA_B1_o = {ram_rdata_b2[1:0], ram_rdata_b1[15:0]};
+ RDATA_B2_o = {ram_rdata_b2[17:16], ram_rdata_b1[17:16], ram_rdata_b2[15:2]};
+ end
+ MODE_18: begin
+ RDATA_B1_o = (FMODE1_i ? fifo_rdata[17:0] : (laddr_b1[4] ? ram_rdata_b2 : ram_rdata_b1));
+ RDATA_B2_o = 18'b000000000000000000;
+ end
+ MODE_9: begin
+ RDATA_B1_o = (FMODE1_i ? {9'b000000000, fifo_rdata[8:0]} : (laddr_b1[4] ? {9'b000000000, ram_rdata_b2[8:0]} : {9'b000000000, ram_rdata_b1[8:0]}));
+ RDATA_B2_o = 18'b000000000000000000;
+ end
+ MODE_4: begin
+ RDATA_B2_o = 18'b000000000000000000;
+ RDATA_B1_o[17:4] = 14'b00000000000000;
+ RDATA_B1_o[3:0] = (laddr_b1[4] ? ram_rdata_b2[3:0] : ram_rdata_b1[3:0]);
+ end
+ MODE_2: begin
+ RDATA_B2_o = 18'b000000000000000000;
+ RDATA_B1_o[17:2] = 16'b0000000000000000;
+ RDATA_B1_o[1:0] = (laddr_b1[4] ? ram_rdata_b2[1:0] : ram_rdata_b1[1:0]);
+ end
+ MODE_1: begin
+ RDATA_B2_o = 18'b000000000000000000;
+ RDATA_B1_o[17:1] = 17'b00000000000000000;
+ RDATA_B1_o[0] = (laddr_b1[4] ? ram_rdata_b2[0] : ram_rdata_b1[0]);
+ end
+ default: begin
+ RDATA_B1_o = {ram_rdata_b2[1:0], ram_rdata_b1[15:0]};
+ RDATA_B2_o = {ram_rdata_b2[17:16], ram_rdata_b1[17:16], ram_rdata_b2[15:2]};
+ end
+ endcase
+ end
+ endcase
+ end
+ always @(posedge CLK_A1_i) laddr_a1 <= ADDR_A1_i;
+ always @(posedge CLK_B1_i) laddr_b1 <= ADDR_B1_i;
+ always @(*) begin
+ case (WMODE_A1_i)
+ default: fifo_wmode = 2'b00;
+ MODE_36: fifo_wmode = 2'b00;
+ MODE_18: fifo_wmode = 2'b01;
+ MODE_9: fifo_wmode = 2'b10;
+ endcase
+ case (RMODE_B1_i)
+ default: fifo_rmode = 2'b00;
+ MODE_36: fifo_rmode = 2'b00;
+ MODE_18: fifo_rmode = 2'b01;
+ MODE_9: fifo_rmode = 2'b10;
+ endcase
+ end
+ fifo_ctl #(
+ .ADDR_WIDTH(12),
+ .FIFO_WIDTH(3'd4)
+ ) fifo36_ctl(
+ .rclk(smux_clk_b1),
+ .rst_R_n(~FLUSH1_i),
+ .wclk(smux_clk_a1),
+ .rst_W_n(~FLUSH1_i),
+ .ren(REN_B1_i),
+ .wen(ram_wen_a1),
+ .sync(SYNC_FIFO1_i),
+ .depth(3'b111),
+ .rmode(fifo_rmode),
+ .wmode(fifo_wmode),
+ .ren_o(ren_o),
+ .fflags({FULL3, FMO3, FWM3, OVERRUN3, EMPTY3, EPO3, EWM3, UNDERRUN3}),
+ .raddr(ff_raddr),
+ .waddr(ff_waddr),
+ .upaf(UPAF1_i),
+ .upae(UPAE1_i)
+ );
+ TDP18K_FIFO u1(
+ .RMODE_A(ram_rmode_a1),
+ .RMODE_B(ram_rmode_b1),
+ .WMODE_A(ram_wmode_a1),
+ .WMODE_B(ram_wmode_b1),
+ .WEN_A(ram_wen_a1),
+ .WEN_B(ram_wen_b1),
+ .REN_A(ram_ren_a1),
+ .REN_B(ram_ren_b1),
+ .CLK_A(smux_clk_a1),
+ .CLK_B(smux_clk_b1),
+ .BE_A(ram_be_a1),
+ .BE_B(ram_be_b1),
+ .ADDR_A(ram_addr_a1),
+ .ADDR_B(ram_addr_b1),
+ .WDATA_A(ram_wdata_a1),
+ .WDATA_B(ram_wdata_b1),
+ .RDATA_A(ram_rdata_a1),
+ .RDATA_B(ram_rdata_b1),
+ .EMPTY(EMPTY1),
+ .EPO(EPO1),
+ .EWM(EWM1),
+ .UNDERRUN(UNDERRUN1),
+ .FULL(FULL1),
+ .FMO(FMO1),
+ .FWM(FWM1),
+ .OVERRUN(OVERRUN1),
+ .FLUSH(FLUSH1_i),
+ .FMODE(ram_fmode1),
+ .UPAF(UPAF1_i[10:0]),
+ .UPAE(UPAE1_i[10:0]),
+ .SYNC_FIFO(SYNC_FIFO1_i),
+ .POWERDN(POWERDN1_i),
+ .SLEEP(SLEEP1_i),
+ .PROTECT(PROTECT1_i),
+ .PL_INIT(PL_INIT_i),
+ .PL_ENA(PL_ENA_i),
+ .PL_WEN(PL_WEN_i[0]),
+ .PL_REN(PL_REN_i),
+ .PL_CLK(PL_CLK_i),
+ .PL_ADDR(PL_ADDR_i),
+ .PL_DATA_IN({PL_DATA_i[33:32], PL_DATA_i[15:0]}),
+ .PL_DATA_OUT(pl_dout0),
+ .RAM_ID({RAM_ID_i})
+ );
+ TDP18K_FIFO u2(
+ .RMODE_A(ram_rmode_a2),
+ .RMODE_B(ram_rmode_b2),
+ .WMODE_A(ram_wmode_a2),
+ .WMODE_B(ram_wmode_b2),
+ .WEN_A(ram_wen_a2),
+ .WEN_B(ram_wen_b2),
+ .REN_A(ram_ren_a2),
+ .REN_B(ram_ren_b2),
+ .CLK_A(smux_clk_a2),
+ .CLK_B(smux_clk_b2),
+ .BE_A(ram_be_a2),
+ .BE_B(ram_be_b2),
+ .ADDR_A(ram_addr_a2),
+ .ADDR_B(ram_addr_b2),
+ .WDATA_A(ram_wdata_a2),
+ .WDATA_B(ram_wdata_b2),
+ .RDATA_A(ram_rdata_a2),
+ .RDATA_B(ram_rdata_b2),
+ .EMPTY(EMPTY2),
+ .EPO(EPO2),
+ .EWM(EWM2),
+ .UNDERRUN(UNDERRUN2),
+ .FULL(FULL2),
+ .FMO(FMO2),
+ .FWM(FWM2),
+ .OVERRUN(OVERRUN2),
+ .FLUSH(FLUSH2_i),
+ .FMODE(ram_fmode2),
+ .UPAF(UPAF2_i),
+ .UPAE(UPAE2_i),
+ .SYNC_FIFO(SYNC_FIFO2_i),
+ .POWERDN(POWERDN2_i),
+ .SLEEP(SLEEP2_i),
+ .PROTECT(PROTECT2_i),
+ .PL_INIT(PL_INIT_i),
+ .PL_ENA(PL_ENA_i),
+ .PL_WEN(PL_WEN_i[1]),
+ .PL_REN(PL_REN_i),
+ .PL_CLK(PL_CLK_i),
+ .PL_ADDR(PL_ADDR_i),
+ .PL_DATA_IN({PL_DATA_i[35:34], PL_DATA_i[31:16]}),
+ .PL_DATA_OUT(pl_dout1),
+ .RAM_ID(RAM_ID_i)
+ );
+ always @(*) begin
+ if (RAM_ID_i == PL_ADDR_i[31:16])
+ PL_DATA_o = (PL_REN_i ? {pl_dout1[17:16], pl_dout0[17:16], pl_dout1[15:0], pl_dout0[15:0]} : PL_DATA_i);
+ else
+ PL_DATA_o = PL_DATA_i;
+ PL_ADDR_o = PL_ADDR_i;
+ PL_INIT_o = PL_INIT_i;
+ PL_ENA_o = PL_ENA_i;
+ PL_WEN_o = PL_WEN_i;
+ PL_REN_o = PL_REN_i;
+ PL_CLK_o = PL_CLK_i;
+ end
endmodule
(* blackbox *)
diff --git a/ql-qlf-plugin/qlf_k6n10f/sram1024x18.v b/ql-qlf-plugin/qlf_k6n10f/sram1024x18.v
new file mode 100644
index 0000000..c732a26
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/sram1024x18.v
@@ -0,0 +1,124 @@
+// Copyright (C) 2022 The SymbiFlow Authors.
+//
+// Use of this source code is governed by a ISC-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/ISC
+//
+// SPDX-License-Identifier:ISC
+
+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
diff --git a/ql-qlf-plugin/qlf_k6n10f/ufifo_ctl.v b/ql-qlf-plugin/qlf_k6n10f/ufifo_ctl.v
new file mode 100644
index 0000000..2fd87bb
--- /dev/null
+++ b/ql-qlf-plugin/qlf_k6n10f/ufifo_ctl.v
@@ -0,0 +1,626 @@
+// Copyright (C) 2022 The SymbiFlow Authors.
+//
+// Use of this source code is governed by a ISC-style
+// license that can be found in the LICENSE file or at
+// https://opensource.org/licenses/ISC
+//
+// SPDX-License-Identifier:ISC
+
+module fifo_ctl (
+ raddr,
+ waddr,
+ fflags,
+ ren_o,
+ sync,
+ depth,
+ rmode,
+ wmode,
+ rclk,
+ rst_R_n,
+ wclk,
+ rst_W_n,
+ ren,
+ wen,
+ upaf,
+ upae
+);
+ parameter ADDR_WIDTH = 11;
+ parameter FIFO_WIDTH = 3'd2;
+ localparam ADDR_PLUS_ONE = ADDR_WIDTH + 1;
+ output wire [ADDR_WIDTH - 1:0] raddr;
+ output wire [ADDR_WIDTH - 1:0] waddr;
+ output wire [7:0] fflags;
+ output wire ren_o;
+ input wire sync;
+ input wire [2:0] depth;
+ input wire [1:0] rmode;
+ input wire [1:0] wmode;
+ (* clkbuf_sink *)
+ input wire rclk;
+ input wire rst_R_n;
+ (* clkbuf_sink *)
+ input wire wclk;
+ input wire rst_W_n;
+ input wire ren;
+ input wire wen;
+ input wire [ADDR_WIDTH - 1:0] upaf;
+ input wire [ADDR_WIDTH - 1:0] upae;
+ reg [ADDR_WIDTH:0] pushtopop1;
+ reg [ADDR_WIDTH:0] pushtopop2;
+ reg [ADDR_WIDTH:0] poptopush1;
+ reg [ADDR_WIDTH:0] poptopush2;
+ wire [ADDR_WIDTH:0] pushtopop0;
+ wire [ADDR_WIDTH:0] poptopush0;
+ wire [ADDR_WIDTH:0] smux_poptopush;
+ wire [ADDR_WIDTH:0] smux_pushtopop;
+ assign smux_poptopush = (sync ? poptopush0 : poptopush2);
+ assign smux_pushtopop = (sync ? pushtopop0 : pushtopop2);
+ always @(posedge rclk or negedge rst_R_n)
+ if (~rst_R_n) begin
+ pushtopop1 <= #(1) {ADDR_WIDTH + 1{1'h0}};
+ pushtopop2 <= #(1) {ADDR_WIDTH + 1{1'h0}};
+ end
+ else begin
+ pushtopop1 <= #(1) pushtopop0;
+ pushtopop2 <= #(1) pushtopop1;
+ end
+ always @(posedge wclk or negedge rst_W_n)
+ if (~rst_W_n) begin
+ poptopush1 <= #(1) {ADDR_WIDTH + 1{1'h0}};
+ poptopush2 <= #(1) {ADDR_WIDTH + 1{1'h0}};
+ end
+ else begin
+ poptopush1 <= #(1) poptopush0;
+ poptopush2 <= #(1) poptopush1;
+ end
+ fifo_push #(.ADDR_WIDTH(ADDR_WIDTH)) u_fifo_push(
+ .wclk(wclk),
+ .wen(wen),
+ .rst_n(rst_W_n),
+ .rmode(rmode),
+ .wmode(wmode),
+ .gcout(pushtopop0),
+ .gcin(smux_poptopush),
+ .ff_waddr(waddr),
+ .depth(depth),
+ .pushflags(fflags[7:4]),
+ .upaf(upaf)
+ );
+ fifo_pop #(
+ .ADDR_WIDTH(ADDR_WIDTH),
+ .FIFO_WIDTH(FIFO_WIDTH)
+ ) u_fifo_pop(
+ .rclk(rclk),
+ .ren_in(ren),
+ .rst_n(rst_R_n),
+ .rmode(rmode),
+ .wmode(wmode),
+ .ren_o(ren_o),
+ .gcout(poptopush0),
+ .gcin(smux_pushtopop),
+ .out_raddr(raddr),
+ .depth(depth),
+ .popflags(fflags[3:0]),
+ .upae(upae)
+ );
+endmodule
+module fifo_push (
+ pushflags,
+ gcout,
+ ff_waddr,
+ rst_n,
+ wclk,
+ wen,
+ rmode,
+ wmode,
+ depth,
+ gcin,
+ upaf
+);
+ parameter ADDR_WIDTH = 11;
+ output wire [3:0] pushflags;
+ output wire [ADDR_WIDTH:0] gcout;
+ output wire [ADDR_WIDTH - 1:0] ff_waddr;
+ input rst_n;
+ input wclk;
+ input wen;
+ input [1:0] rmode;
+ input [1:0] wmode;
+ input [2:0] depth;
+ input [ADDR_WIDTH:0] gcin;
+ input [ADDR_WIDTH - 1:0] upaf;
+ reg full_next;
+ reg full;
+ reg paf_next;
+ reg paf;
+ reg fmo;
+ reg fmo_next;
+ reg overflow;
+ reg p1;
+ reg p2;
+ reg f1;
+ reg f2;
+ reg q1;
+ reg q2;
+ reg [1:0] gmode;
+ reg [ADDR_WIDTH:0] waddr;
+ reg [ADDR_WIDTH:0] raddr;
+ reg [ADDR_WIDTH:0] gcout_reg;
+ reg [ADDR_WIDTH:0] gcout_next;
+ reg [ADDR_WIDTH:0] raddr_next;
+ reg [ADDR_WIDTH - 1:0] paf_thresh;
+ wire overflow_next;
+ wire [ADDR_WIDTH:0] waddr_next;
+ wire [ADDR_WIDTH:0] gc8out_next;
+ wire [ADDR_WIDTH - 1:0] gc16out_next;
+ wire [ADDR_WIDTH - 2:0] gc32out_next;
+ wire [ADDR_WIDTH:0] tmp;
+ wire [ADDR_WIDTH:0] next_count;
+ wire [ADDR_WIDTH:0] count;
+ reg [ADDR_WIDTH:0] fbytes;
+ genvar i;
+ assign next_count = fbytes - (waddr_next >= raddr_next ? waddr_next - raddr_next : (~raddr_next + waddr_next) + 1);
+ assign count = fbytes - (waddr >= raddr ? waddr - raddr : (~raddr + waddr) + 1);
+ always @(*) begin
+ case (depth)
+ 3'b000: fbytes = {ADDR_WIDTH + 1{1'h0}} | 12'd2048;
+ 3'b001: fbytes = {ADDR_WIDTH + 1{1'h0}} | 11'd1024;
+ 3'b010: fbytes = {ADDR_WIDTH + 1{1'h0}} | 10'd512;
+ 3'b011: fbytes = {ADDR_WIDTH + 1{1'h0}} | 9'd256;
+ 3'b100: fbytes = {ADDR_WIDTH + 1{1'h0}} | 8'd128;
+ 3'b101: fbytes = {ADDR_WIDTH + 1{1'h0}} | 7'd64;
+ 3'b110: fbytes = {ADDR_WIDTH + 1{1'h0}} | 6'd32;
+ 3'b111: fbytes = {ADDR_WIDTH + 1{1'h0}} | 13'd4096;
+ endcase
+ paf_thresh = (wmode ? (wmode[0] ? upaf << 1 : upaf) : upaf << 2);
+ end
+ always @(*)
+ case (wmode)
+ 2'h0, 2'h1, 2'h2: begin
+ full_next = (wen ? f1 : f2);
+ fmo_next = (wen ? p1 : p2);
+ paf_next = (wen ? q1 : q2);
+ end
+ default: begin
+ full_next = 1'b0;
+ fmo_next = 1'b0;
+ paf_next = 1'b0;
+ end
+ endcase
+ always @(*) begin : PUSH_FULL_FLAGS
+ f1 = 1'b0;
+ f2 = 1'b0;
+ p1 = 1'b0;
+ p2 = 1'b0;
+ q1 = next_count < paf_thresh;
+ q2 = count < paf_thresh;
+ case (wmode)
+ 2'h0:
+ case (depth)
+ 3'h0: begin
+ f1 = {~waddr_next[11], waddr_next[10:2]} == raddr_next[11:2];
+ f2 = {~waddr[11], waddr[10:2]} == raddr_next[11:2];
+ p1 = ((waddr_next[10:2] + 1) & 9'h1ff) == raddr_next[10:2];
+ p2 = ((waddr[10:2] + 1) & 9'h1ff) == raddr_next[10:2];
+ end
+ 3'h1: begin
+ f1 = {~waddr_next[10], waddr_next[9:2]} == raddr_next[10:2];
+ f2 = {~waddr[10], waddr[9:2]} == raddr_next[10:2];
+ p1 = ((waddr_next[9:2] + 1) & 8'hff) == raddr_next[9:2];
+ p2 = ((waddr[9:2] + 1) & 8'hff) == raddr_next[9:2];
+ end
+ 3'h2: begin
+ f1 = {~waddr_next[9], waddr_next[8:2]} == raddr_next[9:2];
+ f2 = {~waddr[9], waddr[8:2]} == raddr_next[9:2];
+ p1 = ((waddr_next[8:2] + 1) & 7'h7f) == raddr_next[8:2];
+ p2 = ((waddr[8:2] + 1) & 7'h7f) == raddr_next[8:2];
+ end
+ 3'h3: begin
+ f1 = {~waddr_next[8], waddr_next[7:2]} == raddr_next[8:2];
+ f2 = {~waddr[8], waddr[7:2]} == raddr_next[8:2];
+ p1 = ((waddr_next[7:2] + 1) & 6'h3f) == raddr_next[7:2];
+ p2 = ((waddr[7:2] + 1) & 6'h3f) == raddr_next[7:2];
+ end
+ 3'h4: begin
+ f1 = {~waddr_next[7], waddr_next[6:2]} == raddr_next[7:2];
+ f2 = {~waddr[7], waddr[6:2]} == raddr_next[7:2];
+ p1 = ((waddr_next[6:2] + 1) & 5'h1f) == raddr_next[6:2];
+ p2 = ((waddr[6:2] + 1) & 5'h1f) == raddr_next[6:2];
+ end
+ 3'h5: begin
+ f1 = {~waddr_next[6], waddr_next[5:2]} == raddr_next[6:2];
+ f2 = {~waddr[6], waddr[5:2]} == raddr_next[6:2];
+ p1 = ((waddr_next[5:2] + 1) & 4'hf) == raddr_next[5:2];
+ p2 = ((waddr[5:2] + 1) & 4'hf) == raddr_next[5:2];
+ end
+ 3'h6: begin
+ f1 = {~waddr_next[5], waddr_next[4:2]} == raddr_next[5:2];
+ f2 = {~waddr[5], waddr[4:2]} == raddr_next[5:2];
+ p1 = ((waddr_next[4:2] + 1) & 3'h7) == raddr_next[4:2];
+ p2 = ((waddr[4:2] + 1) & 3'h7) == raddr_next[4:2];
+ end
+ 3'h7: begin
+ f1 = {~waddr_next[ADDR_WIDTH], waddr_next[ADDR_WIDTH - 1:2]} == raddr_next[ADDR_WIDTH:2];
+ f2 = {~waddr[ADDR_WIDTH], waddr[10:2]} == raddr_next[ADDR_WIDTH:2];
+ p1 = ((waddr_next[ADDR_WIDTH - 1:2] + 1) & {ADDR_WIDTH - 2 {1'b1}}) == raddr_next[ADDR_WIDTH - 1:2];
+ p2 = ((waddr[ADDR_WIDTH - 1:2] + 1) & {ADDR_WIDTH - 2 {1'b1}}) == raddr_next[ADDR_WIDTH - 1:2];
+ end
+ endcase
+ 2'h1:
+ case (depth)
+ 3'h0: begin
+ f1 = {~waddr_next[11], waddr_next[10:1]} == raddr_next[11:1];
+ f2 = {~waddr[11], waddr[10:1]} == raddr_next[11:1];
+ p1 = ((waddr_next[10:1] + 1) & 10'h3ff) == raddr_next[10:1];
+ p2 = ((waddr[10:1] + 1) & 10'h3ff) == raddr_next[10:1];
+ end
+ 3'h1: begin
+ f1 = {~waddr_next[10], waddr_next[9:1]} == raddr_next[10:1];
+ f2 = {~waddr[10], waddr[9:1]} == raddr_next[10:1];
+ p1 = ((waddr_next[9:1] + 1) & 9'h1ff) == raddr_next[9:1];
+ p2 = ((waddr[9:1] + 1) & 9'h1ff) == raddr_next[9:1];
+ end
+ 3'h2: begin
+ f1 = {~waddr_next[9], waddr_next[8:1]} == raddr_next[9:1];
+ f2 = {~waddr[9], waddr[8:1]} == raddr_next[9:1];
+ p1 = ((waddr_next[8:1] + 1) & 8'hff) == raddr_next[8:1];
+ p2 = ((waddr[8:1] + 1) & 8'hff) == raddr_next[8:1];
+ end
+ 3'h3: begin
+ f1 = {~waddr_next[8], waddr_next[7:1]} == raddr_next[8:1];
+ f2 = {~waddr[8], waddr[7:1]} == raddr_next[8:1];
+ p1 = ((waddr_next[7:1] + 1) & 7'h7f) == raddr_next[7:1];
+ p2 = ((waddr[7:1] + 1) & 7'h7f) == raddr_next[7:1];
+ end
+ 3'h4: begin
+ f1 = {~waddr_next[7], waddr_next[6:1]} == raddr_next[7:1];
+ f2 = {~waddr[7], waddr[6:1]} == raddr_next[7:1];
+ p1 = ((waddr_next[6:1] + 1) & 6'h3f) == raddr_next[6:1];
+ p2 = ((waddr[6:1] + 1) & 6'h3f) == raddr_next[6:1];
+ end
+ 3'h5: begin
+ f1 = {~waddr_next[6], waddr_next[5:1]} == raddr_next[6:1];
+ f2 = {~waddr[6], waddr[5:1]} == raddr_next[6:1];
+ p1 = ((waddr_next[5:1] + 1) & 5'h1f) == raddr_next[5:1];
+ p2 = ((waddr[5:1] + 1) & 5'h1f) == raddr_next[5:1];
+ end
+ 3'h6: begin
+ f1 = {~waddr_next[5], waddr_next[4:1]} == raddr_next[5:1];
+ f2 = {~waddr[5], waddr[4:1]} == raddr_next[5:1];
+ p1 = ((waddr_next[4:1] + 1) & 4'hf) == raddr_next[4:1];
+ p2 = ((waddr[4:1] + 1) & 4'hf) == raddr_next[4:1];
+ end
+ 3'h7: begin
+ f1 = {~waddr_next[ADDR_WIDTH], waddr_next[ADDR_WIDTH - 1:1]} == raddr_next[ADDR_WIDTH:1];
+ f2 = {~waddr[11], waddr[ADDR_WIDTH - 1:1]} == raddr_next[ADDR_WIDTH:1];
+ p1 = ((waddr_next[ADDR_WIDTH - 1:1] + 1) & {ADDR_WIDTH - 1 {1'b1}}) == raddr_next[ADDR_WIDTH - 1:1];
+ p2 = ((waddr[ADDR_WIDTH - 1:1] + 1) & {ADDR_WIDTH - 1 {1'b1}}) == raddr_next[ADDR_WIDTH - 1:1];
+ end
+ endcase
+ 2'h2:
+ case (depth)
+ 3'h0: begin
+ f1 = {~waddr_next[11], waddr_next[10:0]} == raddr_next[11:0];
+ f2 = {~waddr[11], waddr[10:0]} == raddr_next[11:0];
+ p1 = ((waddr_next[10:0] + 1) & 11'h7ff) == raddr_next[10:0];
+ p2 = ((waddr[10:0] + 1) & 11'h7ff) == raddr_next[10:0];
+ end
+ 3'h1: begin
+ f1 = {~waddr_next[10], waddr_next[9:0]} == raddr_next[10:0];
+ f2 = {~waddr[10], waddr[9:0]} == raddr_next[10:0];
+ p1 = ((waddr_next[9:0] + 1) & 10'h3ff) == raddr_next[9:0];
+ p2 = ((waddr[9:0] + 1) & 10'h3ff) == raddr_next[9:0];
+ end
+ 3'h2: begin
+ f1 = {~waddr_next[9], waddr_next[8:0]} == raddr_next[9:0];
+ f2 = {~waddr[9], waddr[8:0]} == raddr_next[9:0];
+ p1 = ((waddr_next[8:0] + 1) & 9'h1ff) == raddr_next[8:0];
+ p2 = ((waddr[8:0] + 1) & 9'h1ff) == raddr_next[8:0];
+ end
+ 3'h3: begin
+ f1 = {~waddr_next[8], waddr_next[7:0]} == raddr_next[8:0];
+ f2 = {~waddr[8], waddr[7:0]} == raddr_next[8:0];
+ p1 = ((waddr_next[7:0] + 1) & 8'hff) == raddr_next[7:0];
+ p2 = ((waddr[7:0] + 1) & 8'hff) == raddr_next[7:0];
+ end
+ 3'h4: begin
+ f1 = {~waddr_next[7], waddr_next[6:0]} == raddr_next[7:0];
+ f2 = {~waddr[7], waddr[6:0]} == raddr_next[7:0];
+ p1 = ((waddr_next[6:0] + 1) & 7'h7f) == raddr_next[6:0];
+ p2 = ((waddr[6:0] + 1) & 7'h7f) == raddr_next[6:0];
+ end
+ 3'h5: begin
+ f1 = {~waddr_next[6], waddr_next[5:0]} == raddr_next[6:0];
+ f2 = {~waddr[6], waddr[5:0]} == raddr_next[6:0];
+ p1 = ((waddr_next[5:0] + 1) & 6'h3f) == raddr_next[5:0];
+ p2 = ((waddr[5:0] + 1) & 6'h3f) == raddr_next[5:0];
+ end
+ 3'h6: begin
+ f1 = {~waddr_next[5], waddr_next[4:0]} == raddr_next[5:0];
+ f2 = {~waddr[5], waddr[4:0]} == raddr_next[5:0];
+ p1 = ((waddr_next[4:0] + 1) & 5'h1f) == raddr_next[4:0];
+ p2 = ((waddr[4:0] + 1) & 5'h1f) == raddr_next[4:0];
+ end
+ 3'h7: begin
+ f1 = {~waddr_next[ADDR_WIDTH], waddr_next[ADDR_WIDTH - 1:0]} == raddr_next[ADDR_WIDTH:0];
+ f2 = {~waddr[ADDR_WIDTH], waddr[ADDR_WIDTH - 1:0]} == raddr_next[ADDR_WIDTH:0];
+ p1 = ((waddr_next[ADDR_WIDTH - 1:0] + 1) & {ADDR_WIDTH {1'b1}}) == raddr_next[ADDR_WIDTH - 1:0];
+ p2 = ((waddr[ADDR_WIDTH - 1:0] + 1) & {ADDR_WIDTH {1'b1}}) == raddr_next[ADDR_WIDTH - 1:0];
+ end
+ endcase
+ 2'h3: begin
+ f1 = 1'b0;
+ f2 = 1'b0;
+ p1 = 1'b0;
+ p2 = 1'b0;
+ end
+ endcase
+ end
+ always @(*)
+ case (wmode)
+ 2'h0: gmode = 2'h0;
+ 2'h1: gmode = (rmode == 2'h0 ? 2'h0 : 2'h1);
+ 2'h2: gmode = (rmode == 2'h2 ? 2'h2 : rmode);
+ 2'h3: gmode = 2'h3;
+ endcase
+ assign gc8out_next = (waddr_next >> 1) ^ waddr_next;
+ assign gc16out_next = (waddr_next >> 2) ^ (waddr_next >> 1);
+ assign gc32out_next = (waddr_next >> 3) ^ (waddr_next >> 2);
+ always @(*)
+ if (wen)
+ case (gmode)
+ 2'h2: gcout_next = gc8out_next;
+ 2'h1: gcout_next = {1'b0, gc16out_next};
+ 2'h0: gcout_next = {2'b00, gc32out_next};
+ default: gcout_next = 12'h000;
+ endcase
+ else
+ gcout_next = 12'h000;
+ always @(posedge wclk or negedge rst_n)
+ if (~rst_n) begin
+ full <= #(1) 1'b0;
+ fmo <= #(1) 1'b0;
+ paf <= #(1) 1'b0;
+ raddr <= #(1) ADDR_WIDTH + 1'h0;
+ end
+ else begin
+ full <= #(1) full_next;
+ fmo <= #(1) fmo_next;
+ paf <= #(1) paf_next;
+ case (gmode)
+ 0: raddr <= #(1) raddr_next & {{ADDR_WIDTH - 1 {1'b1}}, 2'b00};
+ 1: raddr <= #(1) raddr_next & {{ADDR_WIDTH {1'b1}}, 1'b0};
+ 2: raddr <= #(1) raddr_next & {ADDR_WIDTH + 1 {1'b1}};
+ 3: raddr <= #(1) 12'h000;
+ endcase
+ end
+ assign overflow_next = full & wen;
+ always @(posedge wclk or negedge rst_n)
+ if (~rst_n)
+ overflow <= #(1) 1'b0;
+ else if (wen == 1'b1)
+ overflow <= #(1) overflow_next;
+ always @(posedge wclk or negedge rst_n)
+ if (~rst_n) begin
+ waddr <= #(1) {ADDR_WIDTH + 1 {1'b0}};
+ gcout_reg <= #(1) {ADDR_WIDTH + 1 {1'b0}};
+ end
+ else if (wen == 1'b1) begin
+ waddr <= #(1) waddr_next;
+ gcout_reg <= #(1) gcout_next;
+ end
+ assign gcout = gcout_reg;
+ generate
+ for (i = 0; i < (ADDR_WIDTH + 1); i = i + 1) begin : genblk1
+ assign tmp[i] = ^(gcin >> i);
+ end
+ endgenerate
+ always @(*)
+ case (gmode)
+ 2'h0: raddr_next = {tmp[ADDR_WIDTH - 2:0], 2'b00} & {{ADDR_WIDTH - 1 {1'b1}}, 2'b00};
+ 2'h1: raddr_next = {tmp[ADDR_WIDTH - 1:0], 1'b0} & {{ADDR_WIDTH {1'b1}}, 1'b0};
+ 2'h2: raddr_next = {tmp[ADDR_WIDTH:0]} & {ADDR_WIDTH + 1 {1'b1}};
+ default: raddr_next = {ADDR_WIDTH + 1 {1'b0}};
+ endcase
+ assign ff_waddr = waddr[ADDR_WIDTH - 1:0];
+ assign pushflags = (rst_n ? {full, fmo, paf, overflow} : 4'b1111);
+ assign waddr_next = waddr + (wmode == 2'h0 ? 'h4 : (wmode == 2'h1 ? 'h2 : 'h1));
+endmodule
+module fifo_pop (
+ ren_o,
+ popflags,
+ out_raddr,
+ gcout,
+ rst_n,
+ rclk,
+ ren_in,
+ rmode,
+ wmode,
+ gcin,
+ depth,
+ upae
+);
+ parameter ADDR_WIDTH = 11;
+ parameter FIFO_WIDTH = 3'd2;
+ output wire ren_o;
+ output wire [3:0] popflags;
+ output reg [ADDR_WIDTH - 1:0] out_raddr;
+ output wire [ADDR_WIDTH:0] gcout;
+ input rst_n;
+ input rclk;
+ input ren_in;
+ input [1:0] rmode;
+ input [1:0] wmode;
+ input [ADDR_WIDTH:0] gcin;
+ input [ADDR_WIDTH - 1:0] upae;
+ input [2:0] depth;
+ reg empty;
+ reg epo;
+ reg pae;
+ reg underflow;
+ reg e1;
+ reg e2;
+ reg o1;
+ reg o2;
+ reg q1;
+ reg q2;
+ reg [1:0] bwl_sel;
+ reg [1:0] gmode;
+ reg [ADDR_WIDTH - 1:0] ff_raddr;
+ reg [ADDR_WIDTH:0] waddr;
+ reg [ADDR_WIDTH:0] raddr;
+ reg [ADDR_WIDTH:0] gcout_reg;
+ reg [ADDR_WIDTH:0] gcout_next;
+ reg [ADDR_WIDTH:0] waddr_next;
+ reg [ADDR_WIDTH - 1:0] pae_thresh;
+ wire ren_out;
+ wire empty_next;
+ wire pae_next;
+ wire epo_next;
+ wire [ADDR_WIDTH - 2:0] gc32out_next;
+ wire [ADDR_WIDTH - 1:0] gc16out_next;
+ wire [ADDR_WIDTH:0] gc8out_next;
+ wire [ADDR_WIDTH:0] raddr_next;
+ wire [ADDR_WIDTH - 1:0] ff_raddr_next;
+ wire [ADDR_WIDTH:0] tmp;
+ wire [ADDR_WIDTH:0] next_count;
+ wire [ADDR_WIDTH:0] count;
+ reg [ADDR_WIDTH:0] fbytes;
+ genvar i;
+ assign next_count = waddr - raddr_next;
+ assign count = waddr - raddr;
+ always @(*)
+ case (depth)
+ 3'b000: fbytes = 'd2048;
+ 3'b001: fbytes = 'd1024;
+ 3'b010: fbytes = 'd512;
+ 3'b011: fbytes = 'd256;
+ 3'b100: fbytes = 'd128;
+ 3'b101: fbytes = 'd64;
+ 3'b110: fbytes = 'd32;
+ 3'b111: fbytes = 'd4096;
+ endcase
+ always @(*) pae_thresh = rmode ? (rmode[0] ? upae << 1 : upae) : upae << 2;
+ assign ren_out = (empty ? 1'b1 : ren_in);
+ always @(*)
+ case (rmode)
+ 2'h0: gmode = 2'h0;
+ 2'h1: gmode = (wmode == 2'h0 ? 2'h0 : 2'h1);
+ 2'h2: gmode = (wmode == 2'h2 ? 2'h2 : wmode);
+ 2'h3: gmode = 2'h3;
+ endcase
+ always @(*) begin
+ e1 = 1'b0;
+ e2 = 1'b0;
+ o1 = 1'b0;
+ o2 = 1'b0;
+ q1 = next_count < pae_thresh;
+ q2 = count < pae_thresh;
+ case (rmode)
+ 2'h0: begin
+ e1 = raddr_next[ADDR_WIDTH:2] == waddr_next[ADDR_WIDTH:2];
+ e2 = raddr[ADDR_WIDTH:2] == waddr_next[ADDR_WIDTH:2];
+ o1 = (raddr_next[ADDR_WIDTH:2] + 1) == waddr_next[ADDR_WIDTH:2];
+ o2 = (raddr[ADDR_WIDTH:2] + 1) == waddr_next[ADDR_WIDTH:2];
+ end
+ 2'h1: begin
+ e1 = raddr_next[ADDR_WIDTH:1] == waddr_next[ADDR_WIDTH:1];
+ e2 = raddr[ADDR_WIDTH:1] == waddr_next[ADDR_WIDTH:1];
+ o1 = (raddr_next[ADDR_WIDTH:1] + 1) == waddr_next[ADDR_WIDTH:1];
+ o2 = (raddr[ADDR_WIDTH:1] + 1) == waddr_next[ADDR_WIDTH:1];
+ end
+ 2'h2: begin
+ e1 = raddr_next[ADDR_WIDTH:0] == waddr_next[ADDR_WIDTH:0];
+ e2 = raddr[ADDR_WIDTH:0] == waddr_next[ADDR_WIDTH:0];
+ o1 = (raddr_next[ADDR_WIDTH:0] + 1) == waddr_next[ADDR_WIDTH:0];
+ o2 = (raddr[ADDR_WIDTH:0] + 1) == waddr_next[11:0];
+ end
+ 2'h3: begin
+ e1 = 1'b0;
+ e2 = 1'b0;
+ o1 = 1'b0;
+ o2 = 1'b0;
+ end
+ endcase
+ end
+ assign empty_next = (ren_in & !empty ? e1 : e2);
+ assign epo_next = (ren_in & !empty ? o1 : o2);
+ assign pae_next = (ren_in & !empty ? q1 : q2);
+ always @(posedge rclk or negedge rst_n)
+ if (~rst_n) begin
+ empty <= #(1) 1'b1;
+ pae <= #(1) 1'b1;
+ epo <= #(1) 1'b0;
+ end
+ else begin
+ empty <= #(1) empty_next;
+ pae <= #(1) pae_next;
+ epo <= #(1) epo_next;
+ end
+ assign gc8out_next = (raddr_next >> 1) ^ raddr_next;
+ assign gc16out_next = (raddr_next >> 2) ^ (raddr_next >> 1);
+ assign gc32out_next = (raddr_next >> 3) ^ (raddr_next >> 2);
+ always @(*)
+ if (ren_in)
+ case (gmode)
+ 2'h2: gcout_next = gc8out_next;
+ 2'h1: gcout_next = {1'b0, gc16out_next};
+ 2'h0: gcout_next = {2'b00, gc32out_next};
+ default: gcout_next = 'h0;
+ endcase
+ else
+ gcout_next = 'h0;
+ always @(posedge rclk or negedge rst_n)
+ if (~rst_n)
+ waddr <= #(1) 12'h000;
+ else
+ waddr <= #(1) waddr_next;
+ always @(posedge rclk or negedge rst_n)
+ if (~rst_n) begin
+ underflow <= #(1) 1'b0;
+ bwl_sel <= #(1) 2'h0;
+ gcout_reg <= #(1) 12'h000;
+ end
+ else if (ren_in) begin
+ underflow <= #(1) empty;
+ if (!empty) begin
+ bwl_sel <= #(1) raddr_next[1:0];
+ gcout_reg <= #(1) gcout_next;
+ end
+ end
+ generate
+ for (i = 0; i < (ADDR_WIDTH + 1); i = i + 1) begin : genblk1
+ assign tmp[i] = ^(gcin >> i);
+ end
+ endgenerate
+ always @(*)
+ case (gmode)
+ 2'h0: waddr_next = {tmp[9:0], 2'b00} & 12'hffc;
+ 2'h1: waddr_next = {tmp[10:0], 1'b0} & 12'hffe;
+ 2'h2: waddr_next = {tmp[11:0]} & 12'hfff;
+ default: waddr_next = 12'h000;
+ endcase
+ assign ff_raddr_next = ff_raddr + (rmode == 2'h0 ? 'h4 : (rmode == 2'h1 ? 'h2 : 'h1));
+ assign raddr_next = raddr + (rmode == 2'h0 ? 'h4 : (rmode == 2'h1 ? 'h2 : 'h1));
+ always @(posedge rclk or negedge rst_n)
+ if (~rst_n)
+ ff_raddr <= #(1) 1'sb0;
+ else if (empty & ~empty_next)
+ ff_raddr <= #(1) raddr_next[10:0];
+ else if ((ren_in & !empty) & ~empty_next)
+ ff_raddr <= #(1) ff_raddr_next;
+ always @(posedge rclk or negedge rst_n)
+ if (~rst_n)
+ raddr <= #(1) 12'h000;
+ else if (ren_in & !empty)
+ raddr <= #(1) raddr_next;
+ always @(*)
+ case (FIFO_WIDTH)
+ default: out_raddr = ff_raddr[ADDR_WIDTH - 1:0];
+ 2: out_raddr = {ff_raddr[ADDR_WIDTH - 1:1], bwl_sel[0]};
+ 4: out_raddr = {ff_raddr[ADDR_WIDTH - 1:2], bwl_sel};
+ endcase
+ assign ren_o = ren_out;
+ assign gcout = gcout_reg;
+ assign popflags = {empty, epo, pae, underflow};
+endmodule