Merge branch 'master' into add_fifo_bram_macros
diff --git a/ql-qlf-plugin/Makefile b/ql-qlf-plugin/Makefile
index d754156..d546b16 100644
--- a/ql-qlf-plugin/Makefile
+++ b/ql-qlf-plugin/Makefile
@@ -55,6 +55,7 @@
$(QLF_K6N10F_DIR)/brams.txt \
$(QLF_K6N10F_DIR)/cells_sim.v \
$(QLF_K6N10F_DIR)/dsp_sim.v \
+ $(QLF_K6N10F_DIR)/primitives_sim.v \
$(QLF_K6N10F_DIR)/brams_sim.v \
$(QLF_K6N10F_DIR)/sram1024x18.v \
$(QLF_K6N10F_DIR)/TDP18K_FIFO.v \
diff --git a/ql-qlf-plugin/qlf_k6n10f/brams_final_map.v b/ql-qlf-plugin/qlf_k6n10f/brams_final_map.v
index 7637595..cc0e272 100644
--- a/ql-qlf-plugin/qlf_k6n10f/brams_final_map.v
+++ b/ql-qlf-plugin/qlf_k6n10f/brams_final_map.v
@@ -486,3 +486,1274 @@
.FLUSH2_i(FLUSH2)
);
endmodule
+
+module BRAM2x18_SFIFO (
+ DIN1,
+ PUSH1,
+ POP1,
+ CLK1,
+ Async_Flush1,
+ Overrun_Error1,
+ Full_Watermark1,
+ Almost_Full1,
+ Full1,
+ Underrun_Error1,
+ Empty_Watermark1,
+ Almost_Empty1,
+ Empty1,
+ DOUT1,
+
+ DIN2,
+ PUSH2,
+ POP2,
+ CLK2,
+ Async_Flush2,
+ Overrun_Error2,
+ Full_Watermark2,
+ Almost_Full2,
+ Full2,
+ Underrun_Error2,
+ Empty_Watermark2,
+ Almost_Empty2,
+ Empty2,
+ DOUT2
+);
+
+ parameter WR_DATA_WIDTH = 18;
+ parameter RD_DATA_WIDTH = 18;
+
+
+ parameter UPAE_DBITS1 = 11'd10;
+ parameter UPAF_DBITS1 = 11'd10;
+
+ parameter UPAE_DBITS2 = 11'd10;
+ parameter UPAF_DBITS2 = 11'd10;
+
+ input CLK1;
+ input PUSH1, POP1;
+ input [WR_DATA_WIDTH-1:0] DIN1;
+ input Async_Flush1;
+ output [RD_DATA_WIDTH-1:0] DOUT1;
+ output Almost_Full1, Almost_Empty1;
+ output Full1, Empty1;
+ output Full_Watermark1, Empty_Watermark1;
+ output Overrun_Error1, Underrun_Error1;
+
+ input CLK2;
+ input PUSH2, POP2;
+ input [WR_DATA_WIDTH-1:0] DIN2;
+ input Async_Flush2;
+ output [RD_DATA_WIDTH-1:0] DOUT2;
+ output Almost_Full2, Almost_Empty2;
+ output Full2, Empty2;
+ output Full_Watermark2, Empty_Watermark2;
+ output Overrun_Error2, Underrun_Error2;
+
+ wire [17:0] in_reg1;
+ wire [17:0] out_reg1;
+ wire [17:0] fifo1_flags;
+
+ wire [17:0] in_reg2;
+ wire [17:0] out_reg2;
+ wire [17:0] fifo2_flags;
+
+ wire Push_Clk1, Pop_Clk1;
+ wire Push_Clk2, Pop_Clk2;
+ assign Push_Clk1 = CLK1;
+ assign Pop_Clk1 = CLK1;
+ assign Push_Clk2 = CLK2;
+ assign Pop_Clk2 = CLK2;
+
+ assign Overrun_Error1 = fifo1_flags[0];
+ assign Full_Watermark1 = fifo1_flags[1];
+ assign Almost_Full1 = fifo1_flags[2];
+ assign Full1 = fifo1_flags[3];
+ assign Underrun_Error1 = fifo1_flags[4];
+ assign Empty_Watermark1 = fifo1_flags[5];
+ assign Almost_Empty1 = fifo1_flags[6];
+ assign Empty1 = fifo1_flags[7];
+
+ assign Overrun_Error2 = fifo2_flags[0];
+ assign Full_Watermark2 = fifo2_flags[1];
+ assign Almost_Full2 = fifo2_flags[2];
+ assign Full2 = fifo2_flags[3];
+ assign Underrun_Error2 = fifo2_flags[4];
+ assign Empty_Watermark2 = fifo2_flags[5];
+ assign Almost_Empty2 = fifo2_flags[6];
+ assign Empty2 = fifo2_flags[7];
+
+ generate
+ if (WR_DATA_WIDTH == 18) begin
+ assign in_reg1[17:0] = DIN1[17:0];
+ assign in_reg2[17:0] = DIN2[17:0];
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
+ assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
+ end else begin
+ assign in_reg1[17:WR_DATA_WIDTH] = 0;
+ assign in_reg1[WR_DATA_WIDTH-1:0] = DIN1[WR_DATA_WIDTH-1:0];
+ assign in_reg2[17:WR_DATA_WIDTH] = 0;
+ assign in_reg2[WR_DATA_WIDTH-1:0] = DIN2[WR_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+ case (RD_DATA_WIDTH)
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b1
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+ };
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b1
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+ };
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+ };
+ end
+ endcase
+ end
+ endcase
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+
+ generate
+ if (RD_DATA_WIDTH == 9) begin
+ assign DOUT1[RD_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
+ assign DOUT2[RD_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
+ end else begin
+ assign DOUT1[RD_DATA_WIDTH-1:0] = out_reg1[RD_DATA_WIDTH-1:0];
+ assign DOUT2[RD_DATA_WIDTH-1:0] = out_reg2[RD_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+endmodule
+
+module BRAM2x18_AFIFO (
+ DIN1,
+ PUSH1,
+ POP1,
+ Push_Clk1,
+ Pop_Clk1,
+ Async_Flush1,
+ Overrun_Error1,
+ Full_Watermark1,
+ Almost_Full1,
+ Full1,
+ Underrun_Error1,
+ Empty_Watermark1,
+ Almost_Empty1,
+ Empty1,
+ DOUT1,
+
+ DIN2,
+ PUSH2,
+ POP2,
+ Push_Clk2,
+ Pop_Clk2,
+ Async_Flush2,
+ Overrun_Error2,
+ Full_Watermark2,
+ Almost_Full2,
+ Full2,
+ Underrun_Error2,
+ Empty_Watermark2,
+ Almost_Empty2,
+ Empty2,
+ DOUT2
+);
+
+ parameter WR_DATA_WIDTH = 18;
+ parameter RD_DATA_WIDTH = 18;
+
+
+ parameter UPAE_DBITS1 = 11'd10;
+ parameter UPAF_DBITS1 = 11'd10;
+
+ parameter UPAE_DBITS2 = 11'd10;
+ parameter UPAF_DBITS2 = 11'd10;
+
+ input Push_Clk1, Pop_Clk1;
+ input PUSH1, POP1;
+ input [WR_DATA_WIDTH-1:0] DIN1;
+ input Async_Flush1;
+ output [RD_DATA_WIDTH-1:0] DOUT1;
+ output Almost_Full1, Almost_Empty1;
+ output Full1, Empty1;
+ output Full_Watermark1, Empty_Watermark1;
+ output Overrun_Error1, Underrun_Error1;
+
+ input Push_Clk2, Pop_Clk2;
+ input PUSH2, POP2;
+ input [WR_DATA_WIDTH-1:0] DIN2;
+ input Async_Flush2;
+ output [RD_DATA_WIDTH-1:0] DOUT2;
+ output Almost_Full2, Almost_Empty2;
+ output Full2, Empty2;
+ output Full_Watermark2, Empty_Watermark2;
+ output Overrun_Error2, Underrun_Error2;
+
+ wire [17:0] in_reg1;
+ wire [17:0] out_reg1;
+ wire [17:0] fifo1_flags;
+
+ wire [17:0] in_reg2;
+ wire [17:0] out_reg2;
+ wire [17:0] fifo2_flags;
+
+ assign Overrun_Error1 = fifo1_flags[0];
+ assign Full_Watermark1 = fifo1_flags[1];
+ assign Almost_Full1 = fifo1_flags[2];
+ assign Full1 = fifo1_flags[3];
+ assign Underrun_Error1 = fifo1_flags[4];
+ assign Empty_Watermark1 = fifo1_flags[5];
+ assign Almost_Empty1 = fifo1_flags[6];
+ assign Empty1 = fifo1_flags[7];
+
+ assign Overrun_Error2 = fifo2_flags[0];
+ assign Full_Watermark2 = fifo2_flags[1];
+ assign Almost_Full2 = fifo2_flags[2];
+ assign Full2 = fifo2_flags[3];
+ assign Underrun_Error2 = fifo2_flags[4];
+ assign Empty_Watermark2 = fifo2_flags[5];
+ assign Almost_Empty2 = fifo2_flags[6];
+ assign Empty2 = fifo2_flags[7];
+
+ generate
+ if (WR_DATA_WIDTH == 18) begin
+ assign in_reg1[17:0] = DIN1[17:0];
+ assign in_reg2[17:0] = DIN2[17:0];
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
+ assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
+ end else begin
+ assign in_reg1[17:WR_DATA_WIDTH] = 0;
+ assign in_reg1[WR_DATA_WIDTH-1:0] = DIN1[WR_DATA_WIDTH-1:0];
+ assign in_reg2[17:WR_DATA_WIDTH] = 0;
+ assign in_reg2[WR_DATA_WIDTH-1:0] = DIN2[WR_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+ case (RD_DATA_WIDTH)
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b0
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+ };
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b0
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+ };
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+ };
+ end
+ endcase
+ end
+ endcase
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+
+ generate
+ if (RD_DATA_WIDTH == 9) begin
+ assign DOUT1[RD_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
+ assign DOUT2[RD_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
+ end else begin
+ assign DOUT1[RD_DATA_WIDTH-1:0] = out_reg1[RD_DATA_WIDTH-1:0];
+ assign DOUT2[RD_DATA_WIDTH-1:0] = out_reg2[RD_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+endmodule
+
+module BRAM2x18_SP (
+ RESET_ni,
+
+ WEN1_i,
+ REN1_i,
+ WR1_CLK_i,
+ RD1_CLK_i,
+ WR1_BE_i,
+ WR1_ADDR_i,
+ RD1_ADDR_i,
+ WDATA1_i,
+ RDATA1_o,
+
+ WEN2_i,
+ REN2_i,
+ WR2_CLK_i,
+ RD2_CLK_i,
+ WR2_BE_i,
+ WR2_ADDR_i,
+ RD2_ADDR_i,
+ WDATA2_i,
+ RDATA2_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter BE1_WIDTH = 2;
+parameter BE2_WIDTH = 2;
+
+input wire RESET_ni;
+
+input wire WEN1_i;
+input wire REN1_i;
+input wire WR1_CLK_i;
+input wire RD1_CLK_i;
+input wire [BE1_WIDTH-1:0] WR1_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA1_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire WEN2_i;
+input wire REN2_i;
+input wire WR2_CLK_i;
+input wire RD2_CLK_i;
+input wire [BE2_WIDTH-1:0] WR2_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA2_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA2_o;
+
+//localparam READ_DATA_BITS_TO_SKIP = 18 - RD_DATA_WIDTH;
+
+wire [14:RD_ADDR_WIDTH] RD1_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR1_ADDR_CMPL;
+wire [17:RD_DATA_WIDTH] RD1_DATA_CMPL;
+wire [17:WR_DATA_WIDTH] WR1_DATA_CMPL;
+
+wire [14:RD_ADDR_WIDTH] RD2_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR2_ADDR_CMPL;
+wire [17:RD_DATA_WIDTH] RD2_DATA_CMPL;
+wire [17:WR_DATA_WIDTH] WR2_DATA_CMPL;
+
+wire [14:0] RD1_ADDR_TOTAL;
+wire [14:0] WR1_ADDR_TOTAL;
+
+wire [14:0] RD2_ADDR_TOTAL;
+wire [14:0] WR2_ADDR_TOTAL;
+
+wire [14:0] RD1_ADDR_SHIFTED;
+wire [14:0] WR1_ADDR_SHIFTED;
+
+wire [14:0] RD2_ADDR_SHIFTED;
+wire [14:0] WR2_ADDR_SHIFTED;
+
+wire [1:0] WR1_BE;
+wire [1:0] WR2_BE;
+
+wire FLUSH1;
+wire FLUSH2;
+
+generate
+ if (WR_ADDR_WIDTH == 15) begin
+ assign WR1_ADDR_TOTAL = WR1_ADDR_i;
+ assign WR2_ADDR_TOTAL = WR2_ADDR_i;
+ end else begin
+ assign WR1_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+ assign WR1_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR1_ADDR_i;
+ assign WR2_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+ assign WR2_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR2_ADDR_i;
+ end
+endgenerate
+
+generate
+ if (RD_ADDR_WIDTH == 15) begin
+ assign RD1_ADDR_TOTAL = RD1_ADDR_i;
+ assign RD2_ADDR_TOTAL = RD2_ADDR_i;
+ end else begin
+ assign RD1_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+ assign RD1_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD1_ADDR_i;
+ assign RD2_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+ assign RD2_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD2_ADDR_i;
+ end
+endgenerate
+
+// Assign parameters
+case (RD_DATA_WIDTH)
+ 1: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ 2: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ 4: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+endcase
+
+// Apply shift
+case (RD_DATA_WIDTH)
+ 1: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL;
+ end
+ 2: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 4;
+ end
+ default: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL;
+ end
+endcase
+
+case (WR_DATA_WIDTH)
+ 1: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL;
+ end
+ 2: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 4;
+ end
+ default: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL;
+ end
+endcase
+
+case (RD_DATA_WIDTH)
+ 1: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL;
+ end
+ 2: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 4;
+ end
+ default: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL;
+ end
+endcase
+
+case (WR_DATA_WIDTH)
+ 1: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL;
+ end
+ 2: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 4;
+ end
+ default: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL;
+ end
+endcase
+
+case (BE1_WIDTH)
+ 2: begin
+ assign WR1_BE = WR1_BE_i[BE1_WIDTH-1 :0];
+ end
+ default: begin
+ assign WR1_BE[1:BE1_WIDTH] = 0;
+ assign WR1_BE[BE1_WIDTH-1 :0] = WR1_BE_i[BE1_WIDTH-1 :0];
+ end
+endcase
+
+case (BE2_WIDTH)
+ 2: begin
+ assign WR2_BE = WR2_BE_i[BE2_WIDTH-1 :0];
+ end
+ default: begin
+ assign WR2_BE[1:BE2_WIDTH] = 0;
+ assign WR2_BE[BE2_WIDTH-1 :0] = WR2_BE_i[BE2_WIDTH-1 :0];
+ end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+// TODO configure per width
+wire [17:0] PORT_B1_RDATA;
+wire [17:0] PORT_B2_RDATA;
+wire [17:0] PORT_A1_WDATA;
+wire [17:0] PORT_A2_WDATA;
+
+generate
+ if (WR_DATA_WIDTH == 18) begin
+ assign PORT_A1_WDATA[WR_DATA_WIDTH-1:0] = WDATA1_i[WR_DATA_WIDTH-1:0];
+ assign PORT_A2_WDATA[WR_DATA_WIDTH-1:0] = WDATA2_i[WR_DATA_WIDTH-1:0];
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign PORT_A1_WDATA = {19'h0, WDATA1_i[8], 8'h0, WDATA1_i[7:0]};
+ assign PORT_A2_WDATA = {19'h0, WDATA2_i[8], 8'h0, WDATA2_i[7:0]};
+ end else begin
+ assign PORT_A1_WDATA[17:WR_DATA_WIDTH] = 0;
+ assign PORT_A1_WDATA[WR_DATA_WIDTH-1:0] = WDATA1_i[WR_DATA_WIDTH-1:0];
+ assign PORT_A2_WDATA[17:WR_DATA_WIDTH] = 0;
+ assign PORT_A2_WDATA[WR_DATA_WIDTH-1:0] = WDATA2_i[WR_DATA_WIDTH-1:0];
+ end
+endgenerate
+
+case (RD_DATA_WIDTH)
+ 9: begin
+ assign RDATA1_o = {PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+ assign RDATA2_o = {PORT_B2_RDATA[16], PORT_B2_RDATA[7:0]};
+ end
+ default: begin
+ assign RDATA1_o = PORT_B1_RDATA[RD_DATA_WIDTH-1:0];
+ assign RDATA2_o = PORT_B2_RDATA[RD_DATA_WIDTH-1:0];
+ end
+endcase
+
+(* is_inferred = 1 *)
+(* is_split = 1 *)
+(* rd_data_width = RD_DATA_WIDTH *)
+(* wr_data_width = WR_DATA_WIDTH *)
+TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+);
+
+endmodule
+
+module BRAM2x18_DP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, CLK3, CLK4, D1ADDR, D1DATA, D1EN, E1ADDR, E1DATA, E1EN, F1ADDR, F1DATA, F1EN, G1ADDR, G1DATA, G1EN, H1ADDR, H1DATA, H1EN);
+ parameter CFG_ABITS = 11;
+ parameter CFG_DBITS = 18;
+ parameter CFG_ENABLE_B = 4;
+ parameter CFG_ENABLE_D = 4;
+ parameter CFG_ENABLE_F = 4;
+ parameter CFG_ENABLE_H = 4;
+
+ parameter CLKPOL2 = 1;
+ parameter CLKPOL3 = 1;
+ parameter [18431:0] INIT0 = 18432'bx;
+ parameter [18431:0] INIT1 = 18432'bx;
+
+ input CLK1;
+ input CLK2;
+ input CLK3;
+ input CLK4;
+
+ input [CFG_ABITS-1:0] A1ADDR;
+ output [CFG_DBITS-1:0] A1DATA;
+ input A1EN;
+
+ input [CFG_ABITS-1:0] B1ADDR;
+ input [CFG_DBITS-1:0] B1DATA;
+ input [CFG_ENABLE_B-1:0] B1EN;
+
+ input [CFG_ABITS-1:0] C1ADDR;
+ output [CFG_DBITS-1:0] C1DATA;
+ input C1EN;
+
+ input [CFG_ABITS-1:0] D1ADDR;
+ input [CFG_DBITS-1:0] D1DATA;
+ input [CFG_ENABLE_D-1:0] D1EN;
+
+ input [CFG_ABITS-1:0] E1ADDR;
+ output [CFG_DBITS-1:0] E1DATA;
+ input E1EN;
+
+ input [CFG_ABITS-1:0] F1ADDR;
+ input [CFG_DBITS-1:0] F1DATA;
+ input [CFG_ENABLE_F-1:0] F1EN;
+
+ input [CFG_ABITS-1:0] G1ADDR;
+ output [CFG_DBITS-1:0] G1DATA;
+ input G1EN;
+
+ input [CFG_ABITS-1:0] H1ADDR;
+ input [CFG_DBITS-1:0] H1DATA;
+ input [CFG_ENABLE_H-1:0] H1EN;
+
+ wire FLUSH1;
+ wire FLUSH2;
+
+ wire [14:0] A1ADDR_TOTAL;
+ wire [14:0] B1ADDR_TOTAL;
+ wire [14:0] C1ADDR_TOTAL;
+ wire [14:0] D1ADDR_TOTAL;
+ wire [14:0] E1ADDR_TOTAL;
+ wire [14:0] F1ADDR_TOTAL;
+ wire [14:0] G1ADDR_TOTAL;
+ wire [14:0] H1ADDR_TOTAL;
+
+ generate
+ if (CFG_ABITS == 15) begin
+ assign A1ADDR_TOTAL = A1ADDR;
+ assign B1ADDR_TOTAL = B1ADDR;
+ assign C1ADDR_TOTAL = C1ADDR;
+ assign D1ADDR_TOTAL = D1ADDR;
+ assign E1ADDR_TOTAL = E1ADDR;
+ assign F1ADDR_TOTAL = F1ADDR;
+ assign G1ADDR_TOTAL = G1ADDR;
+ assign H1ADDR_TOTAL = H1ADDR;
+ end else begin
+ assign A1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign A1ADDR_TOTAL[CFG_ABITS-1:0] = A1ADDR;
+ assign B1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign B1ADDR_TOTAL[CFG_ABITS-1:0] = B1ADDR;
+ assign C1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign C1ADDR_TOTAL[CFG_ABITS-1:0] = C1ADDR;
+ assign D1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign D1ADDR_TOTAL[CFG_ABITS-1:0] = D1ADDR;
+ assign E1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign E1ADDR_TOTAL[CFG_ABITS-1:0] = E1ADDR;
+ assign F1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign F1ADDR_TOTAL[CFG_ABITS-1:0] = F1ADDR;
+ assign G1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign G1ADDR_TOTAL[CFG_ABITS-1:0] = G1ADDR;
+ assign H1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign H1ADDR_TOTAL[CFG_ABITS-1:0] = H1ADDR;
+ end
+ endgenerate
+
+ wire [17:CFG_DBITS] A1_RDATA_CMPL;
+ wire [17:CFG_DBITS] C1_RDATA_CMPL;
+ wire [17:CFG_DBITS] E1_RDATA_CMPL;
+ wire [17:CFG_DBITS] G1_RDATA_CMPL;
+
+ wire [17:CFG_DBITS] B1_WDATA_CMPL = {17-CFG_DBITS{1'b0}};
+ wire [17:CFG_DBITS] D1_WDATA_CMPL = {17-CFG_DBITS{1'b0}};
+ wire [17:CFG_DBITS] F1_WDATA_CMPL = {17-CFG_DBITS{1'b0}};
+ wire [17:CFG_DBITS] H1_WDATA_CMPL = {17-CFG_DBITS{1'b0}};
+
+ wire [14:0] PORT_A1_ADDR;
+ wire [14:0] PORT_A2_ADDR;
+ wire [14:0] PORT_B1_ADDR;
+ wire [14:0] PORT_B2_ADDR;
+
+ case (CFG_DBITS)
+ 1: begin
+ assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+ };
+ end
+
+ 2: begin
+ assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 1) : (B1EN ? (B1ADDR_TOTAL << 1) : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 1) : (D1EN ? (D1ADDR_TOTAL << 1) : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 1) : (F1EN ? (F1ADDR_TOTAL << 1) : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 1) : (H1EN ? (H1ADDR_TOTAL << 1) : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0
+ };
+ end
+
+ 4: begin
+ assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 2) : (B1EN ? (B1ADDR_TOTAL << 2) : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 2) : (D1EN ? (D1ADDR_TOTAL << 2) : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 2) : (F1EN ? (F1ADDR_TOTAL << 2) : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 2) : (H1EN ? (H1ADDR_TOTAL << 2) : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0
+ };
+ end
+
+ 8, 9: begin
+ assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 3) : (B1EN ? (B1ADDR_TOTAL << 3) : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 3) : (D1EN ? (D1ADDR_TOTAL << 3) : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 3) : (F1EN ? (F1ADDR_TOTAL << 3) : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 3) : (H1EN ? (H1ADDR_TOTAL << 3) : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0
+ };
+ end
+
+ 16, 18: begin
+ assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 4) : (B1EN ? (B1ADDR_TOTAL << 4) : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 4) : (D1EN ? (D1ADDR_TOTAL << 4) : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 4) : (F1EN ? (F1ADDR_TOTAL << 4) : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 4) : (H1EN ? (H1ADDR_TOTAL << 4) : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0
+ };
+ end
+
+ default: begin
+ assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0
+ };
+ end
+ endcase
+
+ assign FLUSH1 = 1'b0;
+ assign FLUSH2 = 1'b0;
+
+ wire [17:0] PORT_A1_RDATA;
+ wire [17:0] PORT_B1_RDATA;
+ wire [17:0] PORT_A2_RDATA;
+ wire [17:0] PORT_B2_RDATA;
+
+ wire [17:0] PORT_A1_WDATA;
+ wire [17:0] PORT_B1_WDATA;
+ wire [17:0] PORT_A2_WDATA;
+ wire [17:0] PORT_B2_WDATA;
+
+ // Assign read/write data - handle special case for 9bit mode
+ // parity bit for 9bit mode is placed in R/W port on bit #16
+ case (CFG_DBITS)
+ 9: begin
+ assign A1DATA = {PORT_A1_RDATA[16], PORT_A1_RDATA[7:0]};
+ assign C1DATA = {PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+ assign E1DATA = {PORT_A2_RDATA[16], PORT_A2_RDATA[7:0]};
+ assign G1DATA = {PORT_B2_RDATA[16], PORT_B2_RDATA[7:0]};
+ assign PORT_A1_WDATA = {B1_WDATA_CMPL[17], B1DATA[8], B1_WDATA_CMPL[16:9], B1DATA[7:0]};
+ assign PORT_B1_WDATA = {D1_WDATA_CMPL[17], D1DATA[8], D1_WDATA_CMPL[16:9], D1DATA[7:0]};
+ assign PORT_A2_WDATA = {F1_WDATA_CMPL[17], F1DATA[8], F1_WDATA_CMPL[16:9], F1DATA[7:0]};
+ assign PORT_B2_WDATA = {H1_WDATA_CMPL[17], H1DATA[8], H1_WDATA_CMPL[16:9], H1DATA[7:0]};
+ end
+ default: begin
+ assign A1DATA = PORT_A1_RDATA[CFG_DBITS-1:0];
+ assign C1DATA = PORT_B1_RDATA[CFG_DBITS-1:0];
+ assign E1DATA = PORT_A2_RDATA[CFG_DBITS-1:0];
+ assign G1DATA = PORT_B2_RDATA[CFG_DBITS-1:0];
+ assign PORT_A1_WDATA = {B1_WDATA_CMPL, B1DATA};
+ assign PORT_B1_WDATA = {D1_WDATA_CMPL, D1DATA};
+ assign PORT_A2_WDATA = {F1_WDATA_CMPL, F1DATA};
+ assign PORT_B2_WDATA = {H1_WDATA_CMPL, H1DATA};
+
+ end
+ endcase
+
+ wire PORT_A1_CLK = CLK1;
+ wire PORT_A2_CLK = CLK3;
+ wire PORT_B1_CLK = CLK2;
+ wire PORT_B2_CLK = CLK4;
+
+ wire PORT_A1_REN = A1EN;
+ wire PORT_A1_WEN = B1EN[0];
+ wire [CFG_ENABLE_B-1:0] PORT_A1_BE = {B1EN[1],B1EN[0]};
+
+ wire PORT_A2_REN = E1EN;
+ wire PORT_A2_WEN = F1EN[0];
+ wire [CFG_ENABLE_F-1:0] PORT_A2_BE = {F1EN[1],F1EN[0]};
+
+ wire PORT_B1_REN = C1EN;
+ wire PORT_B1_WEN = D1EN[0];
+ wire [CFG_ENABLE_D-1:0] PORT_B1_BE = {D1EN[1],D1EN[0]};
+
+ wire PORT_B2_REN = G1EN;
+ wire PORT_B2_WEN = H1EN[0];
+ wire [CFG_ENABLE_H-1:0] PORT_B2_BE = {H1EN[1],H1EN[0]};
+
+ (* is_split = 1 *)
+ (* rd_data_width = CFG_DBITS *)
+ (* wr_data_width = CFG_DBITS *)
+ TDP36K _TECHMAP_REPLACE_ (
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(PORT_A1_RDATA),
+ .ADDR_A1_i(PORT_A1_ADDR),
+ .CLK_A1_i(PORT_A1_CLK),
+ .REN_A1_i(PORT_A1_REN),
+ .WEN_A1_i(PORT_A1_WEN),
+ .BE_A1_i(PORT_A1_BE),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(PORT_A2_RDATA),
+ .ADDR_A2_i(PORT_A2_ADDR),
+ .CLK_A2_i(PORT_A2_CLK),
+ .REN_A2_i(PORT_A2_REN),
+ .WEN_A2_i(PORT_A2_WEN),
+ .BE_A2_i(PORT_A2_BE),
+
+ .WDATA_B1_i(PORT_B1_WDATA),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(PORT_B1_ADDR),
+ .CLK_B1_i(PORT_B1_CLK),
+ .REN_B1_i(PORT_B1_REN),
+ .WEN_B1_i(PORT_B1_WEN),
+ .BE_B1_i(PORT_B1_BE),
+
+ .WDATA_B2_i(PORT_B2_WDATA),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(PORT_B2_ADDR),
+ .CLK_B2_i(PORT_B2_CLK),
+ .REN_B2_i(PORT_B2_REN),
+ .WEN_B2_i(PORT_B2_WEN),
+ .BE_B2_i(PORT_B2_BE),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+endmodule
diff --git a/ql-qlf-plugin/qlf_k6n10f/brams_map.v b/ql-qlf-plugin/qlf_k6n10f/brams_map.v
index d510848..1c97e8f 100644
--- a/ql-qlf-plugin/qlf_k6n10f/brams_map.v
+++ b/ql-qlf-plugin/qlf_k6n10f/brams_map.v
@@ -244,7 +244,7 @@
.CFG_ENABLE_D(CFG_ENABLE_D),
.CLKPOL2(CLKPOL2),
.CLKPOL3(CLKPOL3),
- .INIT0(INIT),
+ .INIT0(INIT)
) _TECHMAP_REPLACE_ (
.A1ADDR(A1ADDR),
.A1DATA(A1DATA),
@@ -307,7 +307,7 @@
.CFG_ENABLE_B(CFG_ENABLE_B),
.CLKPOL2(CLKPOL2),
.CLKPOL3(CLKPOL3),
- .INIT0(INIT),
+ .INIT0(INIT)
) _TECHMAP_REPLACE_ (
.A1ADDR(A1ADDR),
.A1DATA(A1DATA),
@@ -542,7 +542,7 @@
input RD_SRST;
input [RD_ADDR_WIDTH-1:0] RD_ADDR;
- output [RD_DATA_WIDTH-1:0] RD_DATA;
+ output reg [RD_DATA_WIDTH-1:0] RD_DATA;
input RD_EN;
input [WR_ADDR_WIDTH-1:0] WR_ADDR;
@@ -551,7 +551,7 @@
wire [14:RD_ADDR_WIDTH] RD_ADDR_CMPL;
wire [14:WR_ADDR_WIDTH] WR_ADDR_CMPL;
- wire [35:RD_DATA_WIDTH] RD_DATA_CMPL;
+ reg [35:RD_DATA_WIDTH] RD_DATA_CMPL;
wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
wire [14:0] RD_ADDR_TOTAL;
@@ -1019,3 +1019,1522 @@
);
endmodule
+module SFIFO_36K_BLK (
+ DIN,
+ PUSH,
+ POP,
+ CLK,
+ Async_Flush,
+ Overrun_Error,
+ Full_Watermark,
+ Almost_Full,
+ Full,
+ Underrun_Error,
+ Empty_Watermark,
+ Almost_Empty,
+ Empty,
+ DOUT
+);
+
+ parameter WR_DATA_WIDTH = 36;
+ parameter RD_DATA_WIDTH = 36;
+ parameter UPAE_DBITS = 12'd10;
+ parameter UPAF_DBITS = 12'd10;
+
+ input wire CLK;
+ input wire PUSH, POP;
+ input wire [WR_DATA_WIDTH-1:0] DIN;
+ input wire Async_Flush;
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
+ output wire Almost_Full, Almost_Empty;
+ output wire Full, Empty;
+ output wire Full_Watermark, Empty_Watermark;
+ output wire Overrun_Error, Underrun_Error;
+
+ wire [35:0] in_reg;
+ wire [35:0] out_reg;
+ wire [17:0] fifo_flags;
+
+ wire [35:0] RD_DATA_CMPL;
+ wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+
+ wire Push_Clk, Pop_Clk;
+
+ assign Push_Clk = CLK;
+ assign Pop_Clk = CLK;
+
+ assign Overrun_Error = fifo_flags[0];
+ assign Full_Watermark = fifo_flags[1];
+ assign Almost_Full = fifo_flags[2];
+ assign Full = fifo_flags[3];
+ assign Underrun_Error = fifo_flags[4];
+ assign Empty_Watermark = fifo_flags[5];
+ assign Almost_Empty = fifo_flags[6];
+ assign Empty = fifo_flags[7];
+
+ generate
+ if (WR_DATA_WIDTH == 36) begin
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+ end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+ assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16];
+ assign in_reg[17:0] = {2'b00,DIN[15:0]};
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]};
+ end else begin
+ assign in_reg[35:WR_DATA_WIDTH] = 0;
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+ generate
+ if (RD_DATA_WIDTH == 36) begin
+ assign RD_DATA_CMPL = out_reg;
+ end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+ assign RD_DATA_CMPL = {2'b00,out_reg[35:18],out_reg[15:0]};
+ end else if (RD_DATA_WIDTH == 9) begin
+ assign RD_DATA_CMPL = { 27'h0, out_reg[16], out_reg[7:0]};
+ end else begin
+ assign RD_DATA_CMPL = {18'h0, out_reg[17:0]};
+ end
+ endgenerate
+
+ case (RD_DATA_WIDTH)
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b1
+ };
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'b1
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+ };
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b1
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+ };
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'b1
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+ };
+ end
+ endcase
+ end
+ 32, 36: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'b1
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'b1
+ };
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1
+ };
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b1
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b1
+ };
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b1
+ };
+ end
+ endcase
+ end
+ endcase
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_CMPL[RD_DATA_WIDTH-1 : 0];
+
+endmodule
+
+module AFIFO_36K_BLK (
+ DIN,
+ PUSH,
+ POP,
+ Push_Clk,
+ Pop_Clk,
+ Async_Flush,
+ Overrun_Error,
+ Full_Watermark,
+ Almost_Full,
+ Full,
+ Underrun_Error,
+ Empty_Watermark,
+ Almost_Empty,
+ Empty,
+ DOUT
+);
+
+ parameter WR_DATA_WIDTH = 36;
+ parameter RD_DATA_WIDTH = 36;
+ parameter UPAE_DBITS = 12'd10;
+ parameter UPAF_DBITS = 12'd10;
+
+ input wire Push_Clk, Pop_Clk;
+ input wire PUSH, POP;
+ input wire [WR_DATA_WIDTH-1:0] DIN;
+ input wire Async_Flush;
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
+ output wire Almost_Full, Almost_Empty;
+ output wire Full, Empty;
+ output wire Full_Watermark, Empty_Watermark;
+ output wire Overrun_Error, Underrun_Error;
+
+ wire [35:0] in_reg;
+ wire [35:0] out_reg;
+ wire [17:0] fifo_flags;
+
+ wire [35:0] RD_DATA_CMPL;
+ wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+
+ assign Overrun_Error = fifo_flags[0];
+ assign Full_Watermark = fifo_flags[1];
+ assign Almost_Full = fifo_flags[2];
+ assign Full = fifo_flags[3];
+ assign Underrun_Error = fifo_flags[4];
+ assign Empty_Watermark = fifo_flags[5];
+ assign Almost_Empty = fifo_flags[6];
+ assign Empty = fifo_flags[7];
+
+ generate
+ if (WR_DATA_WIDTH == 36) begin
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+ end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+ assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16];
+ assign in_reg[17:0] = {2'b00,DIN[15:0]};
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]};
+ end else begin
+ assign in_reg[35:WR_DATA_WIDTH] = 0;
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+ generate
+ if (RD_DATA_WIDTH == 36) begin
+ assign RD_DATA_CMPL = out_reg;
+ end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+ assign RD_DATA_CMPL = {2'b00,out_reg[35:18],out_reg[15:0]};
+ end else if (RD_DATA_WIDTH == 9) begin
+ assign RD_DATA_CMPL = { 27'h0, out_reg[16], out_reg[7:0]};
+ end else begin
+ assign RD_DATA_CMPL = {18'h0, out_reg[17:0]};
+ end
+ endgenerate
+
+ case (RD_DATA_WIDTH)
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'b0
+ };
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'b0
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+ };
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'b0
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+ };
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'b0
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+ };
+ end
+ endcase
+ end
+ 32, 36: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'b0
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'b0
+ };
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0
+ };
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'b0
+ };
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'b0
+ };
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0
+ };
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'b0
+ };
+ end
+ endcase
+ end
+ endcase
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_CMPL[RD_DATA_WIDTH-1 : 0];
+
+endmodule
+
+module SFIFO_18K_BLK (
+ DIN,
+ PUSH,
+ POP,
+ CLK,
+ Async_Flush,
+ Overrun_Error,
+ Full_Watermark,
+ Almost_Full,
+ Full,
+ Underrun_Error,
+ Empty_Watermark,
+ Almost_Empty,
+ Empty,
+ DOUT
+);
+
+ parameter WR_DATA_WIDTH = 18;
+ parameter RD_DATA_WIDTH = 18;
+ parameter UPAE_DBITS = 11'd10;
+ parameter UPAF_DBITS = 11'd10;
+
+ input wire CLK;
+ input wire PUSH, POP;
+ input wire [WR_DATA_WIDTH-1:0] DIN;
+ input wire Async_Flush;
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
+ output wire Almost_Full, Almost_Empty;
+ output wire Full, Empty;
+ output wire Full_Watermark, Empty_Watermark;
+ output wire Overrun_Error, Underrun_Error;
+
+ BRAM2x18_SFIFO #(
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .UPAE_DBITS1(UPAE_DBITS),
+ .UPAF_DBITS1(UPAF_DBITS),
+ .UPAE_DBITS2(),
+ .UPAF_DBITS2()
+ ) U1
+ (
+ .DIN1(DIN),
+ .PUSH1(PUSH),
+ .POP1(POP),
+ .CLK1(CLK),
+ .Async_Flush1(Async_Flush),
+ .Overrun_Error1(Overrun_Error),
+ .Full_Watermark1(Full_Watermark),
+ .Almost_Full1(Almost_Full),
+ .Full1(Full),
+ .Underrun_Error1(Underrun_Error),
+ .Empty_Watermark1(Empty_Watermark),
+ .Almost_Empty1(Almost_Empty),
+ .Empty1(Empty),
+ .DOUT1(DOUT),
+
+ .DIN2(),
+ .PUSH2(),
+ .POP2(),
+ .CLK2(),
+ .Async_Flush2(),
+ .Overrun_Error2(),
+ .Full_Watermark2(),
+ .Almost_Full2(),
+ .Full2(),
+ .Underrun_Error2(),
+ .Empty_Watermark2(),
+ .Almost_Empty2(),
+ .Empty2(),
+ .DOUT2()
+ );
+
+endmodule
+
+module AFIFO_18K_BLK (
+ DIN,
+ PUSH,
+ POP,
+ Push_Clk,
+ Pop_Clk,
+ Async_Flush,
+ Overrun_Error,
+ Full_Watermark,
+ Almost_Full,
+ Full,
+ Underrun_Error,
+ Empty_Watermark,
+ Almost_Empty,
+ Empty,
+ DOUT
+);
+
+ parameter WR_DATA_WIDTH = 18;
+ parameter RD_DATA_WIDTH = 18;
+ parameter UPAE_DBITS = 11'd10;
+ parameter UPAF_DBITS = 11'd10;
+
+ input wire Push_Clk, Pop_Clk;
+ input wire PUSH, POP;
+ input wire [WR_DATA_WIDTH-1:0] DIN;
+ input wire Async_Flush;
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
+ output wire Almost_Full, Almost_Empty;
+ output wire Full, Empty;
+ output wire Full_Watermark, Empty_Watermark;
+ output wire Overrun_Error, Underrun_Error;
+
+ BRAM2x18_AFIFO #(
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .UPAE_DBITS1(UPAE_DBITS),
+ .UPAF_DBITS1(UPAF_DBITS),
+ .UPAE_DBITS2(),
+ .UPAF_DBITS2()
+ ) U1
+ (
+ .DIN1(DIN),
+ .PUSH1(PUSH),
+ .POP1(POP),
+ .Push_Clk1(Push_Clk),
+ .Pop_Clk1(Pop_Clk),
+ .Async_Flush1(Async_Flush),
+ .Overrun_Error1(Overrun_Error),
+ .Full_Watermark1(Full_Watermark),
+ .Almost_Full1(Almost_Full),
+ .Full1(Full),
+ .Underrun_Error1(Underrun_Error),
+ .Empty_Watermark1(Empty_Watermark),
+ .Almost_Empty1(Almost_Empty),
+ .Empty1(Empty),
+ .DOUT1(DOUT),
+
+ .DIN2(),
+ .PUSH2(),
+ .POP2(),
+ .Push_Clk2(),
+ .Pop_Clk2(),
+ .Async_Flush2(),
+ .Overrun_Error2(),
+ .Full_Watermark2(),
+ .Almost_Full2(),
+ .Full2(),
+ .Underrun_Error2(),
+ .Empty_Watermark2(),
+ .Almost_Empty2(),
+ .Empty2(),
+ .DOUT2()
+ );
+
+endmodule
+
+module RAM_36K_BLK (
+ WEN_i,
+ REN_i,
+ WR_CLK_i,
+ RD_CLK_i,
+ WR_BE_i,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 36;
+parameter BE_WIDTH = 4;
+
+input wire WEN_i;
+input wire REN_i;
+input wire WR_CLK_i;
+input wire RD_CLK_i;
+input wire [BE_WIDTH-1:0] WR_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+wire [14:RD_ADDR_WIDTH] RD_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR_ADDR_CMPL;
+wire [35:0] RD_DATA_CMPL;
+wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+
+wire [14:0] RD_ADDR_TOTAL;
+wire [14:0] WR_ADDR_TOTAL;
+
+wire [14:0] RD_ADDR_SHIFTED;
+wire [14:0] WR_ADDR_SHIFTED;
+
+wire [3:0] WR_BE;
+
+wire FLUSH1;
+wire FLUSH2;
+
+generate
+ if (WR_ADDR_WIDTH == 15) begin
+ assign WR_ADDR_TOTAL = WR_ADDR_i;
+ end else begin
+ assign WR_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+ assign WR_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR_ADDR_i;
+ end
+endgenerate
+
+generate
+ if (RD_ADDR_WIDTH == 15) begin
+ assign RD_ADDR_TOTAL = RD_ADDR_i;
+ end else begin
+ assign RD_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+ assign RD_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD_ADDR_i;
+ end
+endgenerate
+
+// Assign parameters
+case (RD_DATA_WIDTH)
+ 1: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0
+ };
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ 2: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_4, `MODE_2, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_9, `MODE_2, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_18, `MODE_2, `MODE_18, 1'd0
+ };
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_36, `MODE_2, `MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_36, `MODE_2, `MODE_36, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_1, `MODE_2, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ 4: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_2, `MODE_4, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_9, `MODE_4, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_18, `MODE_4, `MODE_18, 1'd0
+ };
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_36, `MODE_4, `MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_36, `MODE_4, `MODE_36, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_1, `MODE_4, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_2, `MODE_9, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_4, `MODE_9, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_18, `MODE_9, `MODE_18, 1'd0
+ };
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_36, `MODE_9, `MODE_36, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_1, `MODE_9, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_2, `MODE_18, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_4, `MODE_18, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_9, `MODE_18, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0
+ };
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_36, `MODE_18, `MODE_36, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_1, `MODE_18, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ 32, 36: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_2, `MODE_36, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_2, `MODE_36, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_4, `MODE_36, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_4, `MODE_36, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_9, `MODE_36, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_18, `MODE_36, `MODE_18, 1'd0
+ };
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_1, `MODE_36, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+ };
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_2, `MODE_1, `MODE_2, 1'd0
+ };
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_4, `MODE_1, `MODE_4, 1'd0
+ };
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_9, `MODE_1, `MODE_9, 1'd0
+ };
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_18, `MODE_1, `MODE_18, 1'd0
+ };
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_36, `MODE_1, `MODE_36, 1'd0
+ };
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+ };
+ end
+ endcase
+ end
+endcase
+
+// Apply shift
+case (RD_DATA_WIDTH)
+ 1: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL;
+ end
+ 2: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 4;
+ end
+ 32, 36: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 5;
+ end
+ default: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL;
+ end
+endcase
+
+case (WR_DATA_WIDTH)
+ 1: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL;
+ end
+ 2: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 4;
+ end
+ 32, 36: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 5;
+ end
+ default: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL;
+ end
+endcase
+
+case (BE_WIDTH)
+ 4: begin
+ assign WR_BE = WR_BE_i[BE_WIDTH-1 :0];
+ end
+ default: begin
+ assign WR_BE[3:BE_WIDTH] = 0;
+ assign WR_BE[BE_WIDTH-1 :0] = WR_BE_i[BE_WIDTH-1 :0];
+ end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+// TODO configure per width
+wire [17:0] PORT_B1_RDATA;
+wire [17:0] PORT_B2_RDATA;
+wire [35:0] PORT_A_WDATA;
+
+generate
+ if (WR_DATA_WIDTH == 36) begin
+ assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0];
+ end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+ assign PORT_A_WDATA[WR_DATA_WIDTH+1:18] = WDATA_i[WR_DATA_WIDTH-1:16];
+ assign PORT_A_WDATA[17:0] = {2'b00,WDATA_i[15:0]};
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign PORT_A_WDATA = {19'h0, WDATA_i[8], 8'h0, WDATA_i[7:0]};
+ end else begin
+ assign PORT_A_WDATA[35:WR_DATA_WIDTH] = 0;
+ assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0];
+ end
+endgenerate
+
+generate
+ if (RD_DATA_WIDTH == 36) begin
+ assign RD_DATA_CMPL = {PORT_B2_RDATA, PORT_B1_RDATA};
+ end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+ assign RD_DATA_CMPL = {2'b00,PORT_B2_RDATA[17:0],PORT_B1_RDATA[15:0]};
+ end else if (RD_DATA_WIDTH == 9) begin
+ assign RD_DATA_CMPL = { 27'h0, PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+ end else begin
+ assign RD_DATA_CMPL = {18'h0, PORT_B1_RDATA};
+ end
+endgenerate
+
+assign RDATA_o = RD_DATA_CMPL[RD_DATA_WIDTH-1:0];
+
+(* is_inferred = 1 *)
+(* rd_data_width = RD_DATA_WIDTH *)
+(* wr_data_width = WR_DATA_WIDTH *)
+TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+);
+
+endmodule
+
+module RAM_18K_BLK (
+ WEN_i,
+ REN_i,
+ WR_CLK_i,
+ RD_CLK_i,
+ WR_BE_i,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire WR_CLK_i;
+input wire RD_CLK_i;
+input wire [BE_WIDTH-1:0] WR_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+ BRAM2x18_SP #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE1_WIDTH(BE_WIDTH),
+ .BE2_WIDTH()
+ ) U1
+ (
+ .RESET_ni(1'b1),
+
+ .WEN1_i(WEN_i),
+ .REN1_i(REN_i),
+ .WR1_CLK_i(WR_CLK_i),
+ .RD1_CLK_i(RD_CLK_i),
+ .WR1_BE_i(WR_BE_i),
+ .WR1_ADDR_i(WR_ADDR_i),
+ .RD1_ADDR_i(RD_ADDR_i),
+ .WDATA1_i(WDATA_i),
+ .RDATA1_o(RDATA_o),
+
+ .WEN2_i(),
+ .REN2_i(),
+ .WR2_CLK_i(),
+ .RD2_CLK_i(),
+ .WR2_BE_i(),
+ .WR2_ADDR_i(),
+ .RD2_ADDR_i(),
+ .WDATA2_i(),
+ .RDATA2_o()
+ );
+
+endmodule
+
+module DPRAM_36K_BLK (
+ CLK1_i,
+ WEN1_i,
+ WR1_BE_i,
+ REN1_i,
+ WR1_ADDR_i,
+ RD1_ADDR_i,
+ WDATA1_i,
+ RDATA1_o,
+
+ CLK2_i,
+ WEN2_i,
+ WR2_BE_i,
+ REN2_i,
+ WR2_ADDR_i,
+ RD2_ADDR_i,
+ WDATA2_i,
+ RDATA2_o
+);
+
+parameter ADDR_WIDTH = 10;
+parameter DATA_WIDTH = 36;
+parameter BE1_WIDTH = 4;
+parameter BE2_WIDTH = 4;
+
+input wire CLK1_i;
+input wire WEN1_i;
+input wire [BE1_WIDTH-1 :0] WR1_BE_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire CLK2_i;
+input wire WEN2_i;
+input wire [BE2_WIDTH-1 :0] WR2_BE_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+wire FLUSH1;
+wire FLUSH2;
+
+wire [14:0] A1ADDR_TOTAL;
+wire [14:0] B1ADDR_TOTAL;
+wire [14:0] C1ADDR_TOTAL;
+wire [14:0] D1ADDR_TOTAL;
+
+generate
+ if (ADDR_WIDTH == 15) begin
+ assign A1ADDR_TOTAL = RD1_ADDR_i;
+ assign B1ADDR_TOTAL = WR1_ADDR_i;
+ assign C1ADDR_TOTAL = RD2_ADDR_i;
+ assign D1ADDR_TOTAL = WR2_ADDR_i;
+ end else begin
+ assign A1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+ assign A1ADDR_TOTAL[ADDR_WIDTH-1:0] = RD1_ADDR_i;
+ assign B1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+ assign B1ADDR_TOTAL[ADDR_WIDTH-1:0] = WR1_ADDR_i;
+ assign C1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+ assign C1ADDR_TOTAL[ADDR_WIDTH-1:0] = RD2_ADDR_i;
+ assign D1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+ assign D1ADDR_TOTAL[ADDR_WIDTH-1:0] = WR2_ADDR_i;
+ end
+endgenerate
+
+wire [35:DATA_WIDTH] A1DATA_CMPL;
+wire [35:DATA_WIDTH] B1DATA_CMPL;
+wire [35:DATA_WIDTH] C1DATA_CMPL;
+wire [35:DATA_WIDTH] D1DATA_CMPL;
+
+wire [35:0] A1DATA_TOTAL;
+wire [35:0] B1DATA_TOTAL;
+wire [35:0] C1DATA_TOTAL;
+wire [35:0] D1DATA_TOTAL;
+
+wire [14:0] PORT_A_ADDR;
+wire [14:0] PORT_B_ADDR;
+
+wire [3:0] WR1_BE;
+wire [3:0] WR2_BE;
+
+generate
+ if (BE1_WIDTH == 4) begin
+ assign WR1_BE = WR1_BE_i;
+ end else begin
+ assign WR1_BE[3:BE1_WIDTH] = 0;
+ assign WR1_BE[BE1_WIDTH-1:0] = WR1_BE_i[BE1_WIDTH-1:0];
+ end
+endgenerate
+
+generate
+ if (BE2_WIDTH == 4) begin
+ assign WR2_BE = WR2_BE_i;
+ end else begin
+ assign WR2_BE[3:BE2_WIDTH] = 0;
+ assign WR2_BE[BE2_WIDTH-1:0] = WR2_BE_i[BE2_WIDTH-1:0];
+ end
+endgenerate
+
+// Assign read/write data - handle special case for 9bit mode
+// parity bit for 9bit mode is placed in R/W port on bit #16
+case (DATA_WIDTH)
+ 9: begin
+ assign RDATA1_o = {A1DATA_TOTAL[16], A1DATA_TOTAL[7:0]};
+ assign RDATA2_o = {C1DATA_TOTAL[16], C1DATA_TOTAL[7:0]};
+ assign B1DATA_TOTAL = {B1DATA_CMPL[35:17], WDATA1_i[8], B1DATA_CMPL[16:9], WDATA1_i[7:0]};
+ assign D1DATA_TOTAL = {D1DATA_CMPL[35:17], WDATA2_i[8], D1DATA_CMPL[16:9], WDATA2_i[7:0]};
+ end
+ default: begin
+ assign RDATA1_o = A1DATA_TOTAL[DATA_WIDTH-1:0];
+ assign RDATA2_o = C1DATA_TOTAL[DATA_WIDTH-1:0];
+ assign B1DATA_TOTAL = {B1DATA_CMPL, WDATA1_i};
+ assign D1DATA_TOTAL = {D1DATA_CMPL, WDATA2_i};
+ end
+endcase
+
+case (DATA_WIDTH)
+ 1: begin
+ assign PORT_A_ADDR = REN1_i ? A1ADDR_TOTAL : (WEN1_i ? B1ADDR_TOTAL : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? C1ADDR_TOTAL : (WEN2_i ? D1ADDR_TOTAL : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_1, `MODE_1, `MODE_1, `MODE_1, 1'd0
+ };
+ end
+
+ 2: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 1) : (WEN1_i ? (B1ADDR_TOTAL << 1) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 1) : (WEN2_i ? (D1ADDR_TOTAL << 1) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_2, `MODE_2, `MODE_2, `MODE_2, 1'd0
+ };
+ end
+
+ 4: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 2) : (WEN1_i ? (B1ADDR_TOTAL << 2) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 2) : (WEN2_i ? (D1ADDR_TOTAL << 2) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_4, `MODE_4, `MODE_4, `MODE_4, 1'd0
+ };
+ end
+
+ 8, 9: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 3) : (WEN1_i ? (B1ADDR_TOTAL << 3) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 3) : (WEN2_i ? (D1ADDR_TOTAL << 3) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_9, `MODE_9, `MODE_9, `MODE_9, 1'd0
+ };
+ end
+
+ 16, 18: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 4) : (WEN1_i ? (B1ADDR_TOTAL << 4) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 4) : (WEN2_i ? (D1ADDR_TOTAL << 4) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_18, `MODE_18, `MODE_18, `MODE_18, 1'd0
+ };
+ end
+
+ 32, 36: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 5) : (WEN1_i ? (B1ADDR_TOTAL << 5) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 5) : (WEN2_i ? (D1ADDR_TOTAL << 5) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0
+ };
+ end
+ default: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 5) : (WEN1_i ? (B1ADDR_TOTAL << 5) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 5) : (WEN2_i ? (D1ADDR_TOTAL << 5) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, `MODE_36, `MODE_36, `MODE_36, `MODE_36, 1'd0
+ };
+ end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+(* is_inferred = 1 *)
+(* rd_data_width = DATA_WIDTH *)
+(* wr_data_width = DATA_WIDTH *)
+TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+ .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+ .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+ .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+ .ADDR_A1_i(PORT_A_ADDR),
+ .ADDR_A2_i(PORT_A_ADDR),
+ .CLK_A1_i(CLK1_i),
+ .CLK_A2_i(CLK1_i),
+ .REN_A1_i(REN1_i),
+ .REN_A2_i(REN1_i),
+ .WEN_A1_i(WEN1_i),
+ .WEN_A2_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+ .BE_A2_i(WR1_BE[3:0]),
+
+ .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+ .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+ .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+ .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+ .ADDR_B1_i(PORT_B_ADDR),
+ .ADDR_B2_i(PORT_B_ADDR),
+ .CLK_B1_i(CLK2_i),
+ .CLK_B2_i(CLK2_i),
+ .REN_B1_i(REN2_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B1_i(WEN2_i),
+ .WEN_B2_i(WEN2_i),
+ .BE_B1_i(WR2_BE[1:0]),
+ .BE_B2_i(WR2_BE[3:0]),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+);
+endmodule
+
+module DPRAM_18K_BLK (
+ CLK1_i,
+ WEN1_i,
+ REN1_i,
+ WR1_ADDR_i,
+ RD1_ADDR_i,
+ WDATA1_i,
+ RDATA1_o,
+
+ CLK2_i,
+ WEN2_i,
+ REN2_i,
+ WR2_ADDR_i,
+ RD2_ADDR_i,
+ WDATA2_i,
+ RDATA2_o
+);
+
+parameter ADDR_WIDTH = 10;
+parameter DATA_WIDTH = 18;
+parameter BE1_WIDTH = 2;
+parameter BE2_WIDTH = 2;
+
+input wire CLK1_i;
+input wire WEN1_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire CLK2_i;
+input wire WEN2_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+(* is_inferred = 1 *)
+BRAM2x18_DP #(
+ .CFG_ABITS(ADDR_WIDTH),
+ .CFG_DBITS(DATA_WIDTH),
+ .CFG_ENABLE_B(BE1_WIDTH),
+ .CFG_ENABLE_D(BE2_WIDTH)
+) bram2x18_inst (
+ .A1ADDR(RD1_ADDR_i),
+ .A1DATA(RDATA1_o),
+ .A1EN(REN1_i),
+ .B1ADDR(WR1_ADDR_i),
+ .B1DATA(WDATA1_i),
+ .B1EN({WEN1_i,WEN1_i}),
+ .CLK1(CLK1_i),
+
+ .C1ADDR(RD2_ADDR_i),
+ .C1DATA(RDATA2_o),
+ .C1EN(REN2_i),
+ .D1ADDR(WR2_ADDR_i),
+ .D1DATA(WDATA2_i),
+ .D1EN({WEN2_i,WEN2_i}),
+ .CLK2(CLK2_i),
+
+ .E1ADDR(),
+ .E1DATA(),
+ .E1EN(),
+ .F1ADDR(),
+ .F1DATA(),
+ .F1EN(),
+ .CLK3(),
+
+ .G1ADDR(),
+ .G1DATA(),
+ .G1EN(),
+ .H1ADDR(),
+ .H1DATA(),
+ .H1EN(),
+ .CLK4()
+);
+endmodule
+
diff --git a/ql-qlf-plugin/qlf_k6n10f/brams_sim.v b/ql-qlf-plugin/qlf_k6n10f/brams_sim.v
index c718966..c4ad3a7 100644
--- a/ql-qlf-plugin/qlf_k6n10f/brams_sim.v
+++ b/ql-qlf-plugin/qlf_k6n10f/brams_sim.v
@@ -13,6 +13,7 @@
// limitations under the License.
//
// SPDX-License-Identifier: Apache-2.0
+`timescale 1ns /10ps
`default_nettype none
@@ -1270,12 +1271,12 @@
parameter WR_PRIORITY_MASK = 0;
parameter WR_WIDE_CONTINUATION = 0;
- localparam MODE_36 = 3'b111; // 36 or 32-bit
- localparam MODE_18 = 3'b110; // 18 or 16-bit
- localparam MODE_9 = 3'b101; // 9 or 8-bit
- localparam MODE_4 = 3'b100; // 4-bit
- localparam MODE_2 = 3'b010; // 32-bit
- localparam MODE_1 = 3'b001; // 32-bit
+ localparam MODE_36 = 3'b011; // 36- or 32-bit
+ localparam MODE_18 = 3'b010; // 18- or 16-bit
+ localparam MODE_9 = 3'b001; // 9- or 8-bit
+ localparam MODE_4 = 3'b100; // 4-bit
+ localparam MODE_2 = 3'b110; // 2-bit
+ localparam MODE_1 = 3'b101; // 1-bit
input wire RD_CLK;
input wire WR_CLK;
@@ -1419,6 +1420,5601 @@
);
endmodule
+module BRAM2x18_SP (
+ RESET_ni,
+
+ WEN1_i,
+ REN1_i,
+ WR1_CLK_i,
+ RD1_CLK_i,
+ WR1_BE_i,
+ WR1_ADDR_i,
+ RD1_ADDR_i,
+ WDATA1_i,
+ RDATA1_o,
+
+ WEN2_i,
+ REN2_i,
+ WR2_CLK_i,
+ RD2_CLK_i,
+ WR2_BE_i,
+ WR2_ADDR_i,
+ RD2_ADDR_i,
+ WDATA2_i,
+ RDATA2_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter BE1_WIDTH = 2;
+parameter BE2_WIDTH = 2;
+
+localparam MODE_36 = 3'b011; // 36- or 32-bit
+localparam MODE_18 = 3'b010; // 18- or 16-bit
+localparam MODE_9 = 3'b001; // 9- or 8-bit
+localparam MODE_4 = 3'b100; // 4-bit
+localparam MODE_2 = 3'b110; // 2-bit
+localparam MODE_1 = 3'b101; // 1-bit
+
+input wire RESET_ni;
+
+input wire WEN1_i;
+input wire REN1_i;
+input wire WR1_CLK_i;
+input wire RD1_CLK_i;
+input wire [BE1_WIDTH-1:0] WR1_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA1_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire WEN2_i;
+input wire REN2_i;
+input wire WR2_CLK_i;
+input wire RD2_CLK_i;
+input wire [BE2_WIDTH-1:0] WR2_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA2_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA2_o;
+
+//localparam READ_DATA_BITS_TO_SKIP = 18 - RD_DATA_WIDTH;
+
+wire [14:RD_ADDR_WIDTH] RD1_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR1_ADDR_CMPL;
+wire [17:RD_DATA_WIDTH] RD1_DATA_CMPL;
+wire [17:WR_DATA_WIDTH] WR1_DATA_CMPL;
+
+wire [14:RD_ADDR_WIDTH] RD2_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR2_ADDR_CMPL;
+wire [17:RD_DATA_WIDTH] RD2_DATA_CMPL;
+wire [17:WR_DATA_WIDTH] WR2_DATA_CMPL;
+
+wire [14:0] RD1_ADDR_TOTAL;
+wire [14:0] WR1_ADDR_TOTAL;
+
+wire [14:0] RD2_ADDR_TOTAL;
+wire [14:0] WR2_ADDR_TOTAL;
+
+wire [14:0] RD1_ADDR_SHIFTED;
+wire [14:0] WR1_ADDR_SHIFTED;
+
+wire [14:0] RD2_ADDR_SHIFTED;
+wire [14:0] WR2_ADDR_SHIFTED;
+
+wire [1:0] WR1_BE;
+wire [1:0] WR2_BE;
+
+wire FLUSH1;
+wire FLUSH2;
+
+generate
+ if (WR_ADDR_WIDTH == 15) begin
+ assign WR1_ADDR_TOTAL = WR1_ADDR_i;
+ assign WR2_ADDR_TOTAL = WR2_ADDR_i;
+ end else begin
+ assign WR1_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+ assign WR1_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR1_ADDR_i;
+ assign WR2_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+ assign WR2_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR2_ADDR_i;
+ end
+endgenerate
+
+generate
+ if (RD_ADDR_WIDTH == 15) begin
+ assign RD1_ADDR_TOTAL = RD1_ADDR_i;
+ assign RD2_ADDR_TOTAL = RD2_ADDR_i;
+ end else begin
+ assign RD1_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+ assign RD1_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD1_ADDR_i;
+ assign RD2_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+ assign RD2_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD2_ADDR_i;
+ end
+endgenerate
+
+// Apply shift
+case (RD_DATA_WIDTH)
+ 1: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL;
+ end
+ 2: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL << 4;
+ end
+ default: begin
+ assign RD1_ADDR_SHIFTED = RD1_ADDR_TOTAL;
+ end
+endcase
+
+case (WR_DATA_WIDTH)
+ 1: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL;
+ end
+ 2: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL << 4;
+ end
+ default: begin
+ assign WR1_ADDR_SHIFTED = WR1_ADDR_TOTAL;
+ end
+endcase
+
+case (RD_DATA_WIDTH)
+ 1: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL;
+ end
+ 2: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL << 4;
+ end
+ default: begin
+ assign RD2_ADDR_SHIFTED = RD2_ADDR_TOTAL;
+ end
+endcase
+
+case (WR_DATA_WIDTH)
+ 1: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL;
+ end
+ 2: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL << 4;
+ end
+ default: begin
+ assign WR2_ADDR_SHIFTED = WR2_ADDR_TOTAL;
+ end
+endcase
+
+case (BE1_WIDTH)
+ 2: begin
+ assign WR1_BE = WR1_BE_i[BE1_WIDTH-1 :0];
+ end
+ default: begin
+ assign WR1_BE[1:BE1_WIDTH] = 0;
+ assign WR1_BE[BE1_WIDTH-1 :0] = WR1_BE_i[BE1_WIDTH-1 :0];
+ end
+endcase
+
+case (BE2_WIDTH)
+ 2: begin
+ assign WR2_BE = WR2_BE_i[BE2_WIDTH-1 :0];
+ end
+ default: begin
+ assign WR2_BE[1:BE2_WIDTH] = 0;
+ assign WR2_BE[BE2_WIDTH-1 :0] = WR2_BE_i[BE2_WIDTH-1 :0];
+ end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+// TODO configure per width
+wire [17:0] PORT_B1_RDATA;
+wire [17:0] PORT_B2_RDATA;
+wire [17:0] PORT_A1_WDATA;
+wire [17:0] PORT_A2_WDATA;
+
+generate
+ if (WR_DATA_WIDTH == 18) begin
+ assign PORT_A1_WDATA[WR_DATA_WIDTH-1:0] = WDATA1_i[WR_DATA_WIDTH-1:0];
+ assign PORT_A2_WDATA[WR_DATA_WIDTH-1:0] = WDATA2_i[WR_DATA_WIDTH-1:0];
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign PORT_A1_WDATA = {19'h0, WDATA1_i[8], 8'h0, WDATA1_i[7:0]};
+ assign PORT_A2_WDATA = {19'h0, WDATA2_i[8], 8'h0, WDATA2_i[7:0]};
+ end else begin
+ assign PORT_A1_WDATA[17:WR_DATA_WIDTH] = 0;
+ assign PORT_A1_WDATA[WR_DATA_WIDTH-1:0] = WDATA1_i[WR_DATA_WIDTH-1:0];
+ assign PORT_A2_WDATA[17:WR_DATA_WIDTH] = 0;
+ assign PORT_A2_WDATA[WR_DATA_WIDTH-1:0] = WDATA2_i[WR_DATA_WIDTH-1:0];
+ end
+endgenerate
+
+case (RD_DATA_WIDTH)
+ 9: begin
+ assign RDATA1_o = {PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+ assign RDATA2_o = {PORT_B2_RDATA[16], PORT_B2_RDATA[7:0]};
+ end
+ default: begin
+ assign RDATA1_o = PORT_B1_RDATA[RD_DATA_WIDTH-1:0];
+ assign RDATA2_o = PORT_B2_RDATA[RD_DATA_WIDTH-1:0];
+ end
+endcase
+
+// Assign parameters
+case (RD_DATA_WIDTH)
+ 1: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ 2: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_4, MODE_2, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_4, MODE_2, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_9, MODE_2, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_9, MODE_2, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_18, MODE_2, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_18, MODE_2, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ 4: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_2, MODE_4, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_2, MODE_4, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_9, MODE_4, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_9, MODE_4, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_18, MODE_4, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_18, MODE_4, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_2, MODE_9, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_2, MODE_9, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_4, MODE_9, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_4, MODE_9, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_2, MODE_18, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_2, MODE_18, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_4, MODE_18, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_4, MODE_18, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(RESET_ni),
+
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR1_ADDR_SHIFTED),
+ .CLK_A1_i(WR1_CLK_i),
+ .REN_A1_i(),
+ .WEN_A1_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(RD1_ADDR_SHIFTED),
+ .CLK_B1_i(RD1_CLK_i),
+ .REN_B1_i(REN1_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN1_i,REN1_i}),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR2_ADDR_SHIFTED),
+ .CLK_A2_i(WR2_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN2_i),
+ .BE_A2_i(WR2_BE[1:0]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(RD2_ADDR_SHIFTED),
+ .CLK_B2_i(RD2_CLK_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN2_i,REN2_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+endcase
+
+endmodule
+
+module RAM_18K_BLK (
+ WEN_i,
+ REN_i,
+ WR_CLK_i,
+ RD_CLK_i,
+ WR_BE_i,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire WR_CLK_i;
+input wire RD_CLK_i;
+input wire [BE_WIDTH-1:0] WR_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+ BRAM2x18_SP #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE1_WIDTH(BE_WIDTH),
+ .BE2_WIDTH()
+ ) U1
+ (
+ .RESET_ni(1'b1),
+
+ .WEN1_i(WEN_i),
+ .REN1_i(REN_i),
+ .WR1_CLK_i(WR_CLK_i),
+ .RD1_CLK_i(RD_CLK_i),
+ .WR1_BE_i(WR_BE_i),
+ .WR1_ADDR_i(WR_ADDR_i),
+ .RD1_ADDR_i(RD_ADDR_i),
+ .WDATA1_i(WDATA_i),
+ .RDATA1_o(RDATA_o),
+
+ .WEN2_i(),
+ .REN2_i(),
+ .WR2_CLK_i(),
+ .RD2_CLK_i(),
+ .WR2_BE_i(),
+ .WR2_ADDR_i(),
+ .RD2_ADDR_i(),
+ .WDATA2_i(),
+ .RDATA2_o()
+ );
+
+endmodule
+
+module RAM_36K_BLK (
+ WEN_i,
+ REN_i,
+ WR_CLK_i,
+ RD_CLK_i,
+ WR_BE_i,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 36;
+parameter BE_WIDTH = 4;
+
+localparam MODE_36 = 3'b011; // 36- or 32-bit
+localparam MODE_18 = 3'b010; // 18- or 16-bit
+localparam MODE_9 = 3'b001; // 9- or 8-bit
+localparam MODE_4 = 3'b100; // 4-bit
+localparam MODE_2 = 3'b110; // 2-bit
+localparam MODE_1 = 3'b101; // 1-bit
+
+input wire WEN_i;
+input wire REN_i;
+input wire WR_CLK_i;
+input wire RD_CLK_i;
+input wire [BE_WIDTH-1:0] WR_BE_i;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+wire [14:RD_ADDR_WIDTH] RD_ADDR_CMPL;
+wire [14:WR_ADDR_WIDTH] WR_ADDR_CMPL;
+wire [35:0] RD_DATA_CMPL;
+wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+
+wire [14:0] RD_ADDR_TOTAL;
+wire [14:0] WR_ADDR_TOTAL;
+
+wire [14:0] RD_ADDR_SHIFTED;
+wire [14:0] WR_ADDR_SHIFTED;
+
+wire [3:0] WR_BE;
+
+wire FLUSH1;
+wire FLUSH2;
+
+generate
+ if (WR_ADDR_WIDTH == 15) begin
+ assign WR_ADDR_TOTAL = WR_ADDR_i;
+ end else begin
+ assign WR_ADDR_TOTAL[14:WR_ADDR_WIDTH] = 0;
+ assign WR_ADDR_TOTAL[WR_ADDR_WIDTH-1:0] = WR_ADDR_i;
+ end
+endgenerate
+
+generate
+ if (RD_ADDR_WIDTH == 15) begin
+ assign RD_ADDR_TOTAL = RD_ADDR_i;
+ end else begin
+ assign RD_ADDR_TOTAL[14:RD_ADDR_WIDTH] = 0;
+ assign RD_ADDR_TOTAL[RD_ADDR_WIDTH-1:0] = RD_ADDR_i;
+ end
+endgenerate
+
+// Apply shift
+case (RD_DATA_WIDTH)
+ 1: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL;
+ end
+ 2: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 4;
+ end
+ 32, 36: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL << 5;
+ end
+ default: begin
+ assign RD_ADDR_SHIFTED = RD_ADDR_TOTAL;
+ end
+endcase
+
+case (WR_DATA_WIDTH)
+ 1: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL;
+ end
+ 2: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 1;
+ end
+ 4: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 2;
+ end
+ 8, 9: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 3;
+ end
+ 16, 18: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 4;
+ end
+ 32, 36: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL << 5;
+ end
+ default: begin
+ assign WR_ADDR_SHIFTED = WR_ADDR_TOTAL;
+ end
+endcase
+
+case (BE_WIDTH)
+ 4: begin
+ assign WR_BE = WR_BE_i[BE_WIDTH-1 :0];
+ end
+ default: begin
+ assign WR_BE[3:BE_WIDTH] = 0;
+ assign WR_BE[BE_WIDTH-1 :0] = WR_BE_i[BE_WIDTH-1 :0];
+ end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+// TODO configure per width
+wire [17:0] PORT_B1_RDATA;
+wire [17:0] PORT_B2_RDATA;
+wire [35:0] PORT_A_WDATA;
+
+generate
+ if (WR_DATA_WIDTH == 36) begin
+ assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0];
+ end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+ assign PORT_A_WDATA[WR_DATA_WIDTH+1:18] = WDATA_i[WR_DATA_WIDTH-1:16];
+ assign PORT_A_WDATA[17:0] = {2'b00,WDATA_i[15:0]};
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign PORT_A_WDATA = {19'h0, WDATA_i[8], 8'h0, WDATA_i[7:0]};
+ end else begin
+ assign PORT_A_WDATA[35:WR_DATA_WIDTH] = 0;
+ assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0];
+ end
+endgenerate
+
+generate
+ if (RD_DATA_WIDTH == 36) begin
+ assign RD_DATA_CMPL = {PORT_B2_RDATA, PORT_B1_RDATA};
+ end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+ assign RD_DATA_CMPL = {2'b00,PORT_B2_RDATA[17:0],PORT_B1_RDATA[15:0]};
+ end else if (RD_DATA_WIDTH == 9) begin
+ assign RD_DATA_CMPL = { 27'h0, PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+ end else begin
+ assign RD_DATA_CMPL = {18'h0, PORT_B1_RDATA};
+ end
+endgenerate
+
+assign RDATA_o = RD_DATA_CMPL[RD_DATA_WIDTH-1:0];
+
+// Assign parameters
+case (RD_DATA_WIDTH)
+ 1: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_36, MODE_1, MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_36, MODE_1, MODE_36, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ 2: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_4, MODE_2, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_4, MODE_2, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_9, MODE_2, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_9, MODE_2, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_18, MODE_2, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_18, MODE_2, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_36, MODE_2, MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_36, MODE_2, MODE_36, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_1, MODE_2, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ 4: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_2, MODE_4, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_2, MODE_4, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_9, MODE_4, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_9, MODE_4, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_18, MODE_4, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_18, MODE_4, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_36, MODE_4, MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_36, MODE_4, MODE_36, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_1, MODE_4, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_2, MODE_9, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_2, MODE_9, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_4, MODE_9, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_4, MODE_9, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_36, MODE_9, MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_36, MODE_9, MODE_36, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_1, MODE_9, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_2, MODE_18, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_2, MODE_18, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_4, MODE_18, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_4, MODE_18, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_36, MODE_18, MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_36, MODE_18, MODE_36, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_1, MODE_18, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ 32, 36: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_1, MODE_36, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_36, MODE_1, MODE_36, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_2, MODE_36, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_36, MODE_2, MODE_36, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_4, MODE_36, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_36, MODE_4, MODE_36, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_9, MODE_36, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_36, MODE_9, MODE_36, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_18, MODE_36, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_36, MODE_18, MODE_36, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_1, MODE_36, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_36, MODE_1, MODE_36, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 1: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 2: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_2, MODE_1, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 4: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_4, MODE_1, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 8, 9: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_9, MODE_1, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 16, 18: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_18, MODE_1, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ 32, 36: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_36, MODE_1, MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_36, MODE_1, MODE_36, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ defparam BRAM_BLK.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K BRAM_BLK (
+ .RESET_ni(1'b1),
+
+ .WDATA_A1_i(PORT_A_WDATA[17:0]),
+ .RDATA_A1_o(),
+ .ADDR_A1_i(WR_ADDR_SHIFTED),
+ .CLK_A1_i(WR_CLK_i),
+ .REN_A1_i(1'b0),
+ .WEN_A1_i(WEN_i),
+ .BE_A1_i(WR_BE[1:0]),
+
+ .WDATA_B1_i(18'h0),
+ .RDATA_B1_o(PORT_B1_RDATA[17:0]),
+ .ADDR_B1_i(RD_ADDR_SHIFTED),
+ .CLK_B1_i(RD_CLK_i),
+ .REN_B1_i(REN_i),
+ .WEN_B1_i(1'b0),
+ .BE_B1_i({REN_i,REN_i}),
+
+ .WDATA_A2_i(PORT_A_WDATA[35:18]),
+ .RDATA_A2_o(),
+ .ADDR_A2_i(WR_ADDR_SHIFTED),
+ .CLK_A2_i(WR_CLK_i),
+ .REN_A2_i(1'b0),
+ .WEN_A2_i(WEN_i),
+ .BE_A2_i(WR_BE[3:2]),
+
+ .WDATA_B2_i(18'h0),
+ .RDATA_B2_o(PORT_B2_RDATA[17:0]),
+ .ADDR_B2_i(RD_ADDR_SHIFTED),
+ .CLK_B2_i(RD_CLK_i),
+ .REN_B2_i(REN_i),
+ .WEN_B2_i(1'b0),
+ .BE_B2_i({REN_i,REN_i}),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+ end
+endcase
+
+endmodule
+
+module BRAM2x18_DP (A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN, C1ADDR, C1DATA, C1EN, CLK1, CLK2, CLK3, CLK4, D1ADDR, D1DATA, D1EN, E1ADDR, E1DATA, E1EN, F1ADDR, F1DATA, F1EN, G1ADDR, G1DATA, G1EN, H1ADDR, H1DATA, H1EN);
+ parameter CFG_ABITS = 11;
+ parameter CFG_DBITS = 18;
+ parameter CFG_ENABLE_B = 4;
+ parameter CFG_ENABLE_D = 4;
+ parameter CFG_ENABLE_F = 4;
+ parameter CFG_ENABLE_H = 4;
+
+ parameter CLKPOL2 = 1;
+ parameter CLKPOL3 = 1;
+ parameter [18431:0] INIT0 = 18432'bx;
+ parameter [18431:0] INIT1 = 18432'bx;
+
+ localparam MODE_36 = 3'b011; // 36- or 32-bit
+ localparam MODE_18 = 3'b010; // 18- or 16-bit
+ localparam MODE_9 = 3'b001; // 9- or 8-bit
+ localparam MODE_4 = 3'b100; // 4-bit
+ localparam MODE_2 = 3'b110; // 2-bit
+ localparam MODE_1 = 3'b101; // 1-bit
+
+ input wire CLK1;
+ input wire CLK2;
+ input wire CLK3;
+ input wire CLK4;
+
+ input wire [CFG_ABITS-1:0] A1ADDR;
+ output wire [CFG_DBITS-1:0] A1DATA;
+ input wire A1EN;
+
+ input wire [CFG_ABITS-1:0] B1ADDR;
+ input wire [CFG_DBITS-1:0] B1DATA;
+ input wire [CFG_ENABLE_B-1:0] B1EN;
+
+ input wire [CFG_ABITS-1:0] C1ADDR;
+ output wire [CFG_DBITS-1:0] C1DATA;
+ input wire C1EN;
+
+ input wire [CFG_ABITS-1:0] D1ADDR;
+ input wire [CFG_DBITS-1:0] D1DATA;
+ input wire [CFG_ENABLE_D-1:0] D1EN;
+
+ input wire [CFG_ABITS-1:0] E1ADDR;
+ output wire [CFG_DBITS-1:0] E1DATA;
+ input wire E1EN;
+
+ input wire [CFG_ABITS-1:0] F1ADDR;
+ input wire [CFG_DBITS-1:0] F1DATA;
+ input wire [CFG_ENABLE_F-1:0] F1EN;
+
+ input wire [CFG_ABITS-1:0] G1ADDR;
+ output wire [CFG_DBITS-1:0] G1DATA;
+ input wire G1EN;
+
+ input wire [CFG_ABITS-1:0] H1ADDR;
+ input wire [CFG_DBITS-1:0] H1DATA;
+ input wire [CFG_ENABLE_H-1:0] H1EN;
+
+ wire FLUSH1;
+ wire FLUSH2;
+
+ wire [14:0] A1ADDR_TOTAL;
+ wire [14:0] B1ADDR_TOTAL;
+ wire [14:0] C1ADDR_TOTAL;
+ wire [14:0] D1ADDR_TOTAL;
+ wire [14:0] E1ADDR_TOTAL;
+ wire [14:0] F1ADDR_TOTAL;
+ wire [14:0] G1ADDR_TOTAL;
+ wire [14:0] H1ADDR_TOTAL;
+
+ generate
+ if (CFG_ABITS == 15) begin
+ assign A1ADDR_TOTAL = A1ADDR;
+ assign B1ADDR_TOTAL = B1ADDR;
+ assign C1ADDR_TOTAL = C1ADDR;
+ assign D1ADDR_TOTAL = D1ADDR;
+ assign E1ADDR_TOTAL = E1ADDR;
+ assign F1ADDR_TOTAL = F1ADDR;
+ assign G1ADDR_TOTAL = G1ADDR;
+ assign H1ADDR_TOTAL = H1ADDR;
+ end else begin
+ assign A1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign A1ADDR_TOTAL[CFG_ABITS-1:0] = A1ADDR;
+ assign B1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign B1ADDR_TOTAL[CFG_ABITS-1:0] = B1ADDR;
+ assign C1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign C1ADDR_TOTAL[CFG_ABITS-1:0] = C1ADDR;
+ assign D1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign D1ADDR_TOTAL[CFG_ABITS-1:0] = D1ADDR;
+ assign E1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign E1ADDR_TOTAL[CFG_ABITS-1:0] = E1ADDR;
+ assign F1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign F1ADDR_TOTAL[CFG_ABITS-1:0] = F1ADDR;
+ assign G1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign G1ADDR_TOTAL[CFG_ABITS-1:0] = G1ADDR;
+ assign H1ADDR_TOTAL[14:CFG_ABITS] = 0;
+ assign H1ADDR_TOTAL[CFG_ABITS-1:0] = H1ADDR;
+ end
+ endgenerate
+
+ wire [17:CFG_DBITS] A1_RDATA_CMPL;
+ wire [17:CFG_DBITS] C1_RDATA_CMPL;
+ wire [17:CFG_DBITS] E1_RDATA_CMPL;
+ wire [17:CFG_DBITS] G1_RDATA_CMPL;
+
+ wire [17:CFG_DBITS] B1_WDATA_CMPL;
+ wire [17:CFG_DBITS] D1_WDATA_CMPL;
+ wire [17:CFG_DBITS] F1_WDATA_CMPL;
+ wire [17:CFG_DBITS] H1_WDATA_CMPL;
+
+ wire [14:0] PORT_A1_ADDR;
+ wire [14:0] PORT_A2_ADDR;
+ wire [14:0] PORT_B1_ADDR;
+ wire [14:0] PORT_B2_ADDR;
+
+ assign FLUSH1 = 1'b0;
+ assign FLUSH2 = 1'b0;
+
+ wire [17:0] PORT_A1_RDATA;
+ wire [17:0] PORT_B1_RDATA;
+ wire [17:0] PORT_A2_RDATA;
+ wire [17:0] PORT_B2_RDATA;
+
+ wire [17:0] PORT_A1_WDATA;
+ wire [17:0] PORT_B1_WDATA;
+ wire [17:0] PORT_A2_WDATA;
+ wire [17:0] PORT_B2_WDATA;
+
+ // Assign read/write data - handle special case for 9bit mode
+ // parity bit for 9bit mode is placed in R/W port on bit #16
+ case (CFG_DBITS)
+ 9: begin
+ assign A1DATA = {PORT_A1_RDATA[16], PORT_A1_RDATA[7:0]};
+ assign C1DATA = {PORT_B1_RDATA[16], PORT_B1_RDATA[7:0]};
+ assign E1DATA = {PORT_A2_RDATA[16], PORT_A2_RDATA[7:0]};
+ assign G1DATA = {PORT_B2_RDATA[16], PORT_B2_RDATA[7:0]};
+ assign PORT_A1_WDATA = {B1_WDATA_CMPL[17], B1DATA[8], B1_WDATA_CMPL[16:9], B1DATA[7:0]};
+ assign PORT_B1_WDATA = {D1_WDATA_CMPL[17], D1DATA[8], D1_WDATA_CMPL[16:9], D1DATA[7:0]};
+ assign PORT_A2_WDATA = {F1_WDATA_CMPL[17], F1DATA[8], F1_WDATA_CMPL[16:9], F1DATA[7:0]};
+ assign PORT_B2_WDATA = {H1_WDATA_CMPL[17], H1DATA[8], H1_WDATA_CMPL[16:9], H1DATA[7:0]};
+ end
+ default: begin
+ assign A1DATA = PORT_A1_RDATA[CFG_DBITS-1:0];
+ assign C1DATA = PORT_B1_RDATA[CFG_DBITS-1:0];
+ assign E1DATA = PORT_A2_RDATA[CFG_DBITS-1:0];
+ assign G1DATA = PORT_B2_RDATA[CFG_DBITS-1:0];
+ assign PORT_A1_WDATA = {B1_WDATA_CMPL, B1DATA};
+ assign PORT_B1_WDATA = {D1_WDATA_CMPL, D1DATA};
+ assign PORT_A2_WDATA = {F1_WDATA_CMPL, F1DATA};
+ assign PORT_B2_WDATA = {H1_WDATA_CMPL, H1DATA};
+
+ end
+ endcase
+
+ wire PORT_A1_CLK = CLK1;
+ wire PORT_A2_CLK = CLK3;
+ wire PORT_B1_CLK = CLK2;
+ wire PORT_B2_CLK = CLK4;
+
+ wire PORT_A1_REN = A1EN;
+ wire PORT_A1_WEN = B1EN[0];
+ wire [CFG_ENABLE_B-1:0] PORT_A1_BE = {B1EN[1],B1EN[0]};
+
+ wire PORT_A2_REN = E1EN;
+ wire PORT_A2_WEN = F1EN[0];
+ wire [CFG_ENABLE_F-1:0] PORT_A2_BE = {F1EN[1],F1EN[0]};
+
+ wire PORT_B1_REN = C1EN;
+ wire PORT_B1_WEN = D1EN[0];
+ wire [CFG_ENABLE_D-1:0] PORT_B1_BE = {D1EN[1],D1EN[0]};
+
+ wire PORT_B2_REN = G1EN;
+ wire PORT_B2_WEN = H1EN[0];
+ wire [CFG_ENABLE_H-1:0] PORT_B2_BE = {H1EN[1],H1EN[0]};
+
+ case (CFG_DBITS)
+ 1: begin
+ assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+ };
+ (* is_split = 1 *)
+ (* rd_data_width = CFG_DBITS *)
+ (* wr_data_width = CFG_DBITS *)
+ TDP36K _TECHMAP_REPLACE_ (
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(PORT_A1_RDATA),
+ .ADDR_A1_i(PORT_A1_ADDR),
+ .CLK_A1_i(PORT_A1_CLK),
+ .REN_A1_i(PORT_A1_REN),
+ .WEN_A1_i(PORT_A1_WEN),
+ .BE_A1_i(PORT_A1_BE),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(PORT_A2_RDATA),
+ .ADDR_A2_i(PORT_A2_ADDR),
+ .CLK_A2_i(PORT_A2_CLK),
+ .REN_A2_i(PORT_A2_REN),
+ .WEN_A2_i(PORT_A2_WEN),
+ .BE_A2_i(PORT_A2_BE),
+
+ .WDATA_B1_i(PORT_B1_WDATA),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(PORT_B1_ADDR),
+ .CLK_B1_i(PORT_B1_CLK),
+ .REN_B1_i(PORT_B1_REN),
+ .WEN_B1_i(PORT_B1_WEN),
+ .BE_B1_i(PORT_B1_BE),
+
+ .WDATA_B2_i(PORT_B2_WDATA),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(PORT_B2_ADDR),
+ .CLK_B2_i(PORT_B2_CLK),
+ .REN_B2_i(PORT_B2_REN),
+ .WEN_B2_i(PORT_B2_WEN),
+ .BE_B2_i(PORT_B2_BE),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+
+ 2: begin
+ assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 1) : (B1EN ? (B1ADDR_TOTAL << 1) : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 1) : (D1EN ? (D1ADDR_TOTAL << 1) : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 1) : (F1EN ? (F1ADDR_TOTAL << 1) : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 1) : (H1EN ? (H1ADDR_TOTAL << 1) : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+ };
+ (* is_split = 1 *)
+ (* rd_data_width = CFG_DBITS *)
+ (* wr_data_width = CFG_DBITS *)
+ TDP36K _TECHMAP_REPLACE_ (
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(PORT_A1_RDATA),
+ .ADDR_A1_i(PORT_A1_ADDR),
+ .CLK_A1_i(PORT_A1_CLK),
+ .REN_A1_i(PORT_A1_REN),
+ .WEN_A1_i(PORT_A1_WEN),
+ .BE_A1_i(PORT_A1_BE),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(PORT_A2_RDATA),
+ .ADDR_A2_i(PORT_A2_ADDR),
+ .CLK_A2_i(PORT_A2_CLK),
+ .REN_A2_i(PORT_A2_REN),
+ .WEN_A2_i(PORT_A2_WEN),
+ .BE_A2_i(PORT_A2_BE),
+
+ .WDATA_B1_i(PORT_B1_WDATA),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(PORT_B1_ADDR),
+ .CLK_B1_i(PORT_B1_CLK),
+ .REN_B1_i(PORT_B1_REN),
+ .WEN_B1_i(PORT_B1_WEN),
+ .BE_B1_i(PORT_B1_BE),
+
+ .WDATA_B2_i(PORT_B2_WDATA),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(PORT_B2_ADDR),
+ .CLK_B2_i(PORT_B2_CLK),
+ .REN_B2_i(PORT_B2_REN),
+ .WEN_B2_i(PORT_B2_WEN),
+ .BE_B2_i(PORT_B2_BE),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+
+ 4: begin
+ assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 2) : (B1EN ? (B1ADDR_TOTAL << 2) : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 2) : (D1EN ? (D1ADDR_TOTAL << 2) : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 2) : (F1EN ? (F1ADDR_TOTAL << 2) : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 2) : (H1EN ? (H1ADDR_TOTAL << 2) : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+ };
+ (* is_split = 1 *)
+ (* rd_data_width = CFG_DBITS *)
+ (* wr_data_width = CFG_DBITS *)
+ TDP36K _TECHMAP_REPLACE_ (
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(PORT_A1_RDATA),
+ .ADDR_A1_i(PORT_A1_ADDR),
+ .CLK_A1_i(PORT_A1_CLK),
+ .REN_A1_i(PORT_A1_REN),
+ .WEN_A1_i(PORT_A1_WEN),
+ .BE_A1_i(PORT_A1_BE),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(PORT_A2_RDATA),
+ .ADDR_A2_i(PORT_A2_ADDR),
+ .CLK_A2_i(PORT_A2_CLK),
+ .REN_A2_i(PORT_A2_REN),
+ .WEN_A2_i(PORT_A2_WEN),
+ .BE_A2_i(PORT_A2_BE),
+
+ .WDATA_B1_i(PORT_B1_WDATA),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(PORT_B1_ADDR),
+ .CLK_B1_i(PORT_B1_CLK),
+ .REN_B1_i(PORT_B1_REN),
+ .WEN_B1_i(PORT_B1_WEN),
+ .BE_B1_i(PORT_B1_BE),
+
+ .WDATA_B2_i(PORT_B2_WDATA),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(PORT_B2_ADDR),
+ .CLK_B2_i(PORT_B2_CLK),
+ .REN_B2_i(PORT_B2_REN),
+ .WEN_B2_i(PORT_B2_WEN),
+ .BE_B2_i(PORT_B2_BE),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+
+ 8, 9: begin
+ assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 3) : (B1EN ? (B1ADDR_TOTAL << 3) : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 3) : (D1EN ? (D1ADDR_TOTAL << 3) : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 3) : (F1EN ? (F1ADDR_TOTAL << 3) : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 3) : (H1EN ? (H1ADDR_TOTAL << 3) : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+ };
+ (* is_split = 1 *)
+ (* rd_data_width = CFG_DBITS *)
+ (* wr_data_width = CFG_DBITS *)
+ TDP36K _TECHMAP_REPLACE_ (
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(PORT_A1_RDATA),
+ .ADDR_A1_i(PORT_A1_ADDR),
+ .CLK_A1_i(PORT_A1_CLK),
+ .REN_A1_i(PORT_A1_REN),
+ .WEN_A1_i(PORT_A1_WEN),
+ .BE_A1_i(PORT_A1_BE),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(PORT_A2_RDATA),
+ .ADDR_A2_i(PORT_A2_ADDR),
+ .CLK_A2_i(PORT_A2_CLK),
+ .REN_A2_i(PORT_A2_REN),
+ .WEN_A2_i(PORT_A2_WEN),
+ .BE_A2_i(PORT_A2_BE),
+
+ .WDATA_B1_i(PORT_B1_WDATA),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(PORT_B1_ADDR),
+ .CLK_B1_i(PORT_B1_CLK),
+ .REN_B1_i(PORT_B1_REN),
+ .WEN_B1_i(PORT_B1_WEN),
+ .BE_B1_i(PORT_B1_BE),
+
+ .WDATA_B2_i(PORT_B2_WDATA),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(PORT_B2_ADDR),
+ .CLK_B2_i(PORT_B2_CLK),
+ .REN_B2_i(PORT_B2_REN),
+ .WEN_B2_i(PORT_B2_WEN),
+ .BE_B2_i(PORT_B2_BE),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+
+ 16, 18: begin
+ assign PORT_A1_ADDR = A1EN ? (A1ADDR_TOTAL << 4) : (B1EN ? (B1ADDR_TOTAL << 4) : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? (C1ADDR_TOTAL << 4) : (D1EN ? (D1ADDR_TOTAL << 4) : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? (E1ADDR_TOTAL << 4) : (F1EN ? (F1ADDR_TOTAL << 4) : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? (G1ADDR_TOTAL << 4) : (H1EN ? (H1ADDR_TOTAL << 4) : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+ };
+ (* is_split = 1 *)
+ (* rd_data_width = CFG_DBITS *)
+ (* wr_data_width = CFG_DBITS *)
+ TDP36K _TECHMAP_REPLACE_ (
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(PORT_A1_RDATA),
+ .ADDR_A1_i(PORT_A1_ADDR),
+ .CLK_A1_i(PORT_A1_CLK),
+ .REN_A1_i(PORT_A1_REN),
+ .WEN_A1_i(PORT_A1_WEN),
+ .BE_A1_i(PORT_A1_BE),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(PORT_A2_RDATA),
+ .ADDR_A2_i(PORT_A2_ADDR),
+ .CLK_A2_i(PORT_A2_CLK),
+ .REN_A2_i(PORT_A2_REN),
+ .WEN_A2_i(PORT_A2_WEN),
+ .BE_A2_i(PORT_A2_BE),
+
+ .WDATA_B1_i(PORT_B1_WDATA),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(PORT_B1_ADDR),
+ .CLK_B1_i(PORT_B1_CLK),
+ .REN_B1_i(PORT_B1_REN),
+ .WEN_B1_i(PORT_B1_WEN),
+ .BE_B1_i(PORT_B1_BE),
+
+ .WDATA_B2_i(PORT_B2_WDATA),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(PORT_B2_ADDR),
+ .CLK_B2_i(PORT_B2_CLK),
+ .REN_B2_i(PORT_B2_REN),
+ .WEN_B2_i(PORT_B2_WEN),
+ .BE_B2_i(PORT_B2_BE),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+
+ default: begin
+ assign PORT_A1_ADDR = A1EN ? A1ADDR_TOTAL : (B1EN ? B1ADDR_TOTAL : 14'd0);
+ assign PORT_B1_ADDR = C1EN ? C1ADDR_TOTAL : (D1EN ? D1ADDR_TOTAL : 14'd0);
+ assign PORT_A2_ADDR = E1EN ? E1ADDR_TOTAL : (F1EN ? F1ADDR_TOTAL : 14'd0);
+ assign PORT_B2_ADDR = G1EN ? G1ADDR_TOTAL : (H1EN ? H1ADDR_TOTAL : 14'd0);
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+ };
+ (* is_split = 1 *)
+ (* rd_data_width = CFG_DBITS *)
+ (* wr_data_width = CFG_DBITS *)
+ TDP36K _TECHMAP_REPLACE_ (
+ .WDATA_A1_i(PORT_A1_WDATA),
+ .RDATA_A1_o(PORT_A1_RDATA),
+ .ADDR_A1_i(PORT_A1_ADDR),
+ .CLK_A1_i(PORT_A1_CLK),
+ .REN_A1_i(PORT_A1_REN),
+ .WEN_A1_i(PORT_A1_WEN),
+ .BE_A1_i(PORT_A1_BE),
+
+ .WDATA_A2_i(PORT_A2_WDATA),
+ .RDATA_A2_o(PORT_A2_RDATA),
+ .ADDR_A2_i(PORT_A2_ADDR),
+ .CLK_A2_i(PORT_A2_CLK),
+ .REN_A2_i(PORT_A2_REN),
+ .WEN_A2_i(PORT_A2_WEN),
+ .BE_A2_i(PORT_A2_BE),
+
+ .WDATA_B1_i(PORT_B1_WDATA),
+ .RDATA_B1_o(PORT_B1_RDATA),
+ .ADDR_B1_i(PORT_B1_ADDR),
+ .CLK_B1_i(PORT_B1_CLK),
+ .REN_B1_i(PORT_B1_REN),
+ .WEN_B1_i(PORT_B1_WEN),
+ .BE_B1_i(PORT_B1_BE),
+
+ .WDATA_B2_i(PORT_B2_WDATA),
+ .RDATA_B2_o(PORT_B2_RDATA),
+ .ADDR_B2_i(PORT_B2_ADDR),
+ .CLK_B2_i(PORT_B2_CLK),
+ .REN_B2_i(PORT_B2_REN),
+ .WEN_B2_i(PORT_B2_WEN),
+ .BE_B2_i(PORT_B2_BE),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ endcase
+
+endmodule
+
+module DPRAM_18K_BLK (
+ CLK1_i,
+ WEN1_i,
+ REN1_i,
+ WR1_ADDR_i,
+ RD1_ADDR_i,
+ WDATA1_i,
+ RDATA1_o,
+
+ CLK2_i,
+ WEN2_i,
+ REN2_i,
+ WR2_ADDR_i,
+ RD2_ADDR_i,
+ WDATA2_i,
+ RDATA2_o
+);
+
+parameter ADDR_WIDTH = 10;
+parameter DATA_WIDTH = 18;
+parameter BE1_WIDTH = 2;
+parameter BE2_WIDTH = 2;
+
+input wire CLK1_i;
+input wire WEN1_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire CLK2_i;
+input wire WEN2_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+(* is_inferred = 1 *)
+BRAM2x18_DP #(
+ .CFG_ABITS(ADDR_WIDTH),
+ .CFG_DBITS(DATA_WIDTH),
+ .CFG_ENABLE_B(BE1_WIDTH),
+ .CFG_ENABLE_D(BE2_WIDTH)
+) bram2x18_inst (
+ .A1ADDR(RD1_ADDR_i),
+ .A1DATA(RDATA1_o),
+ .A1EN(REN1_i),
+ .B1ADDR(WR1_ADDR_i),
+ .B1DATA(WDATA1_i),
+ .B1EN({WEN1_i,WEN1_i}),
+ .CLK1(CLK1_i),
+
+ .C1ADDR(RD2_ADDR_i),
+ .C1DATA(RDATA2_o),
+ .C1EN(REN2_i),
+ .D1ADDR(WR2_ADDR_i),
+ .D1DATA(WDATA2_i),
+ .D1EN({WEN2_i,WEN2_i}),
+ .CLK2(CLK2_i),
+
+ .E1ADDR(),
+ .E1DATA(),
+ .E1EN(),
+ .F1ADDR(),
+ .F1DATA(),
+ .F1EN(),
+ .CLK3(),
+
+ .G1ADDR(),
+ .G1DATA(),
+ .G1EN(),
+ .H1ADDR(),
+ .H1DATA(),
+ .H1EN(),
+ .CLK4()
+);
+endmodule
+
+module DPRAM_36K_BLK (
+ CLK1_i,
+ WEN1_i,
+ WR1_BE_i,
+ REN1_i,
+ WR1_ADDR_i,
+ RD1_ADDR_i,
+ WDATA1_i,
+ RDATA1_o,
+
+ CLK2_i,
+ WEN2_i,
+ WR2_BE_i,
+ REN2_i,
+ WR2_ADDR_i,
+ RD2_ADDR_i,
+ WDATA2_i,
+ RDATA2_o
+);
+
+parameter ADDR_WIDTH = 10;
+parameter DATA_WIDTH = 36;
+parameter BE1_WIDTH = 4;
+parameter BE2_WIDTH = 4;
+
+localparam MODE_36 = 3'b011; // 36- or 32-bit
+localparam MODE_18 = 3'b010; // 18- or 16-bit
+localparam MODE_9 = 3'b001; // 9- or 8-bit
+localparam MODE_4 = 3'b100; // 4-bit
+localparam MODE_2 = 3'b110; // 2-bit
+localparam MODE_1 = 3'b101; // 1-bit
+
+input wire CLK1_i;
+input wire WEN1_i;
+input wire [BE1_WIDTH-1 :0] WR1_BE_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire CLK2_i;
+input wire WEN2_i;
+input wire [BE2_WIDTH-1 :0] WR2_BE_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+wire FLUSH1;
+wire FLUSH2;
+
+wire [14:0] A1ADDR_TOTAL;
+wire [14:0] B1ADDR_TOTAL;
+wire [14:0] C1ADDR_TOTAL;
+wire [14:0] D1ADDR_TOTAL;
+
+generate
+ if (ADDR_WIDTH == 15) begin
+ assign A1ADDR_TOTAL = RD1_ADDR_i;
+ assign B1ADDR_TOTAL = WR1_ADDR_i;
+ assign C1ADDR_TOTAL = RD2_ADDR_i;
+ assign D1ADDR_TOTAL = WR2_ADDR_i;
+ end else begin
+ assign A1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+ assign A1ADDR_TOTAL[ADDR_WIDTH-1:0] = RD1_ADDR_i;
+ assign B1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+ assign B1ADDR_TOTAL[ADDR_WIDTH-1:0] = WR1_ADDR_i;
+ assign C1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+ assign C1ADDR_TOTAL[ADDR_WIDTH-1:0] = RD2_ADDR_i;
+ assign D1ADDR_TOTAL[14:ADDR_WIDTH] = 0;
+ assign D1ADDR_TOTAL[ADDR_WIDTH-1:0] = WR2_ADDR_i;
+ end
+endgenerate
+
+wire [35:DATA_WIDTH] A1DATA_CMPL;
+wire [35:DATA_WIDTH] B1DATA_CMPL;
+wire [35:DATA_WIDTH] C1DATA_CMPL;
+wire [35:DATA_WIDTH] D1DATA_CMPL;
+
+wire [35:0] A1DATA_TOTAL;
+wire [35:0] B1DATA_TOTAL;
+wire [35:0] C1DATA_TOTAL;
+wire [35:0] D1DATA_TOTAL;
+
+wire [14:0] PORT_A_ADDR;
+wire [14:0] PORT_B_ADDR;
+
+wire [3:0] WR1_BE;
+wire [3:0] WR2_BE;
+
+generate
+ if (BE1_WIDTH == 4) begin
+ assign WR1_BE = WR1_BE_i;
+ end else begin
+ assign WR1_BE[3:BE1_WIDTH] = 0;
+ assign WR1_BE[BE1_WIDTH-1:0] = WR1_BE_i[BE1_WIDTH-1:0];
+ end
+endgenerate
+
+generate
+ if (BE2_WIDTH == 4) begin
+ assign WR2_BE = WR2_BE_i;
+ end else begin
+ assign WR2_BE[3:BE2_WIDTH] = 0;
+ assign WR2_BE[BE2_WIDTH-1:0] = WR2_BE_i[BE2_WIDTH-1:0];
+ end
+endgenerate
+
+// Assign read/write data - handle special case for 9bit mode
+// parity bit for 9bit mode is placed in R/W port on bit #16
+case (DATA_WIDTH)
+ 9: begin
+ assign RDATA1_o = {A1DATA_TOTAL[16], A1DATA_TOTAL[7:0]};
+ assign RDATA2_o = {C1DATA_TOTAL[16], C1DATA_TOTAL[7:0]};
+ assign B1DATA_TOTAL = {B1DATA_CMPL[35:17], WDATA1_i[8], B1DATA_CMPL[16:9], WDATA1_i[7:0]};
+ assign D1DATA_TOTAL = {D1DATA_CMPL[35:17], WDATA2_i[8], D1DATA_CMPL[16:9], WDATA2_i[7:0]};
+ end
+ default: begin
+ assign RDATA1_o = A1DATA_TOTAL[DATA_WIDTH-1:0];
+ assign RDATA2_o = C1DATA_TOTAL[DATA_WIDTH-1:0];
+ assign B1DATA_TOTAL = {B1DATA_CMPL, WDATA1_i};
+ assign D1DATA_TOTAL = {D1DATA_CMPL, WDATA2_i};
+ end
+endcase
+
+assign FLUSH1 = 1'b0;
+assign FLUSH2 = 1'b0;
+
+case (DATA_WIDTH)
+ 1: begin
+ assign PORT_A_ADDR = REN1_i ? A1ADDR_TOTAL : (WEN1_i ? B1ADDR_TOTAL : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? C1ADDR_TOTAL : (WEN2_i ? D1ADDR_TOTAL : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_1, MODE_1, MODE_1, MODE_1, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = DATA_WIDTH *)
+ (* wr_data_width = DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+ .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+ .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+ .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+ .ADDR_A1_i(PORT_A_ADDR),
+ .ADDR_A2_i(PORT_A_ADDR),
+ .CLK_A1_i(CLK1_i),
+ .CLK_A2_i(CLK1_i),
+ .REN_A1_i(REN1_i),
+ .REN_A2_i(REN1_i),
+ .WEN_A1_i(WEN1_i),
+ .WEN_A2_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+ .BE_A2_i(WR1_BE[3:0]),
+
+ .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+ .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+ .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+ .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+ .ADDR_B1_i(PORT_B_ADDR),
+ .ADDR_B2_i(PORT_B_ADDR),
+ .CLK_B1_i(CLK2_i),
+ .CLK_B2_i(CLK2_i),
+ .REN_B1_i(REN2_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B1_i(WEN2_i),
+ .WEN_B2_i(WEN2_i),
+ .BE_B1_i(WR2_BE[1:0]),
+ .BE_B2_i(WR2_BE[3:0]),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+
+ 2: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 1) : (WEN1_i ? (B1ADDR_TOTAL << 1) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 1) : (WEN2_i ? (D1ADDR_TOTAL << 1) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_2, MODE_2, MODE_2, MODE_2, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = DATA_WIDTH *)
+ (* wr_data_width = DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+ .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+ .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+ .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+ .ADDR_A1_i(PORT_A_ADDR),
+ .ADDR_A2_i(PORT_A_ADDR),
+ .CLK_A1_i(CLK1_i),
+ .CLK_A2_i(CLK1_i),
+ .REN_A1_i(REN1_i),
+ .REN_A2_i(REN1_i),
+ .WEN_A1_i(WEN1_i),
+ .WEN_A2_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+ .BE_A2_i(WR1_BE[3:0]),
+
+ .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+ .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+ .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+ .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+ .ADDR_B1_i(PORT_B_ADDR),
+ .ADDR_B2_i(PORT_B_ADDR),
+ .CLK_B1_i(CLK2_i),
+ .CLK_B2_i(CLK2_i),
+ .REN_B1_i(REN2_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B1_i(WEN2_i),
+ .WEN_B2_i(WEN2_i),
+ .BE_B1_i(WR2_BE[1:0]),
+ .BE_B2_i(WR2_BE[3:0]),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+
+ 4: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 2) : (WEN1_i ? (B1ADDR_TOTAL << 2) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 2) : (WEN2_i ? (D1ADDR_TOTAL << 2) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_4, MODE_4, MODE_4, MODE_4, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = DATA_WIDTH *)
+ (* wr_data_width = DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+ .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+ .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+ .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+ .ADDR_A1_i(PORT_A_ADDR),
+ .ADDR_A2_i(PORT_A_ADDR),
+ .CLK_A1_i(CLK1_i),
+ .CLK_A2_i(CLK1_i),
+ .REN_A1_i(REN1_i),
+ .REN_A2_i(REN1_i),
+ .WEN_A1_i(WEN1_i),
+ .WEN_A2_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+ .BE_A2_i(WR1_BE[3:0]),
+
+ .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+ .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+ .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+ .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+ .ADDR_B1_i(PORT_B_ADDR),
+ .ADDR_B2_i(PORT_B_ADDR),
+ .CLK_B1_i(CLK2_i),
+ .CLK_B2_i(CLK2_i),
+ .REN_B1_i(REN2_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B1_i(WEN2_i),
+ .WEN_B2_i(WEN2_i),
+ .BE_B1_i(WR2_BE[1:0]),
+ .BE_B2_i(WR2_BE[3:0]),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+
+ 8, 9: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 3) : (WEN1_i ? (B1ADDR_TOTAL << 3) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 3) : (WEN2_i ? (D1ADDR_TOTAL << 3) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = DATA_WIDTH *)
+ (* wr_data_width = DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+ .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+ .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+ .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+ .ADDR_A1_i(PORT_A_ADDR),
+ .ADDR_A2_i(PORT_A_ADDR),
+ .CLK_A1_i(CLK1_i),
+ .CLK_A2_i(CLK1_i),
+ .REN_A1_i(REN1_i),
+ .REN_A2_i(REN1_i),
+ .WEN_A1_i(WEN1_i),
+ .WEN_A2_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+ .BE_A2_i(WR1_BE[3:0]),
+
+ .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+ .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+ .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+ .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+ .ADDR_B1_i(PORT_B_ADDR),
+ .ADDR_B2_i(PORT_B_ADDR),
+ .CLK_B1_i(CLK2_i),
+ .CLK_B2_i(CLK2_i),
+ .REN_B1_i(REN2_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B1_i(WEN2_i),
+ .WEN_B2_i(WEN2_i),
+ .BE_B1_i(WR2_BE[1:0]),
+ .BE_B2_i(WR2_BE[3:0]),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+
+ 16, 18: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 4) : (WEN1_i ? (B1ADDR_TOTAL << 4) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 4) : (WEN2_i ? (D1ADDR_TOTAL << 4) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = DATA_WIDTH *)
+ (* wr_data_width = DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+ .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+ .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+ .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+ .ADDR_A1_i(PORT_A_ADDR),
+ .ADDR_A2_i(PORT_A_ADDR),
+ .CLK_A1_i(CLK1_i),
+ .CLK_A2_i(CLK1_i),
+ .REN_A1_i(REN1_i),
+ .REN_A2_i(REN1_i),
+ .WEN_A1_i(WEN1_i),
+ .WEN_A2_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+ .BE_A2_i(WR1_BE[3:0]),
+
+ .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+ .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+ .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+ .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+ .ADDR_B1_i(PORT_B_ADDR),
+ .ADDR_B2_i(PORT_B_ADDR),
+ .CLK_B1_i(CLK2_i),
+ .CLK_B2_i(CLK2_i),
+ .REN_B1_i(REN2_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B1_i(WEN2_i),
+ .WEN_B2_i(WEN2_i),
+ .BE_B1_i(WR2_BE[1:0]),
+ .BE_B2_i(WR2_BE[3:0]),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+
+ 32, 36: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 5) : (WEN1_i ? (B1ADDR_TOTAL << 5) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 5) : (WEN2_i ? (D1ADDR_TOTAL << 5) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = DATA_WIDTH *)
+ (* wr_data_width = DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+ .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+ .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+ .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+ .ADDR_A1_i(PORT_A_ADDR),
+ .ADDR_A2_i(PORT_A_ADDR),
+ .CLK_A1_i(CLK1_i),
+ .CLK_A2_i(CLK1_i),
+ .REN_A1_i(REN1_i),
+ .REN_A2_i(REN1_i),
+ .WEN_A1_i(WEN1_i),
+ .WEN_A2_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+ .BE_A2_i(WR1_BE[3:0]),
+
+ .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+ .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+ .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+ .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+ .ADDR_B1_i(PORT_B_ADDR),
+ .ADDR_B2_i(PORT_B_ADDR),
+ .CLK_B1_i(CLK2_i),
+ .CLK_B2_i(CLK2_i),
+ .REN_B1_i(REN2_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B1_i(WEN2_i),
+ .WEN_B2_i(WEN2_i),
+ .BE_B1_i(WR2_BE[1:0]),
+ .BE_B2_i(WR2_BE[3:0]),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+ default: begin
+ assign PORT_A_ADDR = REN1_i ? (A1ADDR_TOTAL << 5) : (WEN1_i ? (B1ADDR_TOTAL << 5) : 15'd0);
+ assign PORT_B_ADDR = REN2_i ? (C1ADDR_TOTAL << 5) : (WEN2_i ? (D1ADDR_TOTAL << 5) : 15'd0);
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ 12'd10, 12'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0
+ };
+ (* is_inferred = 1 *)
+ (* rd_data_width = DATA_WIDTH *)
+ (* wr_data_width = DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(B1DATA_TOTAL[17:0]),
+ .WDATA_A2_i(B1DATA_TOTAL[35:18]),
+ .RDATA_A1_o(A1DATA_TOTAL[17:0]),
+ .RDATA_A2_o(A1DATA_TOTAL[35:18]),
+ .ADDR_A1_i(PORT_A_ADDR),
+ .ADDR_A2_i(PORT_A_ADDR),
+ .CLK_A1_i(CLK1_i),
+ .CLK_A2_i(CLK1_i),
+ .REN_A1_i(REN1_i),
+ .REN_A2_i(REN1_i),
+ .WEN_A1_i(WEN1_i),
+ .WEN_A2_i(WEN1_i),
+ .BE_A1_i(WR1_BE[1:0]),
+ .BE_A2_i(WR1_BE[3:0]),
+
+ .WDATA_B1_i(D1DATA_TOTAL[17:0]),
+ .WDATA_B2_i(D1DATA_TOTAL[35:18]),
+ .RDATA_B1_o(C1DATA_TOTAL[17:0]),
+ .RDATA_B2_o(C1DATA_TOTAL[35:18]),
+ .ADDR_B1_i(PORT_B_ADDR),
+ .ADDR_B2_i(PORT_B_ADDR),
+ .CLK_B1_i(CLK2_i),
+ .CLK_B2_i(CLK2_i),
+ .REN_B1_i(REN2_i),
+ .REN_B2_i(REN2_i),
+ .WEN_B1_i(WEN2_i),
+ .WEN_B2_i(WEN2_i),
+ .BE_B1_i(WR2_BE[1:0]),
+ .BE_B2_i(WR2_BE[3:0]),
+
+ .FLUSH1_i(FLUSH1),
+ .FLUSH2_i(FLUSH2)
+ );
+ end
+endcase
+
+endmodule
+
// ============================================================================
// TDP36K write width 1 functional modes
@@ -1492,6 +7088,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X1_RD_X2_nonsplit (
@@ -1564,6 +7199,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X1_RD_X4_nonsplit (
@@ -1636,6 +7310,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X1_RD_X9_nonsplit (
@@ -1708,6 +7421,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X1_RD_X18_nonsplit (
@@ -1780,6 +7532,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X1_RD_X36_nonsplit (
@@ -1852,6 +7643,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
// ============================================================================
@@ -1927,6 +7757,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X2_RD_X2_nonsplit (
@@ -1999,6 +7868,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X2_RD_X4_nonsplit (
@@ -2071,6 +7979,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X2_RD_X9_nonsplit (
@@ -2143,6 +8090,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X2_RD_X18_nonsplit (
@@ -2215,6 +8201,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X2_RD_X36_nonsplit (
@@ -2287,6 +8312,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
// ============================================================================
@@ -2362,6 +8426,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X4_RD_X2_nonsplit (
@@ -2434,6 +8537,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X4_RD_X4_nonsplit (
@@ -2506,6 +8648,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X4_RD_X9_nonsplit (
@@ -2578,6 +8759,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X4_RD_X18_nonsplit (
@@ -2650,6 +8870,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X4_RD_X36_nonsplit (
@@ -2722,6 +8981,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
// ============================================================================
@@ -2797,6 +9095,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X9_RD_X2_nonsplit (
@@ -2869,6 +9206,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X9_RD_X4_nonsplit (
@@ -2941,6 +9317,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X9_RD_X9_nonsplit (
@@ -3013,6 +9428,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X9_RD_X18_nonsplit (
@@ -3085,6 +9539,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X9_RD_X36_nonsplit (
@@ -3157,6 +9650,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
// ============================================================================
@@ -3232,6 +9764,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X18_RD_X2_nonsplit (
@@ -3304,6 +9875,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X18_RD_X4_nonsplit (
@@ -3376,6 +9986,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X18_RD_X9_nonsplit (
@@ -3448,6 +10097,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X18_RD_X18_nonsplit (
@@ -3520,6 +10208,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X18_RD_X36_nonsplit (
@@ -3592,6 +10319,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
// ============================================================================
@@ -3667,6 +10433,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X36_RD_X2_nonsplit (
@@ -3739,6 +10544,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X36_RD_X4_nonsplit (
@@ -3811,6 +10655,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X36_RD_X9_nonsplit (
@@ -3882,6 +10765,45 @@
.RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
.FLUSH2_i (FLUSH2_i)
);
+
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
endmodule
@@ -3955,6 +10877,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X36_RD_X36_nonsplit (
@@ -4027,6 +10988,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
// ============================================================================
@@ -4102,6 +11102,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X1_RD_X2_split (
@@ -4174,6 +11213,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X1_RD_X4_split (
@@ -4246,6 +11324,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X1_RD_X9_split (
@@ -4318,6 +11435,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X1_RD_X18_split (
@@ -4390,6 +11546,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
// ============================================================================
@@ -4465,6 +11660,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X2_RD_X2_split (
@@ -4537,6 +11771,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X2_RD_X4_split (
@@ -4609,6 +11882,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X2_RD_X9_split (
@@ -4681,6 +11993,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X2_RD_X18_split (
@@ -4753,6 +12104,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
// ============================================================================
@@ -4828,6 +12218,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X4_RD_X2_split (
@@ -4900,6 +12329,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X4_RD_X4_split (
@@ -4972,6 +12440,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X4_RD_X9_split (
@@ -5044,6 +12551,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X4_RD_X18_split (
@@ -5116,6 +12662,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
// ============================================================================
@@ -5191,6 +12776,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X9_RD_X2_split (
@@ -5263,6 +12887,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X9_RD_X4_split (
@@ -5335,6 +12998,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X9_RD_X9_split (
@@ -5407,6 +13109,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X9_RD_X18_split (
@@ -5479,6 +13220,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
// ============================================================================
@@ -5554,6 +13334,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X18_RD_X2_split (
@@ -5626,6 +13445,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X18_RD_X4_split (
@@ -5698,6 +13556,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X18_RD_X9_split (
@@ -5770,6 +13667,45 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
module TDP36K_BRAM_WR_X18_RD_X18_split (
@@ -5842,5 +13778,6298 @@
.FLUSH2_i (FLUSH2_i)
);
+`ifdef SDF_SIM
+ specify
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
endmodule
+//=================================================================================
+
+module SFIFO_18K_BLK (
+ DIN,
+ PUSH,
+ POP,
+ CLK,
+ Async_Flush,
+ Overrun_Error,
+ Full_Watermark,
+ Almost_Full,
+ Full,
+ Underrun_Error,
+ Empty_Watermark,
+ Almost_Empty,
+ Empty,
+ DOUT
+);
+
+ parameter WR_DATA_WIDTH = 18;
+ parameter RD_DATA_WIDTH = 18;
+ parameter UPAE_DBITS = 11'd10;
+ parameter UPAF_DBITS = 11'd10;
+
+ input wire CLK;
+ input wire PUSH, POP;
+ input wire [WR_DATA_WIDTH-1:0] DIN;
+ input wire Async_Flush;
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
+ output wire Almost_Full, Almost_Empty;
+ output wire Full, Empty;
+ output wire Full_Watermark, Empty_Watermark;
+ output wire Overrun_Error, Underrun_Error;
+
+ BRAM2x18_SFIFO #(
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .UPAE_DBITS1(UPAE_DBITS),
+ .UPAF_DBITS1(UPAF_DBITS),
+ .UPAE_DBITS2(),
+ .UPAF_DBITS2()
+ ) U1
+ (
+ .DIN1(DIN),
+ .PUSH1(PUSH),
+ .POP1(POP),
+ .CLK1(CLK),
+ .Async_Flush1(Async_Flush),
+ .Overrun_Error1(Overrun_Error),
+ .Full_Watermark1(Full_Watermark),
+ .Almost_Full1(Almost_Full),
+ .Full1(Full),
+ .Underrun_Error1(Underrun_Error),
+ .Empty_Watermark1(Empty_Watermark),
+ .Almost_Empty1(Almost_Empty),
+ .Empty1(Empty),
+ .DOUT1(DOUT),
+
+ .DIN2(),
+ .PUSH2(),
+ .POP2(),
+ .CLK2(),
+ .Async_Flush2(),
+ .Overrun_Error2(),
+ .Full_Watermark2(),
+ .Almost_Full2(),
+ .Full2(),
+ .Underrun_Error2(),
+ .Empty_Watermark2(),
+ .Almost_Empty2(),
+ .Empty2(),
+ .DOUT2()
+ );
+
+endmodule
+
+module AFIFO_18K_BLK (
+ DIN,
+ PUSH,
+ POP,
+ Push_Clk,
+ Pop_Clk,
+ Async_Flush,
+ Overrun_Error,
+ Full_Watermark,
+ Almost_Full,
+ Full,
+ Underrun_Error,
+ Empty_Watermark,
+ Almost_Empty,
+ Empty,
+ DOUT
+);
+
+ parameter WR_DATA_WIDTH = 18;
+ parameter RD_DATA_WIDTH = 18;
+ parameter UPAE_DBITS = 11'd10;
+ parameter UPAF_DBITS = 11'd10;
+
+ input wire Push_Clk, Pop_Clk;
+ input wire PUSH, POP;
+ input wire [WR_DATA_WIDTH-1:0] DIN;
+ input wire Async_Flush;
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
+ output wire Almost_Full, Almost_Empty;
+ output wire Full, Empty;
+ output wire Full_Watermark, Empty_Watermark;
+ output wire Overrun_Error, Underrun_Error;
+
+ BRAM2x18_AFIFO #(
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .UPAE_DBITS1(UPAE_DBITS),
+ .UPAF_DBITS1(UPAF_DBITS),
+ .UPAE_DBITS2(),
+ .UPAF_DBITS2()
+ ) U1
+ (
+ .DIN1(DIN),
+ .PUSH1(PUSH),
+ .POP1(POP),
+ .Push_Clk1(Push_Clk),
+ .Pop_Clk1(Pop_Clk),
+ .Async_Flush1(Async_Flush),
+ .Overrun_Error1(Overrun_Error),
+ .Full_Watermark1(Full_Watermark),
+ .Almost_Full1(Almost_Full),
+ .Full1(Full),
+ .Underrun_Error1(Underrun_Error),
+ .Empty_Watermark1(Empty_Watermark),
+ .Almost_Empty1(Almost_Empty),
+ .Empty1(Empty),
+ .DOUT1(DOUT),
+
+ .DIN2(),
+ .PUSH2(),
+ .POP2(),
+ .Push_Clk2(),
+ .Pop_Clk2(),
+ .Async_Flush2(),
+ .Overrun_Error2(),
+ .Full_Watermark2(),
+ .Almost_Full2(),
+ .Full2(),
+ .Underrun_Error2(),
+ .Empty_Watermark2(),
+ .Almost_Empty2(),
+ .Empty2(),
+ .DOUT2()
+ );
+
+endmodule
+
+module BRAM2x18_SFIFO (
+ DIN1,
+ PUSH1,
+ POP1,
+ CLK1,
+ Async_Flush1,
+ Overrun_Error1,
+ Full_Watermark1,
+ Almost_Full1,
+ Full1,
+ Underrun_Error1,
+ Empty_Watermark1,
+ Almost_Empty1,
+ Empty1,
+ DOUT1,
+
+ DIN2,
+ PUSH2,
+ POP2,
+ CLK2,
+ Async_Flush2,
+ Overrun_Error2,
+ Full_Watermark2,
+ Almost_Full2,
+ Full2,
+ Underrun_Error2,
+ Empty_Watermark2,
+ Almost_Empty2,
+ Empty2,
+ DOUT2
+);
+
+ parameter WR_DATA_WIDTH = 18;
+ parameter RD_DATA_WIDTH = 18;
+
+
+ parameter UPAE_DBITS1 = 11'd10;
+ parameter UPAF_DBITS1 = 11'd10;
+
+ parameter UPAE_DBITS2 = 11'd10;
+ parameter UPAF_DBITS2 = 11'd10;
+
+ localparam MODE_36 = 3'b011; // 36- or 32-bit
+ localparam MODE_18 = 3'b010; // 18- or 16-bit
+ localparam MODE_9 = 3'b001; // 9- or 8-bit
+ localparam MODE_4 = 3'b100; // 4-bit
+ localparam MODE_2 = 3'b110; // 2-bit
+ localparam MODE_1 = 3'b101; // 1-bit
+
+ input wire CLK1;
+ input wire PUSH1, POP1;
+ input wire [WR_DATA_WIDTH-1:0] DIN1;
+ input wire Async_Flush1;
+ output wire [RD_DATA_WIDTH-1:0] DOUT1;
+ output wire Almost_Full1, Almost_Empty1;
+ output wire Full1, Empty1;
+ output wire Full_Watermark1, Empty_Watermark1;
+ output wire Overrun_Error1, Underrun_Error1;
+
+ input wire CLK2;
+ input wire PUSH2, POP2;
+ input wire [WR_DATA_WIDTH-1:0] DIN2;
+ input wire Async_Flush2;
+ output wire [RD_DATA_WIDTH-1:0] DOUT2;
+ output wire Almost_Full2, Almost_Empty2;
+ output wire Full2, Empty2;
+ output wire Full_Watermark2, Empty_Watermark2;
+ output wire Overrun_Error2, Underrun_Error2;
+
+ wire [17:0] in_reg1;
+ wire [17:0] out_reg1;
+ wire [17:0] fifo1_flags;
+
+ wire [17:0] in_reg2;
+ wire [17:0] out_reg2;
+ wire [17:0] fifo2_flags;
+
+ wire Push_Clk1, Pop_Clk1;
+ wire Push_Clk2, Pop_Clk2;
+ assign Push_Clk1 = CLK1;
+ assign Pop_Clk1 = CLK1;
+ assign Push_Clk2 = CLK2;
+ assign Pop_Clk2 = CLK2;
+
+ assign Overrun_Error1 = fifo1_flags[0];
+ assign Full_Watermark1 = fifo1_flags[1];
+ assign Almost_Full1 = fifo1_flags[2];
+ assign Full1 = fifo1_flags[3];
+ assign Underrun_Error1 = fifo1_flags[4];
+ assign Empty_Watermark1 = fifo1_flags[5];
+ assign Almost_Empty1 = fifo1_flags[6];
+ assign Empty1 = fifo1_flags[7];
+
+ assign Overrun_Error2 = fifo2_flags[0];
+ assign Full_Watermark2 = fifo2_flags[1];
+ assign Almost_Full2 = fifo2_flags[2];
+ assign Full2 = fifo2_flags[3];
+ assign Underrun_Error2 = fifo2_flags[4];
+ assign Empty_Watermark2 = fifo2_flags[5];
+ assign Almost_Empty2 = fifo2_flags[6];
+ assign Empty2 = fifo2_flags[7];
+
+ generate
+ if (WR_DATA_WIDTH == 18) begin
+ assign in_reg1[17:0] = DIN1[17:0];
+ assign in_reg2[17:0] = DIN2[17:0];
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
+ assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
+ end else begin
+ assign in_reg1[17:WR_DATA_WIDTH] = 0;
+ assign in_reg1[WR_DATA_WIDTH-1:0] = DIN1[WR_DATA_WIDTH-1:0];
+ assign in_reg2[17:WR_DATA_WIDTH] = 0;
+ assign in_reg2[WR_DATA_WIDTH-1:0] = DIN2[WR_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+ case (RD_DATA_WIDTH)
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ endcase
+ end
+ endcase
+
+ generate
+ if (RD_DATA_WIDTH == 9) begin
+ assign DOUT1[RD_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
+ assign DOUT2[RD_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
+ end else begin
+ assign DOUT1[RD_DATA_WIDTH-1:0] = out_reg1[RD_DATA_WIDTH-1:0];
+ assign DOUT2[RD_DATA_WIDTH-1:0] = out_reg2[RD_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+endmodule
+
+module BRAM2x18_AFIFO (
+ DIN1,
+ PUSH1,
+ POP1,
+ Push_Clk1,
+ Pop_Clk1,
+ Async_Flush1,
+ Overrun_Error1,
+ Full_Watermark1,
+ Almost_Full1,
+ Full1,
+ Underrun_Error1,
+ Empty_Watermark1,
+ Almost_Empty1,
+ Empty1,
+ DOUT1,
+
+ DIN2,
+ PUSH2,
+ POP2,
+ Push_Clk2,
+ Pop_Clk2,
+ Async_Flush2,
+ Overrun_Error2,
+ Full_Watermark2,
+ Almost_Full2,
+ Full2,
+ Underrun_Error2,
+ Empty_Watermark2,
+ Almost_Empty2,
+ Empty2,
+ DOUT2
+);
+
+ parameter WR_DATA_WIDTH = 18;
+ parameter RD_DATA_WIDTH = 18;
+
+
+ parameter UPAE_DBITS1 = 11'd10;
+ parameter UPAF_DBITS1 = 11'd10;
+
+ parameter UPAE_DBITS2 = 11'd10;
+ parameter UPAF_DBITS2 = 11'd10;
+
+ localparam MODE_36 = 3'b011; // 36- or 32-bit
+ localparam MODE_18 = 3'b010; // 18- or 16-bit
+ localparam MODE_9 = 3'b001; // 9- or 8-bit
+ localparam MODE_4 = 3'b100; // 4-bit
+ localparam MODE_2 = 3'b110; // 2-bit
+ localparam MODE_1 = 3'b101; // 1-bit
+
+ input wire Push_Clk1, Pop_Clk1;
+ input wire PUSH1, POP1;
+ input wire [WR_DATA_WIDTH-1:0] DIN1;
+ input wire Async_Flush1;
+ output wire [RD_DATA_WIDTH-1:0] DOUT1;
+ output wire Almost_Full1, Almost_Empty1;
+ output wire Full1, Empty1;
+ output wire Full_Watermark1, Empty_Watermark1;
+ output wire Overrun_Error1, Underrun_Error1;
+
+ input wire Push_Clk2, Pop_Clk2;
+ input wire PUSH2, POP2;
+ input wire [WR_DATA_WIDTH-1:0] DIN2;
+ input wire Async_Flush2;
+ output wire [RD_DATA_WIDTH-1:0] DOUT2;
+ output wire Almost_Full2, Almost_Empty2;
+ output wire Full2, Empty2;
+ output wire Full_Watermark2, Empty_Watermark2;
+ output wire Overrun_Error2, Underrun_Error2;
+
+ wire [17:0] in_reg1;
+ wire [17:0] out_reg1;
+ wire [17:0] fifo1_flags;
+
+ wire [17:0] in_reg2;
+ wire [17:0] out_reg2;
+ wire [17:0] fifo2_flags;
+
+ assign Overrun_Error1 = fifo1_flags[0];
+ assign Full_Watermark1 = fifo1_flags[1];
+ assign Almost_Full1 = fifo1_flags[2];
+ assign Full1 = fifo1_flags[3];
+ assign Underrun_Error1 = fifo1_flags[4];
+ assign Empty_Watermark1 = fifo1_flags[5];
+ assign Almost_Empty1 = fifo1_flags[6];
+ assign Empty1 = fifo1_flags[7];
+
+ assign Overrun_Error2 = fifo2_flags[0];
+ assign Full_Watermark2 = fifo2_flags[1];
+ assign Almost_Full2 = fifo2_flags[2];
+ assign Full2 = fifo2_flags[3];
+ assign Underrun_Error2 = fifo2_flags[4];
+ assign Empty_Watermark2 = fifo2_flags[5];
+ assign Almost_Empty2 = fifo2_flags[6];
+ assign Empty2 = fifo2_flags[7];
+
+ generate
+ if (WR_DATA_WIDTH == 18) begin
+ assign in_reg1[17:0] = DIN1[17:0];
+ assign in_reg2[17:0] = DIN2[17:0];
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
+ assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
+ end else begin
+ assign in_reg1[17:WR_DATA_WIDTH] = 0;
+ assign in_reg1[WR_DATA_WIDTH-1:0] = DIN1[WR_DATA_WIDTH-1:0];
+ assign in_reg2[17:WR_DATA_WIDTH] = 0;
+ assign in_reg2[WR_DATA_WIDTH-1:0] = DIN2[WR_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+ case (RD_DATA_WIDTH)
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b0
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b0
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b1,
+ UPAF_DBITS2, UPAE_DBITS2, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0,
+ 1'b0, UPAF_DBITS1, 1'b0, UPAE_DBITS1, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* is_split = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg1[17:0]),
+ .WDATA_A2_i(in_reg2[17:0]),
+ .RDATA_A1_o(fifo1_flags),
+ .RDATA_A2_o(fifo2_flags),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk1),
+ .CLK_A2_i(Push_Clk2),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b1),
+ .WEN_A1_i(PUSH1),
+ .WEN_A2_i(PUSH2),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg1[17:0]),
+ .RDATA_B2_o(out_reg2[17:0]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk1),
+ .CLK_B2_i(Pop_Clk2),
+ .REN_B1_i(POP1),
+ .REN_B2_i(POP2),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush1),
+ .FLUSH2_i(Async_Flush2)
+ );
+ end
+ endcase
+ end
+ endcase
+
+ generate
+ if (RD_DATA_WIDTH == 9) begin
+ assign DOUT1[RD_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
+ assign DOUT2[RD_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
+ end else begin
+ assign DOUT1[RD_DATA_WIDTH-1:0] = out_reg1[RD_DATA_WIDTH-1:0];
+ assign DOUT2[RD_DATA_WIDTH-1:0] = out_reg2[RD_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+endmodule
+
+module SFIFO_36K_BLK (
+ DIN,
+ PUSH,
+ POP,
+ CLK,
+ Async_Flush,
+ Overrun_Error,
+ Full_Watermark,
+ Almost_Full,
+ Full,
+ Underrun_Error,
+ Empty_Watermark,
+ Almost_Empty,
+ Empty,
+ DOUT
+);
+
+ parameter WR_DATA_WIDTH = 36;
+ parameter RD_DATA_WIDTH = 36;
+ parameter UPAE_DBITS = 12'd10;
+ parameter UPAF_DBITS = 12'd10;
+
+ localparam MODE_36 = 3'b011; // 36- or 32-bit
+ localparam MODE_18 = 3'b010; // 18- or 16-bit
+ localparam MODE_9 = 3'b001; // 9- or 8-bit
+ localparam MODE_4 = 3'b100; // 4-bit
+ localparam MODE_2 = 3'b110; // 2-bit
+ localparam MODE_1 = 3'b101; // 1-bit
+
+ input wire CLK;
+ input wire PUSH, POP;
+ input wire [WR_DATA_WIDTH-1:0] DIN;
+ input wire Async_Flush;
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
+ output wire Almost_Full, Almost_Empty;
+ output wire Full, Empty;
+ output wire Full_Watermark, Empty_Watermark;
+ output wire Overrun_Error, Underrun_Error;
+
+ wire [35:0] in_reg;
+ wire [35:0] out_reg;
+ wire [17:0] fifo_flags;
+
+ wire [35:0] RD_DATA_CMPL;
+ wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+
+ wire Push_Clk, Pop_Clk;
+
+ assign Push_Clk = CLK;
+ assign Pop_Clk = CLK;
+
+ assign Overrun_Error = fifo_flags[0];
+ assign Full_Watermark = fifo_flags[1];
+ assign Almost_Full = fifo_flags[2];
+ assign Full = fifo_flags[3];
+ assign Underrun_Error = fifo_flags[4];
+ assign Empty_Watermark = fifo_flags[5];
+ assign Almost_Empty = fifo_flags[6];
+ assign Empty = fifo_flags[7];
+
+ generate
+ if (WR_DATA_WIDTH == 36) begin
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+ end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+ assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16];
+ assign in_reg[17:0] = {2'b00,DIN[15:0]};
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]};
+ end else begin
+ assign in_reg[35:WR_DATA_WIDTH] = 0;
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+ generate
+ if (RD_DATA_WIDTH == 36) begin
+ assign RD_DATA_CMPL = out_reg;
+ end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+ assign RD_DATA_CMPL = {2'b00,out_reg[35:18],out_reg[15:0]};
+ end else if (RD_DATA_WIDTH == 9) begin
+ assign RD_DATA_CMPL = { 27'h0, out_reg[16], out_reg[7:0]};
+ end else begin
+ assign RD_DATA_CMPL = {18'h0, out_reg[17:0]};
+ end
+ endgenerate
+
+ case (RD_DATA_WIDTH)
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_36, MODE_9, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_36, MODE_9, MODE_36, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_36, MODE_18, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_36, MODE_18, MODE_36, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ endcase
+ end
+ 32, 36: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_9, MODE_36, MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_9, MODE_36, MODE_9, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_18, MODE_36, MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_18, MODE_36, MODE_18, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b1
+ };
+ (* is_fifo = 1 *)
+ (* sync_fifo = 1 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+ end
+ endcase
+ end
+ endcase
+
+ assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_CMPL[RD_DATA_WIDTH-1 : 0];
+
+endmodule
+
+module AFIFO_36K_BLK (
+ DIN,
+ PUSH,
+ POP,
+ Push_Clk,
+ Pop_Clk,
+ Async_Flush,
+ Overrun_Error,
+ Full_Watermark,
+ Almost_Full,
+ Full,
+ Underrun_Error,
+ Empty_Watermark,
+ Almost_Empty,
+ Empty,
+ DOUT
+);
+
+ parameter WR_DATA_WIDTH = 36;
+ parameter RD_DATA_WIDTH = 36;
+ parameter UPAE_DBITS = 12'd10;
+ parameter UPAF_DBITS = 12'd10;
+
+ localparam MODE_36 = 3'b011; // 36- or 32-bit
+ localparam MODE_18 = 3'b010; // 18- or 16-bit
+ localparam MODE_9 = 3'b001; // 9- or 8-bit
+ localparam MODE_4 = 3'b100; // 4-bit
+ localparam MODE_2 = 3'b110; // 2-bit
+ localparam MODE_1 = 3'b101; // 1-bit
+
+ input wire Push_Clk, Pop_Clk;
+ input wire PUSH, POP;
+ input wire [WR_DATA_WIDTH-1:0] DIN;
+ input wire Async_Flush;
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
+ output wire Almost_Full, Almost_Empty;
+ output wire Full, Empty;
+ output wire Full_Watermark, Empty_Watermark;
+ output wire Overrun_Error, Underrun_Error;
+
+ wire [35:0] in_reg;
+ wire [35:0] out_reg;
+ wire [17:0] fifo_flags;
+
+ wire [35:0] RD_DATA_CMPL;
+ wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
+
+ assign Overrun_Error = fifo_flags[0];
+ assign Full_Watermark = fifo_flags[1];
+ assign Almost_Full = fifo_flags[2];
+ assign Full = fifo_flags[3];
+ assign Underrun_Error = fifo_flags[4];
+ assign Empty_Watermark = fifo_flags[5];
+ assign Almost_Empty = fifo_flags[6];
+ assign Empty = fifo_flags[7];
+
+ generate
+ if (WR_DATA_WIDTH == 36) begin
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+ end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
+ assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16];
+ assign in_reg[17:0] = {2'b00,DIN[15:0]};
+ end else if (WR_DATA_WIDTH == 9) begin
+ assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]};
+ end else begin
+ assign in_reg[35:WR_DATA_WIDTH] = 0;
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
+ end
+ endgenerate
+
+ generate
+ if (RD_DATA_WIDTH == 36) begin
+ assign RD_DATA_CMPL = out_reg;
+ end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
+ assign RD_DATA_CMPL = {2'b00,out_reg[35:18],out_reg[15:0]};
+ end else if (RD_DATA_WIDTH == 9) begin
+ assign RD_DATA_CMPL = { 27'h0, out_reg[16], out_reg[7:0]};
+ end else begin
+ assign RD_DATA_CMPL = {18'h0, out_reg[17:0]};
+ end
+ endgenerate
+
+ case (RD_DATA_WIDTH)
+ 8, 9: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_18, MODE_9, MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_18, MODE_9, MODE_18, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_36, MODE_9, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_36, MODE_9, MODE_36, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ endcase
+ end
+ 16, 18: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_9, MODE_18, MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_9, MODE_18, MODE_9, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_36, MODE_18, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_36, MODE_18, MODE_36, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ endcase
+ end
+ 32, 36: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_9, MODE_36, MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_9, MODE_36, MODE_9, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_18, MODE_36, MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_18, MODE_36, MODE_18, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ endcase
+ end
+ default: begin
+ case (WR_DATA_WIDTH)
+ 8, 9: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_9, MODE_9, MODE_9, MODE_9, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_9, MODE_9, MODE_9, MODE_9, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ 16, 18: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_18, MODE_18, MODE_18, MODE_18, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_18, MODE_18, MODE_18, MODE_18, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ 32, 36: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ default: begin
+ defparam U1.MODE_BITS = { 1'b0,
+ 11'd10, 11'd10, 4'd0, MODE_36, MODE_36, MODE_36, MODE_36, 1'd0,
+ UPAF_DBITS, UPAE_DBITS, 4'h1, MODE_36, MODE_36, MODE_36, MODE_36, 1'b0
+ };
+
+ (* is_fifo = 1 *)
+ (* sync_fifo = 0 *)
+ (* rd_data_width = RD_DATA_WIDTH *)
+ (* wr_data_width = WR_DATA_WIDTH *)
+ TDP36K U1 (
+ .RESET_ni(1'b1),
+ .WDATA_A1_i(in_reg[17:0]),
+ .WDATA_A2_i(in_reg[35:18]),
+ .RDATA_A1_o(fifo_flags),
+ .RDATA_A2_o(),
+ .ADDR_A1_i(14'h0),
+ .ADDR_A2_i(14'h0),
+ .CLK_A1_i(Push_Clk),
+ .CLK_A2_i(1'b0),
+ .REN_A1_i(1'b1),
+ .REN_A2_i(1'b0),
+ .WEN_A1_i(PUSH),
+ .WEN_A2_i(1'b0),
+ .BE_A1_i(2'b11),
+ .BE_A2_i(2'b11),
+
+ .WDATA_B1_i(18'h0),
+ .WDATA_B2_i(18'h0),
+ .RDATA_B1_o(out_reg[17:0]),
+ .RDATA_B2_o(out_reg[35:18]),
+ .ADDR_B1_i(14'h0),
+ .ADDR_B2_i(14'h0),
+ .CLK_B1_i(Pop_Clk),
+ .CLK_B2_i(1'b0),
+ .REN_B1_i(POP),
+ .REN_B2_i(1'b0),
+ .WEN_B1_i(1'b0),
+ .WEN_B2_i(1'b0),
+ .BE_B1_i(2'b11),
+ .BE_B2_i(2'b11),
+
+ .FLUSH1_i(Async_Flush),
+ .FLUSH2_i(1'b0)
+ );
+
+ end
+ endcase
+ end
+ endcase
+
+ assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_CMPL[RD_DATA_WIDTH-1 : 0];
+
+endmodule
+
+//===============================================================================
+module TDP36K_FIFO_ASYNC_WR_X9_RD_X9_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X9_RD_X18_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X9_RD_X36_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X18_RD_X9_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X18_RD_X18_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X18_RD_X36_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X36_RD_X9_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X36_RD_X18_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X36_RD_X36_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+
+module TDP36K_FIFO_ASYNC_WR_X9_RD_X9_split (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X9_RD_X18_split (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X18_RD_X9_split (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_ASYNC_WR_X18_RD_X18_split (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X9_RD_X9_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X9_RD_X18_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X9_RD_X36_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X18_RD_X9_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X18_RD_X18_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X18_RD_X36_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X36_RD_X9_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X36_RD_X18_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X36_RD_X36_nonsplit (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+
+module TDP36K_FIFO_SYNC_WR_X9_RD_X9_split (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X9_RD_X18_split (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X18_RD_X9_split (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
+
+module TDP36K_FIFO_SYNC_WR_X18_RD_X18_split (
+ RESET_ni,
+ 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,
+ 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
+);
+ parameter [80:0] MODE_BITS = 81'd0;
+
+ input wire RESET_ni;
+ input wire WEN_A1_i, WEN_B1_i;
+ input wire REN_A1_i, REN_B1_i;
+ input wire WEN_A2_i, WEN_B2_i;
+ input wire REN_A2_i, REN_B2_i;
+
+ (* clkbuf_sink *)
+ input wire CLK_A1_i;
+ (* clkbuf_sink *)
+ input wire CLK_B1_i;
+ (* clkbuf_sink *)
+ input wire CLK_A2_i;
+ (* clkbuf_sink *)
+ input wire CLK_B2_i;
+
+ input wire [ 1:0] BE_A1_i, BE_B1_i;
+ input wire [14:0] ADDR_A1_i, ADDR_B1_i;
+ input wire [17:0] WDATA_A1_i, WDATA_B1_i;
+ output wire [17:0] RDATA_A1_o, RDATA_B1_o;
+
+ input wire FLUSH1_i;
+
+ input wire [ 1:0] BE_A2_i, BE_B2_i;
+ input wire [13:0] ADDR_A2_i, ADDR_B2_i;
+ input wire [17:0] WDATA_A2_i, WDATA_B2_i;
+ output wire [17:0] RDATA_A2_o, RDATA_B2_o;
+
+ input wire FLUSH2_i;
+
+ TDP36K #(.MODE_BITS(MODE_BITS)) bram (
+ .RESET_ni (RESET_ni),
+ .WEN_A1_i (WEN_A1_i), .WEN_B1_i (WEN_B1_i),
+ .REN_A1_i (REN_A1_i), .REN_B1_i (REN_B1_i),
+ .CLK_A1_i (CLK_A1_i), .CLK_B1_i (CLK_B1_i),
+ .BE_A1_i (BE_A1_i), .BE_B1_i (BE_B1_i),
+ .ADDR_A1_i (ADDR_A1_i), .ADDR_B1_i (ADDR_B1_i),
+ .WDATA_A1_i (WDATA_A1_i), .WDATA_B1_i (WDATA_B1_i),
+ .RDATA_A1_o (RDATA_A1_o), .RDATA_B1_o (RDATA_B1_o),
+ .FLUSH1_i (FLUSH1_i),
+ .WEN_A2_i (WEN_A2_i), .WEN_B2_i (WEN_B2_i),
+ .REN_A2_i (REN_A2_i), .REN_B2_i (REN_B2_i),
+ .CLK_A2_i (CLK_A2_i), .CLK_B2_i (CLK_B2_i),
+ .BE_A2_i (BE_A2_i), .BE_B2_i (BE_B2_i),
+ .ADDR_A2_i (ADDR_A2_i), .ADDR_B2_i (ADDR_B2_i),
+ .WDATA_A2_i (WDATA_A2_i), .WDATA_B2_i (WDATA_B2_i),
+ .RDATA_A2_o (RDATA_A2_o), .RDATA_B2_o (RDATA_B2_o),
+ .FLUSH2_i (FLUSH2_i)
+ );
+
+`ifdef SDF_SIM
+ specify
+ (FLUSH1_i => RDATA_A1_o[0]) = 0;
+ (FLUSH1_i => RDATA_A1_o[1]) = 0;
+ (FLUSH1_i => RDATA_A1_o[2]) = 0;
+ (FLUSH1_i => RDATA_A1_o[3]) = 0;
+ (FLUSH1_i => RDATA_A1_o[4]) = 0;
+ (FLUSH1_i => RDATA_A1_o[5]) = 0;
+ (FLUSH1_i => RDATA_A1_o[6]) = 0;
+ (FLUSH1_i => RDATA_A1_o[7]) = 0;
+ (FLUSH2_i => RDATA_A2_o[0]) = 0;
+ (FLUSH2_i => RDATA_A2_o[1]) = 0;
+ (FLUSH2_i => RDATA_A2_o[2]) = 0;
+ (FLUSH2_i => RDATA_A2_o[3]) = 0;
+ (FLUSH2_i => RDATA_A2_o[4]) = 0;
+ (FLUSH2_i => RDATA_A2_o[5]) = 0;
+ (FLUSH2_i => RDATA_A2_o[6]) = 0;
+ (FLUSH2_i => RDATA_A2_o[7]) = 0;
+ (negedge RESET_ni => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (negedge RESET_ni => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (negedge RESET_ni => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (negedge RESET_ni => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ (posedge CLK_A1_i => (RDATA_A1_o +: WDATA_A1_i)) = 0;
+ (posedge CLK_B1_i => (RDATA_B1_o +: WDATA_B1_i)) = 0;
+ (posedge CLK_A2_i => (RDATA_A2_o +: WDATA_A2_i)) = 0;
+ (posedge CLK_B2_i => (RDATA_B2_o +: WDATA_B2_i)) = 0;
+ $setuphold(posedge CLK_A1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A1_i, FLUSH1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WEN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, REN_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, BE_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, ADDR_A1_i, 0, 0);
+ $setuphold(posedge CLK_A1_i, WDATA_A1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B1_i, WEN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, REN_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, BE_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, ADDR_B1_i, 0, 0);
+ $setuphold(posedge CLK_B1_i, WDATA_B1_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_A2_i, FLUSH2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WEN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, REN_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, BE_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, ADDR_A2_i, 0, 0);
+ $setuphold(posedge CLK_A2_i, WDATA_A2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, RESET_ni, 0, 0);
+ $setuphold(posedge CLK_B2_i, WEN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, REN_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, BE_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, ADDR_B2_i, 0, 0);
+ $setuphold(posedge CLK_B2_i, WDATA_B2_i, 0, 0);
+ endspecify
+`endif
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
index 0818d36..d2fc0a7 100644
--- a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
+++ b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
@@ -14,6 +14,8 @@
//
// SPDX-License-Identifier: Apache-2.0
+`timescale 1ps/1ps
+
`default_nettype none
(* abc9_flop, lib_whitebox *)
diff --git a/ql-qlf-plugin/synth_quicklogic.cc b/ql-qlf-plugin/synth_quicklogic.cc
index a8e830c..b6b475e 100644
--- a/ql-qlf-plugin/synth_quicklogic.cc
+++ b/ql-qlf-plugin/synth_quicklogic.cc
@@ -393,6 +393,18 @@
"%%i a:rd_data_width=%d %%i",
ww.second, rw.second, ww.first, rw.first);
run(cmd);
+
+ auto cmd1 = stringf("chtype -set TDP36K_FIFO_ASYNC_WR_X%d_RD_X%d_split t:TDP36K a:is_fifo=1 %%i a:sync_fifo=0 %%i "
+ "a:is_split=1 %%i a:wr_data_width=%d "
+ "%%i a:rd_data_width=%d %%i",
+ ww.second, rw.second, ww.first, rw.first);
+ run(cmd1);
+
+ auto cmd2 = stringf("chtype -set TDP36K_FIFO_SYNC_WR_X%d_RD_X%d_split t:TDP36K a:is_fifo=1 %%i a:sync_fifo=1 %%i "
+ "a:is_split=1 %%i a:wr_data_width=%d "
+ "%%i a:rd_data_width=%d %%i",
+ ww.second, rw.second, ww.first, rw.first);
+ run(cmd2);
}
}
@@ -402,6 +414,16 @@
"chtype -set TDP36K_BRAM_WR_X%d_RD_X%d_nonsplit t:TDP36K a:is_inferred=1 %%i a:wr_data_width=%d %%i a:rd_data_width=%d %%i",
ww.second, rw.second, ww.first, rw.first);
run(cmd);
+
+ auto cmd1 = stringf("chtype -set TDP36K_FIFO_ASYNC_WR_X%d_RD_X%d_nonsplit t:TDP36K a:is_fifo=1 %%i a:sync_fifo=0 %%i "
+ "a:wr_data_width=%d %%i a:rd_data_width=%d %%i",
+ ww.second, rw.second, ww.first, rw.first);
+ run(cmd1);
+
+ auto cmd2 = stringf("chtype -set TDP36K_FIFO_SYNC_WR_X%d_RD_X%d_nonsplit t:TDP36K a:is_fifo=1 %%i a:sync_fifo=1 %%i "
+ "a:wr_data_width=%d %%i a:rd_data_width=%d %%i",
+ ww.second, rw.second, ww.first, rw.first);
+ run(cmd2);
}
}
}
diff --git a/ql-qlf-plugin/tests/Makefile b/ql-qlf-plugin/tests/Makefile
index 661e92e..cd1c7e1 100644
--- a/ql-qlf-plugin/tests/Makefile
+++ b/ql-qlf-plugin/tests/Makefile
@@ -37,26 +37,39 @@
# qlf_k6n10_bram \
SIM_TESTS = \
- qlf_k6n10f/sim_dsp_mult_cfg_ports \
- qlf_k6n10f/sim_dsp_mult_cfg_params \
- qlf_k6n10f/sim_dsp_mult_r_cfg_ports \
- qlf_k6n10f/sim_dsp_mult_r_cfg_params \
- qlf_k6n10f/sim_dsp_fir_cfg_ports \
- qlf_k6n10f/sim_dsp_fir_cfg_params \
- qlf_k6n10f/sim_dsp_simd_cfg_ports \
- qlf_k6n10f/sim_dsp_simd_cfg_params \
- qlf_k6n10f/sim_tc36fifo
+ qlf_k6n10f/sim_dsp_mult_cfg_ports \
+ qlf_k6n10f/sim_dsp_mult_cfg_ports \
+ qlf_k6n10f/sim_dsp_mult_cfg_params \
+ qlf_k6n10f/sim_dsp_mult_r_cfg_ports \
+ qlf_k6n10f/sim_dsp_mult_r_cfg_params \
+ qlf_k6n10f/sim_dsp_fir_cfg_ports \
+ qlf_k6n10f/sim_dsp_fir_cfg_params \
+ qlf_k6n10f/sim_dsp_simd_cfg_ports \
+ qlf_k6n10f/sim_dsp_simd_cfg_params \
+ qlf_k6n10f/sim_tc36fifo
# Those tests perform synthesis and simulation of synthesis results
POST_SYNTH_SIM_TESTS = \
- qlf_k6n10f/bram_tdp \
- qlf_k6n10f/bram_sdp \
- qlf_k6n10f/bram_tdp_split \
- qlf_k6n10f/bram_sdp_split \
- qlf_k6n10f/dsp_mult_post_synth_sim \
- qlf_k6n10f/dsp_simd_post_synth_sim \
- qlf_k6n10f/bram_asymmetric_wider_write \
- qlf_k6n10f/bram_asymmetric_wider_read
+ qlf_k6n10f/asymmetric_bram36k_sfifo \
+ qlf_k6n10f/asymmetric_bram36k_afifo \
+ qlf_k6n10f/bram36k_sfifo \
+ qlf_k6n10f/bram36k_afifo \
+ qlf_k6n10f/bram18k_afifo \
+ qlf_k6n10f/bram18k_sfifo \
+ qlf_k6n10f/bram18k_tdp \
+ qlf_k6n10f/bram36k_tdp \
+ qlf_k6n10f/bram18k_sdp \
+ qlf_k6n10f/bram36k_sdp \
+ qlf_k6n10f/asymmetric_bram36k_sdp \
+ qlf_k6n10f/asymmetric_bram18k_sdp \
+ qlf_k6n10f/bram_tdp \
+ qlf_k6n10f/bram_sdp \
+ qlf_k6n10f/bram_tdp_split \
+ qlf_k6n10f/bram_sdp_split \
+ qlf_k6n10f/dsp_mult_post_synth_sim \
+ qlf_k6n10f/dsp_simd_post_synth_sim \
+ qlf_k6n10f/bram_asymmetric_wider_write \
+ qlf_k6n10f/bram_asymmetric_wider_read
include $(shell pwd)/../../Makefile_test.common
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.tcl
new file mode 100644
index 0000000..0579462
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.tcl
@@ -0,0 +1,27 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save asymmetric_bram18k_sdp
+
+select spram_9x2048_18x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_9x2048_18x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_9x2048_18x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X18_split
+
+select -clear
+design -load asymmetric_bram18k_sdp
+select spram_18x1024_9x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_18x1024_9x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_18x1024_9x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X9_split
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.v
new file mode 100644
index 0000000..10fb3b3
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/asymmetric_bram18k_sdp.v
@@ -0,0 +1,109 @@
+// 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
+
+module spram_9x2048_18x1024 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 11;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 18;
+parameter BE_WIDTH = 1;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_18K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x18_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(1'b1),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
+
+module spram_18x1024_9x2048 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 11;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 9;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_18K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x18_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(2'b11),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/Makefile
new file mode 100644
index 0000000..ad94052
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/Makefile
@@ -0,0 +1,47 @@
+# 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
+
+TESTBENCH = asymmetric_bram18k_sdp_tb.v
+POST_SYNTH = spram_9x2048_18x1024_post_synth spram_18x1024_9x2048_post_synth
+ADDR_WIDTH0 = 11 10
+DATA_WIDTH0 = 9 18
+ADDR_WIDTH1 = 10 11
+DATA_WIDTH1 = 18 9
+TOP = spram_9x2048_18x1024 spram_18x1024_9x2048
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+#FIXME: $(call simulate_post_synth,3)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/asymmetric_bram18k_sdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/asymmetric_bram18k_sdp_tb.v
new file mode 100644
index 0000000..f71ee13
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram18k_sdp/sim/asymmetric_bram18k_sdp_tb.v
@@ -0,0 +1,178 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 50;
+ localparam ADDR_INCR = 1;
+
+ reg clk_0;
+ reg clk_1;
+ reg rce;
+ reg [`ADDR_WIDTH1-1:0] ra;
+ wire [`DATA_WIDTH1-1:0] rq;
+ reg wce;
+ reg [`ADDR_WIDTH0-1:0] wa;
+ reg [`DATA_WIDTH0-1:0] wd;
+
+ initial clk_0 = 0;
+ initial clk_1 = 0;
+ initial ra = 0;
+ initial wa = 0;
+ initial wd = 0;
+ initial rce = 0;
+ initial wce = 0;
+ initial forever #(PERIOD / 2.0) clk_0 = ~clk_0;
+ //initial forever #(PERIOD / 2.0) clk_1 = ~clk_1;
+ initial begin
+ #(PERIOD / 4.0);
+ forever #(PERIOD / 2.0) clk_1 = ~clk_1;
+ end
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+ integer b;
+
+ reg done_0;
+ initial done_0 = 1'b0;
+ wire done_sim = done_0;
+
+ reg [`DATA_WIDTH1-1:0] expected_0;
+
+ reg read_test_0;
+ initial read_test_0 = 0;
+
+
+ wire error_0 = (read_test_0) ? (rq !== expected_0) : 0;
+
+ integer error_0_cnt = 0;
+
+ always @ (posedge clk_1)
+ begin
+ if (error_0)
+ error_0_cnt <= error_0_cnt + 1'b1;
+ end
+
+case (`STRINGIFY(`TOP))
+"spram_9x2048_18x1024": begin
+ initial #(1) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk_0) begin
+ wa = a[`ADDR_WIDTH0-1:0];
+ wd = a[9:1];
+ wce = 1;
+ end
+ @(posedge clk_0) begin
+ #(PERIOD/10) wce = 0;
+ end
+ end
+ // Read data
+ read_test_0 = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(negedge clk_1) begin
+ ra = a;
+ rce = 1;
+ end
+ @(posedge clk_1) begin
+ expected_0 <= {a[8],a[8],a[7:0],a[7:0]};
+ #(PERIOD/10) rce = 0;
+ if ( rq !== expected_0) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end
+ end
+ end
+ done_0 = 1'b1;
+ a = 0;
+ end
+end
+"spram_18x1024_9x2048": begin
+ initial #(1) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk_0) begin
+ wa = a[`ADDR_WIDTH0-1:0];
+ wd = {a[8],a[8],a[7:0],a[7:0]};
+ wce = 1;
+ end
+ @(posedge clk_0) begin
+ #(PERIOD/10) wce = 0;
+ end
+ end
+ // Read data
+ read_test_0 = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(negedge clk_1) begin
+ ra = a;
+ rce = 1;
+ end
+ @(posedge clk_1) begin
+ expected_0 <= {a[9:1]};
+ #(PERIOD/10) rce = 0;
+ if ( rq !== expected_0) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end
+ end
+ end
+ done_0 = 1'b1;
+ a = 0;
+ end
+end
+endcase
+
+ // Scan for simulation finish
+ always @(posedge clk_1) begin
+ if (done_sim)
+ $finish_and_return( (error_0_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "spram_9x2048_18x1024": begin
+ spram_9x2048_18x1024 #() bram (
+ .clock0(clk_0),
+ .clock1(clk_1),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ "spram_18x1024_9x2048": begin
+ spram_18x1024_9x2048 #() bram (
+ .clock0(clk_0),
+ .clock1(clk_1),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.tcl
new file mode 100644
index 0000000..66e2686
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.tcl
@@ -0,0 +1,49 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save asymmetric_bram36k_afifo
+
+select af4096x9_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top af4096x9_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af4096x9_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X9_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_afifo
+select af2048x18_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top af2048x18_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af2048x18_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X18_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_afifo
+select af2048x18_4098x9
+select *
+synth_quicklogic -family qlf_k6n10f -top af2048x18_4098x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af2048x18_4098x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X18_RD_X9_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_afifo
+select af1024x36_4098x9
+select *
+synth_quicklogic -family qlf_k6n10f -top af1024x36_4098x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af1024x36_4098x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X36_RD_X9_nonsplit
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.v
new file mode 100644
index 0000000..031a4bd
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/asymmetric_bram36k_afifo.v
@@ -0,0 +1,184 @@
+// 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
+
+module af4096x9_1024x36 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+
+AFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module af2048x18_1024x36 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module af2048x18_4098x9 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module af1024x36_4098x9 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/Makefile
new file mode 100644
index 0000000..9686158
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/Makefile
@@ -0,0 +1,51 @@
+# 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
+
+TESTBENCH = asymmetric_bram36k_afifo_tb.v
+POST_SYNTH = af4096x9_1024x36_post_synth af2048x18_1024x36_post_synth af2048x18_4098x9_post_synth af1024x36_4098x9_post_synth
+ADDR_WIDTH0 = 12 11 11 10
+DATA_WIDTH0 = 9 18 18 36
+ADDR_WIDTH1 = 10 10 12 12
+DATA_WIDTH1 = 36 36 9 9
+TOP = af4096x9_1024x36 af2048x18_1024x36 af2048x18_4098x9 af1024x36_4098x9
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+#FIXME: $(call simulate_post_synth,3)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
+ $(call simulate_post_synth,4)
+ $(call clean_post_synth_sim,4)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/asymmetric_bram36k_afifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/asymmetric_bram36k_afifo_tb.v
new file mode 100644
index 0000000..5be25e7
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_afifo/sim/asymmetric_bram36k_afifo_tb.v
@@ -0,0 +1,292 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 30;
+ localparam ADDR_INCR = 1;
+
+ reg clk0;
+ reg clk1;
+ reg flush;
+ reg pop;
+ wire [`DATA_WIDTH1-1:0] dout;
+ reg push;
+ reg [`DATA_WIDTH0-1:0] din;
+ wire almost_full,almost_empty;
+ wire full, empty;
+ wire full_watermark, empty_watermark;
+ wire overrun_error, underrun_error;
+
+ initial
+ begin
+ clk0 = 0;
+ clk1 = 0;
+ pop = 0;
+ push = 0;
+ flush = 1;
+ din = 0;
+ #40
+ flush = 0;
+ end
+
+ initial forever #(PERIOD / 3.0) clk0 = ~clk0;
+ initial forever #(PERIOD / 2.0) clk1 = ~clk1;
+
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+
+ reg done;
+ initial done = 1'b0;
+
+ reg read_test;
+ initial read_test = 0;
+
+ reg [`DATA_WIDTH1-1:0] expected;
+ initial expected = 0;
+
+ wire error = (read_test) ? dout !== expected : 0;
+
+ integer error_cnt = 0;
+ always @ (posedge clk1)
+ begin
+ if (error)
+ error_cnt <= error_cnt + 1'b1;
+ end
+
+case (`STRINGIFY(`TOP))
+"af4096x9_1024x36": begin
+ initial #(50) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk0) begin
+ din = a[10:2];
+ push = 1;
+ end
+ @(posedge clk0) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk1) begin
+ expected <= {a[8],a[8],a[7:0],a[7:0],a[8],a[8],a[7:0],a[7:0]};
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk1) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ a = 0;
+ end
+end
+"af2048x18_1024x36": begin
+ initial #(50) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk0) begin
+ din = a[18:1];
+ push = 1;
+ end
+ @(posedge clk0) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk1) begin
+ expected <= {a[17:0],a[17:0]};
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk1) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ a = 0;
+ end
+end
+"af2048x18_4098x9": begin
+ initial #(50) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk0) begin
+ din = {a[8],a[8],a[7:0],a[7:0]};
+ push = 1;
+ end
+ @(posedge clk0) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk1) begin
+ expected <= {a[9:1]};
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk1) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ a = 0;
+ end
+end
+"af1024x36_4098x9": begin
+ initial #(50) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk0) begin
+ din = {a[8],a[8],a[7:0],a[7:0],a[8],a[8],a[7:0],a[7:0]};
+ push = 1;
+ end
+ @(posedge clk0) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk1) begin
+ expected <= {a[10:2]};
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk1) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ a = 0;
+ end
+end
+endcase
+
+ // Scan for simulation finish
+ always @(posedge clk1) begin
+ if (done)
+ $finish_and_return( (error_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "af4096x9_1024x36": begin
+ af4096x9_1024x36 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "af2048x18_1024x36": begin
+ af2048x18_1024x36 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "af2048x18_4098x9": begin
+ af2048x18_4098x9 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "af1024x36_4098x9": begin
+ af1024x36_4098x9 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.tcl
new file mode 100644
index 0000000..827914a
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.tcl
@@ -0,0 +1,49 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save asymmetric_bram36k_sdp
+
+select spram_9x4096_36x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_9x4096_36x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_9x4096_36x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sdp
+select spram_18x2048_36x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_18x2048_36x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_18x2048_36x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sdp
+select spram_18x2048_9x4096
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_18x2048_9x4096 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_18x2048_9x4096_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X9_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sdp
+select spram_36x1024_18x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_36x1024_18x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_36x1024_18x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X18_nonsplit
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.v
new file mode 100644
index 0000000..1a274f5
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/asymmetric_bram36k_sdp.v
@@ -0,0 +1,203 @@
+// 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
+
+module spram_9x4096_36x1024 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 12;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 36;
+parameter BE_WIDTH = 1;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x36_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(1'b1),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
+
+module spram_18x2048_36x1024 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 11;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 36;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x36_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(2'b11),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
+
+module spram_18x2048_9x4096 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 11;
+parameter RD_ADDR_WIDTH = 12;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 9;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x36_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(2'b11),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
+
+module spram_36x1024_18x2048 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 11;
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 18;
+parameter BE_WIDTH = 4;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x36_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(4'b1111),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/Makefile
new file mode 100644
index 0000000..fc7c0e9
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/Makefile
@@ -0,0 +1,43 @@
+# Copyright (C) 2019-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
+
+TESTBENCH = asymmetric_bram36k_sdp_tb.v
+POST_SYNTH = spram_9x4096_36x1024_post_synth spram_18x2048_36x1024_post_synth spram_18x2048_9x4096_post_synth spram_36x1024_18x2048_post_synth
+ADDR_WIDTH0 = 12 11 11 10
+DATA_WIDTH0 = 9 18 18 36
+ADDR_WIDTH1 = 10 10 12 11
+DATA_WIDTH1 = 36 36 9 18
+TOP = spram_9x4096_36x1024 spram_18x2048_36x1024 spram_18x2048_9x4096 spram_36x1024_18x2048
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+#FIXME: $(call simulate_post_synth,3)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
+ $(call simulate_post_synth,4)
+ $(call clean_post_synth_sim,4)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/asymmetric_bram36k_sdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/asymmetric_bram36k_sdp_tb.v
new file mode 100644
index 0000000..6ddc6c7
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sdp/sim/asymmetric_bram36k_sdp_tb.v
@@ -0,0 +1,270 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 50;
+ localparam ADDR_INCR = 1;
+
+ reg clk_0;
+ reg clk_1;
+ reg rce;
+ reg [`ADDR_WIDTH1-1:0] ra;
+ wire [`DATA_WIDTH1-1:0] rq;
+ reg wce;
+ reg [`ADDR_WIDTH0-1:0] wa;
+ reg [`DATA_WIDTH0-1:0] wd;
+
+ initial clk_0 = 0;
+ initial clk_1 = 0;
+ initial ra = 0;
+ initial wa = 0;
+ initial wd = 0;
+ initial rce = 0;
+ initial wce = 0;
+ initial forever #(PERIOD / 2.0) clk_0 = ~clk_0;
+ //initial forever #(PERIOD / 2.0) clk_1 = ~clk_1;
+ initial begin
+ #(PERIOD / 4.0);
+ forever #(PERIOD / 2.0) clk_1 = ~clk_1;
+ end
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+ integer b;
+
+ reg done_0;
+ initial done_0 = 1'b0;
+ wire done_sim = done_0;
+
+ reg [`DATA_WIDTH1-1:0] expected_0;
+
+ reg read_test_0;
+ initial read_test_0 = 0;
+
+
+ wire error_0 = (read_test_0) ? (rq !== expected_0) : 0;
+
+ integer error_0_cnt = 0;
+
+ always @ (posedge clk_1)
+ begin
+ if (error_0)
+ error_0_cnt <= error_0_cnt + 1'b1;
+ end
+
+case (`STRINGIFY(`TOP))
+"spram_9x4096_36x1024": begin
+ initial #(1) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk_0) begin
+ wa = a[`ADDR_WIDTH0-1:0];
+ wd = a[10:2];
+ wce = 1;
+ end
+ @(posedge clk_0) begin
+ #(PERIOD/10) wce = 0;
+ end
+ end
+ // Read data
+ read_test_0 = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(negedge clk_1) begin
+ ra = a;
+ rce = 1;
+ end
+ @(posedge clk_1) begin
+ expected_0 <= {a[8],a[8],a[7:0],a[7:0],a[8],a[8],a[7:0],a[7:0]};
+ #(PERIOD/10) rce = 0;
+ if ( rq !== expected_0) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end
+ end
+ end
+ done_0 = 1'b1;
+ a = 0;
+ end
+end
+"spram_18x2048_36x1024": begin
+ initial #(1) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk_0) begin
+ wa = a[`ADDR_WIDTH0-1:0];
+ wd = a[18:1];
+ wce = 1;
+ end
+ @(posedge clk_0) begin
+ #(PERIOD/10) wce = 0;
+ end
+ end
+ // Read data
+ read_test_0 = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(negedge clk_1) begin
+ ra = a;
+ rce = 1;
+ end
+ @(posedge clk_1) begin
+ expected_0 <= {a[17:0],a[17:0]};
+ #(PERIOD/10) rce = 0;
+ if ( rq !== expected_0) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end
+ end
+ end
+ done_0 = 1'b1;
+ a = 0;
+ end
+end
+"spram_18x2048_9x4096": begin
+ initial #(1) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk_0) begin
+ wa = a[`ADDR_WIDTH0-1:0];
+ wd = {a[8],a[8],a[7:0],a[7:0]};
+ wce = 1;
+ end
+ @(posedge clk_0) begin
+ #(PERIOD/10) wce = 0;
+ end
+ end
+ // Read data
+ read_test_0 = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(negedge clk_1) begin
+ ra = a;
+ rce = 1;
+ end
+ @(posedge clk_1) begin
+ expected_0 <= {a[9:1]};
+ #(PERIOD/10) rce = 0;
+ if ( rq !== expected_0) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end
+ end
+ end
+ done_0 = 1'b1;
+ a = 0;
+ end
+end
+"spram_36x1024_18x2048": begin
+ initial #(1) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk_0) begin
+ wa = a[`ADDR_WIDTH0-1:0];
+ wd = {a[17:0],a[17:0]};
+ wce = 1;
+ end
+ @(posedge clk_0) begin
+ #(PERIOD/10) wce = 0;
+ end
+ end
+ // Read data
+ read_test_0 = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(negedge clk_1) begin
+ ra = a;
+ rce = 1;
+ end
+ @(posedge clk_1) begin
+ expected_0 <= {a[18:1]};
+ #(PERIOD/10) rce = 0;
+ if ( rq !== expected_0) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq, expected_0, a);
+ end
+ end
+ end
+ done_0 = 1'b1;
+ a = 0;
+ end
+end
+endcase
+
+ // Scan for simulation finish
+ always @(posedge clk_1) begin
+ if (done_sim)
+ $finish_and_return( (error_0_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "spram_9x4096_36x1024": begin
+ spram_9x4096_36x1024 #() bram (
+ .clock0(clk_0),
+ .clock1(clk_1),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ "spram_18x2048_36x1024": begin
+ spram_18x2048_36x1024 #() bram (
+ .clock0(clk_0),
+ .clock1(clk_1),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ "spram_18x2048_9x4096": begin
+ spram_18x2048_9x4096 #() bram (
+ .clock0(clk_0),
+ .clock1(clk_1),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ "spram_36x1024_18x2048": begin
+ spram_36x1024_18x2048 #() bram (
+ .clock0(clk_0),
+ .clock1(clk_1),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.tcl
new file mode 100644
index 0000000..4b24470
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.tcl
@@ -0,0 +1,49 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save asymmetric_bram36k_sfifo
+
+select f4096x9_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top f4096x9_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f4096x9_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X9_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sfifo
+select f2048x18_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top f2048x18_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f2048x18_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X18_RD_X36_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sfifo
+select f2048x18_4098x9
+select *
+synth_quicklogic -family qlf_k6n10f -top f2048x18_4098x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f2048x18_4098x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X18_RD_X9_nonsplit
+
+select -clear
+design -load asymmetric_bram36k_sfifo
+select f1024x36_2048x18
+select *
+synth_quicklogic -family qlf_k6n10f -top f1024x36_2048x18 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f1024x36_2048x18_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X36_RD_X18_nonsplit
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.v
new file mode 100644
index 0000000..fd01e93
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/asymmetric_bram36k_sfifo.v
@@ -0,0 +1,179 @@
+// 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
+
+module f4096x9_1024x36 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module f2048x18_1024x36 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module f2048x18_4098x9 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module f1024x36_2048x18 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 18;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/Makefile
new file mode 100644
index 0000000..a015284
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/Makefile
@@ -0,0 +1,51 @@
+# 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
+
+TESTBENCH = asymmetric_bram36k_sfifo_tb.v
+POST_SYNTH = f4096x9_1024x36_post_synth f2048x18_1024x36_post_synth f2048x18_4098x9_post_synth f1024x36_2048x18_post_synth
+ADDR_WIDTH0 = 12 11 11 10
+DATA_WIDTH0 = 9 18 18 36
+ADDR_WIDTH1 = 10 10 12 11
+DATA_WIDTH1 = 36 36 9 18
+TOP = f4096x9_1024x36 f2048x18_1024x36 f2048x18_4098x9 f1024x36_2048x18
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+#FIXME: $(call simulate_post_synth,3)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
+ $(call simulate_post_synth,4)
+ $(call clean_post_synth_sim,4)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/asymmetric_bram36k_sfifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/asymmetric_bram36k_sfifo_tb.v
new file mode 100644
index 0000000..ba6775d
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/asymmetric_bram36k_sfifo/sim/asymmetric_bram36k_sfifo_tb.v
@@ -0,0 +1,285 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 30;
+ localparam ADDR_INCR = 1;
+
+ reg clk0;
+ reg flush;
+ reg pop;
+ wire [`DATA_WIDTH1-1:0] dout;
+ reg push;
+ reg [`DATA_WIDTH0-1:0] din;
+ wire almost_full,almost_empty;
+ wire full, empty;
+ wire full_watermark, empty_watermark;
+ wire overrun_error, underrun_error;
+
+ initial
+ begin
+ clk0 = 0;
+ pop = 0;
+ push = 0;
+ flush = 1;
+ din = 0;
+ #40
+ flush = 0;
+ end
+
+ initial forever #(PERIOD / 3.0) clk0 = ~clk0;
+
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+
+ reg done;
+ initial done = 1'b0;
+
+ reg read_test;
+ initial read_test = 0;
+
+ reg [`DATA_WIDTH1-1:0] expected;
+ initial expected = 0;
+
+ wire error = (read_test) ? dout !== expected : 0;
+
+ integer error_cnt = 0;
+ always @ (posedge clk0)
+ begin
+ if (error)
+ error_cnt <= error_cnt + 1'b1;
+ end
+
+case (`STRINGIFY(`TOP))
+"f4096x9_1024x36": begin
+ initial #(50) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk0) begin
+ din = a[10:2];
+ push = 1;
+ end
+ @(posedge clk0) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk0) begin
+ expected <= {a[8],a[8],a[7:0],a[7:0],a[8],a[8],a[7:0],a[7:0]};
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk0) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ a = 0;
+ end
+end
+"f2048x18_1024x36": begin
+ initial #(50) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk0) begin
+ din = a[18:1];
+ push = 1;
+ end
+ @(posedge clk0) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk0) begin
+ expected <= {a[17:0],a[17:0]};
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk0) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ a = 0;
+ end
+end
+"f2048x18_4098x9": begin
+ initial #(50) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk0) begin
+ din = {a[8],a[8],a[7:0],a[7:0]};
+ push = 1;
+ end
+ @(posedge clk0) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk0) begin
+ expected <= {a[9:1]};
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk0) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ a = 0;
+ end
+end
+"f1024x36_2048x18": begin
+ initial #(50) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) ; a = a + ADDR_INCR) begin
+ @(negedge clk0) begin
+ din = {a[17:0],a[17:0]};
+ push = 1;
+ end
+ @(posedge clk0) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk0) begin
+ expected <= {a[18:1]};
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk0) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ a = 0;
+ end
+end
+endcase
+
+ // Scan for simulation finish
+ always @(posedge clk0) begin
+ if (done)
+ $finish_and_return( (error_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "f4096x9_1024x36": begin
+ f4096x9_1024x36 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "f2048x18_1024x36": begin
+ f2048x18_1024x36 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "f2048x18_4098x9": begin
+ f2048x18_4098x9 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "f1024x36_2048x18": begin
+ f1024x36_2048x18 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.tcl
new file mode 100644
index 0000000..99c7405
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.tcl
@@ -0,0 +1,49 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram18k_afifo
+
+select af1024x18_1024x18
+select *
+synth_quicklogic -family qlf_k6n10f -top af1024x18_1024x18 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af1024x18_1024x18_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_afifo
+select af1024x16_1024x16
+select *
+synth_quicklogic -family qlf_k6n10f -top af1024x16_1024x16 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af1024x16_1024x16_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_afifo
+select af2048x9_2048x9
+select *
+synth_quicklogic -family qlf_k6n10f -top af2048x9_2048x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af2048x9_2048x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X9_RD_X9_split
+
+select -clear
+design -load bram18k_afifo
+select af2048x8_2048x8
+select *
+synth_quicklogic -family qlf_k6n10f -top af2048x8_2048x8 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af2048x8_2048x8_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X9_RD_X9_split
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.v
new file mode 100644
index 0000000..e4aa0e9
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/bram18k_afifo.v
@@ -0,0 +1,183 @@
+// 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
+
+module af1024x18_1024x18 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_18K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module af1024x16_1024x16 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 16;
+parameter RD_DATA_WIDTH = 16;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_18K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module af2048x9_2048x9 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_18K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module af2048x8_2048x8 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 8;
+parameter RD_DATA_WIDTH = 8;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_18K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/Makefile
new file mode 100644
index 0000000..0153897
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/Makefile
@@ -0,0 +1,51 @@
+# 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
+
+TESTBENCH = bram18k_afifo_tb.v
+POST_SYNTH = af1024x18_1024x18_post_synth af1024x16_1024x16_post_synth af2048x9_2048x9_post_synth af2048x8_2048x8_post_synth
+ADDR_WIDTH0 = 10 10 11 11
+DATA_WIDTH0 = 18 16 9 8
+ADDR_WIDTH1 = 10 10 11 11
+DATA_WIDTH1 = 18 16 9 8
+TOP = af1024x18_1024x18 af1024x16_1024x16 af2048x9_2048x9 af2048x8_2048x8
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+# FIXME: $(call simulate_post_synth,5)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
+ $(call simulate_post_synth,4)
+ $(call clean_post_synth_sim,4)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/bram18k_afifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/bram18k_afifo_tb.v
new file mode 100644
index 0000000..62460b1
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_afifo/sim/bram18k_afifo_tb.v
@@ -0,0 +1,195 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 30;
+ localparam ADDR_INCR = 1;
+
+ reg clk0;
+ reg clk1;
+ reg flush;
+ reg pop;
+ wire [`DATA_WIDTH1-1:0] dout;
+ reg push;
+ reg [`DATA_WIDTH0-1:0] din;
+ wire almost_full,almost_empty;
+ wire full, empty;
+ wire full_watermark, empty_watermark;
+ wire overrun_error, underrun_error;
+
+ initial
+ begin
+ clk0 = 0;
+ clk1 = 0;
+ pop = 0;
+ push = 0;
+ flush = 1;
+ din = 0;
+ #40
+ flush = 0;
+ end
+
+ initial forever #(PERIOD / 3.0) clk0 = ~clk0;
+ initial forever #(PERIOD / 2.0) clk1 = ~clk1;
+
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+
+ reg done;
+ initial done = 1'b0;
+
+ reg read_test;
+ initial read_test = 0;
+
+ reg [`DATA_WIDTH1-1:0] expected;
+ initial expected = 0;
+
+ always @(posedge clk1) begin
+ expected <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+ end
+
+ wire error = ((a != 0) && read_test) ? dout !== expected : 0;
+
+ integer error_cnt = 0;
+ always @ (posedge clk1)
+ begin
+ if (error)
+ error_cnt <= error_cnt + 1'b1;
+ end
+
+ initial #(50) begin
+ @(posedge clk0)
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0); a = a + ADDR_INCR) begin
+ @(negedge clk0) begin
+ din = a | (a << 20) | 20'h55000;
+ push = 1;
+ end
+ @(posedge clk0) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk1) begin
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk1) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ end
+
+ // Scan for simulation finish
+ always @(posedge clk1) begin
+ if (done)
+ $finish_and_return( (error_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "af1024x18_1024x18": begin
+ af1024x18_1024x18 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "af1024x16_1024x16": begin
+ af1024x16_1024x16 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "af2048x9_2048x9": begin
+ af2048x9_2048x9 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "af2048x8_2048x8": begin
+ af2048x8_2048x8 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.tcl
new file mode 100644
index 0000000..092d4c2
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.tcl
@@ -0,0 +1,39 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram18k_sdp
+
+select spram_18x1024_2x
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_18x1024_2x -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_18x1024_2x_post_synth.v
+select -assert-count 2 t:TDP36K_BRAM_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_sdp
+select spram_9x2048_x2
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_9x2048_x2 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_9x2048_x2_post_synth.v
+select -assert-count 2 t:TDP36K_BRAM_WR_X9_RD_X9_split
+
+select -clear
+design -load bram18k_sdp
+select spram_9x2048_18x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_9x2048_18x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_9x2048_18x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_split
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_split
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.v
new file mode 100644
index 0000000..a8ea0a2
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/bram18k_sdp.v
@@ -0,0 +1,276 @@
+// 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
+
+module spram_18x1024_2x (
+ WEN0_i,
+ REN0_i,
+ clock0,
+ WR_ADDR0_i,
+ RD_ADDR0_i,
+ WDATA0_i,
+ RDATA0_o,
+
+ WEN1_i,
+ REN1_i,
+ clock1,
+ WR_ADDR1_i,
+ RD_ADDR1_i,
+ WDATA1_i,
+ RDATA1_o
+);
+
+parameter WR_ADDR_WIDTH0 = 10;
+parameter RD_ADDR_WIDTH0 = 10;
+parameter WR_DATA_WIDTH0 = 18;
+parameter RD_DATA_WIDTH0 = 18;
+parameter BE_WIDTH0 = 2;
+
+parameter WR_ADDR_WIDTH1 = 10;
+parameter RD_ADDR_WIDTH1 = 10;
+parameter WR_DATA_WIDTH1 = 18;
+parameter RD_DATA_WIDTH1 = 18;
+parameter BE_WIDTH1 = 2;
+
+input wire WEN0_i;
+input wire REN0_i;
+input wire clock0;
+input wire [WR_ADDR_WIDTH0-1 :0] WR_ADDR0_i;
+input wire [RD_ADDR_WIDTH0-1 :0] RD_ADDR0_i;
+input wire [WR_DATA_WIDTH0-1 :0] WDATA0_i;
+output wire [RD_DATA_WIDTH0-1 :0] RDATA0_o;
+
+input wire WEN1_i;
+input wire REN1_i;
+input wire clock1;
+input wire [WR_ADDR_WIDTH0-1 :0] WR_ADDR1_i;
+input wire [RD_ADDR_WIDTH0-1 :0] RD_ADDR1_i;
+input wire [WR_DATA_WIDTH0-1 :0] WDATA1_i;
+output wire [RD_DATA_WIDTH0-1 :0] RDATA1_o;
+
+
+RAM_18K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH0),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH0),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH0),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH0),
+ .BE_WIDTH(BE_WIDTH0)
+ ) spram_x18_inst1 (
+
+ .WEN_i(WEN0_i),
+ .WR_BE_i(2'b11),
+ .REN_i(REN0_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock0),
+ .WR_ADDR_i(WR_ADDR0_i),
+ .RD_ADDR_i(RD_ADDR0_i),
+ .WDATA_i(WDATA0_i),
+ .RDATA_o(RDATA0_o)
+ );
+
+RAM_18K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH1),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH1),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH1),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH1),
+ .BE_WIDTH(BE_WIDTH1)
+ ) spram_x18_inst2 (
+
+ .WEN_i(WEN1_i),
+ .WR_BE_i(2'b11),
+ .REN_i(REN1_i),
+ .WR_CLK_i(clock1),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR1_i),
+ .RD_ADDR_i(RD_ADDR1_i),
+ .WDATA_i(WDATA1_i),
+ .RDATA_o(RDATA1_o)
+ );
+
+endmodule
+
+module spram_9x2048_x2 (
+ WEN0_i,
+ REN0_i,
+ clock0,
+ WR_ADDR0_i,
+ RD_ADDR0_i,
+ WDATA0_i,
+ RDATA0_o,
+
+ WEN1_i,
+ REN1_i,
+ clock1,
+ WR_ADDR1_i,
+ RD_ADDR1_i,
+ WDATA1_i,
+ RDATA1_o
+);
+
+parameter WR_ADDR_WIDTH0 = 11;
+parameter RD_ADDR_WIDTH0 = 11;
+parameter WR_DATA_WIDTH0 = 9;
+parameter RD_DATA_WIDTH0 = 9;
+parameter BE_WIDTH0 = 1;
+
+parameter WR_ADDR_WIDTH1 = 11;
+parameter RD_ADDR_WIDTH1 = 11;
+parameter WR_DATA_WIDTH1 = 9;
+parameter RD_DATA_WIDTH1 = 9;
+parameter BE_WIDTH1 = 1;
+
+input wire WEN0_i;
+input wire REN0_i;
+input wire clock0;
+input wire [WR_ADDR_WIDTH0-1 :0] WR_ADDR0_i;
+input wire [RD_ADDR_WIDTH0-1 :0] RD_ADDR0_i;
+input wire [WR_DATA_WIDTH0-1 :0] WDATA0_i;
+output wire [RD_DATA_WIDTH0-1 :0] RDATA0_o;
+
+input wire WEN1_i;
+input wire REN1_i;
+input wire clock1;
+input wire [WR_ADDR_WIDTH1-1 :0] WR_ADDR1_i;
+input wire [RD_ADDR_WIDTH1-1 :0] RD_ADDR1_i;
+input wire [WR_DATA_WIDTH1-1 :0] WDATA1_i;
+output wire [RD_DATA_WIDTH1-1 :0] RDATA1_o;
+
+
+RAM_18K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH0),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH0),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH0),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH0),
+ .BE_WIDTH(BE_WIDTH0)
+ ) spram_x18_inst1 (
+
+ .WEN_i(WEN0_i),
+ .WR_BE_i(2'b11),
+ .REN_i(REN0_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock0),
+ .WR_ADDR_i(WR_ADDR0_i),
+ .RD_ADDR_i(RD_ADDR0_i),
+ .WDATA_i(WDATA0_i),
+ .RDATA_o(RDATA0_o)
+ );
+
+RAM_18K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH1),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH1),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH1),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH1),
+ .BE_WIDTH(BE_WIDTH1)
+ ) spram_x18_inst2 (
+
+ .WEN_i(WEN1_i),
+ .WR_BE_i(2'b11),
+ .REN_i(REN1_i),
+ .WR_CLK_i(clock1),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR1_i),
+ .RD_ADDR_i(RD_ADDR1_i),
+ .WDATA_i(WDATA1_i),
+ .RDATA_o(RDATA1_o)
+ );
+
+endmodule
+
+module spram_9x2048_18x1024 (
+ WEN0_i,
+ REN0_i,
+ clock0,
+ WR_ADDR0_i,
+ RD_ADDR0_i,
+ WDATA0_i,
+ RDATA0_o,
+
+ WEN1_i,
+ REN1_i,
+ clock1,
+ WR_ADDR1_i,
+ RD_ADDR1_i,
+ WDATA1_i,
+ RDATA1_o
+);
+
+parameter WR_ADDR_WIDTH0 = 11;
+parameter RD_ADDR_WIDTH0 = 11;
+parameter WR_DATA_WIDTH0 = 9;
+parameter RD_DATA_WIDTH0 = 9;
+parameter BE_WIDTH0 = 1;
+
+parameter WR_ADDR_WIDTH1 = 10;
+parameter RD_ADDR_WIDTH1 = 10;
+parameter WR_DATA_WIDTH1 = 18;
+parameter RD_DATA_WIDTH1 = 18;
+parameter BE_WIDTH1 = 2;
+
+input wire WEN0_i;
+input wire REN0_i;
+input wire clock0;
+input wire [WR_ADDR_WIDTH0-1 :0] WR_ADDR0_i;
+input wire [RD_ADDR_WIDTH0-1 :0] RD_ADDR0_i;
+input wire [WR_DATA_WIDTH0-1 :0] WDATA0_i;
+output wire [RD_DATA_WIDTH0-1 :0] RDATA0_o;
+
+input wire WEN1_i;
+input wire REN1_i;
+input wire clock1;
+input wire [WR_ADDR_WIDTH1-1 :0] WR_ADDR1_i;
+input wire [RD_ADDR_WIDTH1-1 :0] RD_ADDR1_i;
+input wire [WR_DATA_WIDTH1-1 :0] WDATA1_i;
+output wire [RD_DATA_WIDTH1-1 :0] RDATA1_o;
+
+
+RAM_18K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH0),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH0),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH0),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH0),
+ .BE_WIDTH(BE_WIDTH0)
+ ) spram_x18_inst1 (
+
+ .WEN_i(WEN0_i),
+ .WR_BE_i(1'b1),
+ .REN_i(REN0_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock0),
+ .WR_ADDR_i(WR_ADDR0_i),
+ .RD_ADDR_i(RD_ADDR0_i),
+ .WDATA_i(WDATA0_i),
+ .RDATA_o(RDATA0_o)
+ );
+
+RAM_18K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH1),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH1),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH1),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH1),
+ .BE_WIDTH(BE_WIDTH1)
+ ) spram_x18_inst2 (
+
+ .WEN_i(WEN1_i),
+ .WR_BE_i(2'b11),
+ .REN_i(REN1_i),
+ .WR_CLK_i(clock1),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR1_i),
+ .RD_ADDR_i(RD_ADDR1_i),
+ .WDATA_i(WDATA1_i),
+ .RDATA_o(RDATA1_o)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/Makefile
new file mode 100644
index 0000000..4a8ae5e
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/Makefile
@@ -0,0 +1,49 @@
+# 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
+
+TESTBENCH = bram18k_sdp_tb.v
+POST_SYNTH = spram_18x1024_2x_post_synth spram_9x2048_x2_post_synth spram_9x2048_18x1024_post_synth
+ADDR_WIDTH0 = 10 11 11
+DATA_WIDTH0 = 18 9 9
+ADDR_WIDTH1 = 10 11 10
+DATA_WIDTH1 = 18 9 18
+TOP = spram_18x1024_2x spram_9x2048_x2 spram_9x2048_18x1024
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+#FIXME: $(call simulate_post_synth,3)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/bram18k_sdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/bram18k_sdp_tb.v
new file mode 100644
index 0000000..1294edd
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sdp/sim/bram18k_sdp_tb.v
@@ -0,0 +1,230 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 50;
+ localparam ADDR_INCR = 1;
+
+ reg clk_0;
+ reg rce_0;
+ reg [`ADDR_WIDTH0-1:0] ra_0;
+ wire [`DATA_WIDTH0-1:0] rq_0;
+ reg wce_0;
+ reg [`ADDR_WIDTH0-1:0] wa_0;
+ reg [`DATA_WIDTH0-1:0] wd_0;
+
+ reg clk_1;
+ reg rce_1;
+ reg [`ADDR_WIDTH1-1:0] ra_1;
+ wire [`DATA_WIDTH1-1:0] rq_1;
+ reg wce_1;
+ reg [`ADDR_WIDTH1-1:0] wa_1;
+ reg [`DATA_WIDTH1-1:0] wd_1;
+
+
+ initial clk_0 = 0;
+ initial clk_1 = 0;
+ initial ra_0 = 0;
+ initial ra_1 = 0;
+ initial rce_0 = 0;
+ initial rce_1 = 0;
+ initial forever #(PERIOD / 2.0) clk_0 = ~clk_0;
+ initial begin
+ #(PERIOD / 4.0);
+ forever #(PERIOD / 2.0) clk_1 = ~clk_1;
+ end
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+ integer b;
+
+ reg done_0;
+ reg done_1;
+ initial done_0 = 1'b0;
+ initial done_1 = 1'b0;
+ wire done_sim = done_0 & done_1;
+
+ reg [`DATA_WIDTH0-1:0] expected_0;
+ reg [`DATA_WIDTH1-1:0] expected_1;
+
+ reg read_test_0;
+ reg read_test_1;
+ initial read_test_0 = 0;
+ initial read_test_1 = 0;
+
+ always @(posedge clk_0) begin
+ expected_0 <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH0{1'b1}};
+ end
+ always @(posedge clk_1) begin
+ expected_1 <= ((b+1) | ((b+1) << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+ end
+
+ wire error_0 = ((a != 0) && read_test_0) ? (rq_0 !== expected_0) : 0;
+ wire error_1 = ((b != (1<<`ADDR_WIDTH1) / 2) && read_test_1) ? (rq_1 !== expected_1) : 0;
+
+ integer error_0_cnt = 0;
+ integer error_1_cnt = 0;
+
+ always @ (posedge clk_0)
+ begin
+ if (error_0)
+ error_0_cnt <= error_0_cnt + 1'b1;
+ end
+ always @ (posedge clk_1)
+ begin
+ if (error_1)
+ error_1_cnt <= error_1_cnt + 1'b1;
+ end
+
+ // PART 0
+ initial #(1) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0) / 2; a = a + ADDR_INCR) begin
+ @(negedge clk_0) begin
+ wa_0 = a;
+ wd_0 = a | (a << 20) | 20'h55000;
+ wce_0 = 1;
+ end
+ @(posedge clk_0) begin
+ #(PERIOD/10) wce_0 = 0;
+ end
+ end
+ // Read data
+ read_test_0 = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH0) / 2; a = a + ADDR_INCR) begin
+ @(negedge clk_0) begin
+ ra_0 = a;
+ rce_0 = 1;
+ end
+ @(posedge clk_0) begin
+ #(PERIOD/10) rce_0 = 0;
+ if ( rq_0 !== expected_0) begin
+ $display("%d: PORT 0: FAIL: mismatch act=%x exp=%x at %x", $time, rq_0, expected_0, a);
+ end else begin
+ $display("%d: PORT 0: OK: act=%x exp=%x at %x", $time, rq_0, expected_0, a);
+ end
+ end
+ end
+ done_0 = 1'b1;
+ a = 0;
+ end
+
+ // PART 1
+ initial #(1) begin
+ // Write data
+ for (b = (1<<`ADDR_WIDTH1) / 2; b < (1<<`ADDR_WIDTH1); b = b + ADDR_INCR) begin
+ @(negedge clk_1) begin
+ wa_1 = b;
+ wd_1 = (b+1) | ((b+1) << 20) | 20'h55000;
+ wce_1 = 1;
+ end
+ @(posedge clk_1) begin
+ #(PERIOD/10) wce_1 = 0;
+ end
+ end
+ // Read data
+ read_test_1 = 1;
+ for (b = (1<<`ADDR_WIDTH1) / 2; b < (1<<`ADDR_WIDTH1); b = b + ADDR_INCR) begin
+ @(negedge clk_1) begin
+ ra_1 = b;
+ rce_1 = 1;
+ end
+ @(posedge clk_1) begin
+ #(PERIOD/10) rce_1 = 0;
+ if ( rq_1 !== expected_1) begin
+ $display("%d: PORT 1: FAIL: mismatch act=%x exp=%x at %x", $time, rq_1, expected_1, b);
+ end else begin
+ $display("%d: PORT 1: OK: act=%x exp=%x at %x", $time, rq_1, expected_1, b);
+ end
+ end
+ end
+ done_1 = 1'b1;
+ b = (1<<`ADDR_WIDTH1) / 2;
+ end
+
+ // Scan for simulation finish
+ always @(posedge clk_0, posedge clk_1) begin
+ if (done_sim)
+ $finish_and_return( (error_0_cnt == 0 & error_1_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "spram_18x1024_2x": begin
+ spram_18x1024_2x #() bram (
+ .clock0(clk_0),
+ .REN0_i(rce_0),
+ .RD_ADDR0_i(ra_0),
+ .RDATA0_o(rq_0),
+ .WEN0_i(wce_0),
+ .WR_ADDR0_i(wa_0),
+ .WDATA0_i(wd_0),
+
+ .clock1(clk_1),
+ .REN1_i(rce_1),
+ .RD_ADDR1_i(ra_1),
+ .RDATA1_o(rq_1),
+ .WEN1_i(wce_1),
+ .WR_ADDR1_i(wa_1),
+ .WDATA1_i(wd_1)
+ );
+ end
+ "spram_9x2048_x2": begin
+ spram_9x2048_x2 #() bram (
+ .clock0(clk_0),
+ .REN0_i(rce_0),
+ .RD_ADDR0_i(ra_0),
+ .RDATA0_o(rq_0),
+ .WEN0_i(wce_0),
+ .WR_ADDR0_i(wa_0),
+ .WDATA0_i(wd_0),
+
+ .clock1(clk_1),
+ .REN1_i(rce_1),
+ .RD_ADDR1_i(ra_1),
+ .RDATA1_o(rq_1),
+ .WEN1_i(wce_1),
+ .WR_ADDR1_i(wa_1),
+ .WDATA1_i(wd_1)
+ );
+ end
+ "spram_9x2048_18x1024": begin
+ spram_9x2048_18x1024 #() bram (
+ .clock0(clk_0),
+ .REN0_i(rce_0),
+ .RD_ADDR0_i(ra_0),
+ .RDATA0_o(rq_0),
+ .WEN0_i(wce_0),
+ .WR_ADDR0_i(wa_0),
+ .WDATA0_i(wd_0),
+
+ .clock1(clk_1),
+ .REN1_i(rce_1),
+ .RD_ADDR1_i(ra_1),
+ .RDATA1_o(rq_1),
+ .WEN1_i(wce_1),
+ .WR_ADDR1_i(wa_1),
+ .WDATA1_i(wd_1)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.tcl
new file mode 100644
index 0000000..a5ff276
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.tcl
@@ -0,0 +1,49 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram18k_sfifo
+
+select f1024x18_1024x18
+select *
+synth_quicklogic -family qlf_k6n10f -top f1024x18_1024x18 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f1024x18_1024x18_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_sfifo
+select f1024x16_1024x16
+select *
+synth_quicklogic -family qlf_k6n10f -top f1024x16_1024x16 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f1024x16_1024x16_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_sfifo
+select f2048x9_2048x9
+select *
+synth_quicklogic -family qlf_k6n10f -top f2048x9_2048x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f2048x9_2048x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X9_RD_X9_split
+
+select -clear
+design -load bram18k_sfifo
+select f2048x8_2048x8
+select *
+synth_quicklogic -family qlf_k6n10f -top f2048x8_2048x8 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f2048x8_2048x8_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X9_RD_X9_split
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.v
new file mode 100644
index 0000000..d018b00
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/bram18k_sfifo.v
@@ -0,0 +1,179 @@
+// 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
+
+module f1024x18_1024x18 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_18K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module f1024x16_1024x16 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 16;
+parameter RD_DATA_WIDTH = 16;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_18K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module f2048x9_2048x9 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_18K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module f2048x8_2048x8 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 8;
+parameter RD_DATA_WIDTH = 8;
+parameter UPAE_DBITS = 11'd10;
+parameter UPAF_DBITS = 11'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_18K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/Makefile
new file mode 100644
index 0000000..2a46d29
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/Makefile
@@ -0,0 +1,51 @@
+# 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
+
+TESTBENCH = bram18k_sfifo_tb.v
+POST_SYNTH = f1024x18_1024x18_post_synth f1024x16_1024x16_post_synth f2048x9_2048x9_post_synth f2048x8_2048x8_post_synth
+ADDR_WIDTH0 = 10 10 11 11
+DATA_WIDTH0 = 18 16 9 8
+ADDR_WIDTH1 = 10 10 11 11
+DATA_WIDTH1 = 18 16 9 8
+TOP = f1024x18_1024x18 f1024x16_1024x16 f2048x9_2048x9 f2048x8_2048x8
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+# FIXME: $(call simulate_post_synth,5)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
+ $(call simulate_post_synth,4)
+ $(call clean_post_synth_sim,4)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/bram18k_sfifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/bram18k_sfifo_tb.v
new file mode 100644
index 0000000..f5c56cf
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_sfifo/sim/bram18k_sfifo_tb.v
@@ -0,0 +1,188 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 30;
+ localparam ADDR_INCR = 1;
+
+ reg clk;
+ reg flush;
+ reg pop;
+ wire [`DATA_WIDTH1-1:0] dout;
+ reg push;
+ reg [`DATA_WIDTH0-1:0] din;
+ wire almost_full,almost_empty;
+ wire full, empty;
+ wire full_watermark, empty_watermark;
+ wire overrun_error, underrun_error;
+
+ initial
+ begin
+ clk = 0;
+ pop = 0;
+ push = 0;
+ flush = 1;
+ din = 0;
+ #40
+ flush = 0;
+ end
+
+ initial forever #(PERIOD / 3.0) clk = ~clk;
+
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+
+ reg done;
+ initial done = 1'b0;
+
+ reg read_test;
+ initial read_test = 0;
+
+ reg [`DATA_WIDTH1-1:0] expected;
+ initial expected = 0;
+
+ always @(posedge clk) begin
+ expected <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+ end
+
+ wire error = ((a != 0) && read_test) ? dout !== expected : 0;
+
+ integer error_cnt = 0;
+ always @ (posedge clk)
+ begin
+ if (error)
+ error_cnt <= error_cnt + 1'b1;
+ end
+
+ initial #(50) begin
+ @(posedge clk)
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0); a = a + ADDR_INCR) begin
+ @(negedge clk) begin
+ din = a | (a << 20) | 20'h55000;
+ push = 1;
+ end
+ @(posedge clk) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk) begin
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ end
+
+ // Scan for simulation finish
+ always @(posedge clk) begin
+ if (done)
+ $finish_and_return( (error_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "f1024x18_1024x18": begin
+ f1024x18_1024x18 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "f1024x16_1024x16": begin
+ f1024x16_1024x16 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "f2048x9_2048x9": begin
+ f2048x9_2048x9 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "f2048x8_2048x8": begin
+ f2048x8_2048x8 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.tcl
new file mode 100644
index 0000000..e42cd16
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.tcl
@@ -0,0 +1,39 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram18k_tdp
+
+select dpram_18x1024_x2
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_18x1024_x2 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_18x1024_x2_post_synth.v
+select -assert-count 2 t:TDP36K_BRAM_WR_X18_RD_X18_split
+
+select -clear
+design -load bram18k_tdp
+select dpram_9x2048_x2
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_9x2048_x2 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_9x2048_x2_post_synth.v
+select -assert-count 2 t:TDP36K_BRAM_WR_X9_RD_X9_split
+
+select -clear
+design -load bram18k_tdp
+select dpram_18x1024_9x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_18x1024_9x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_18x1024_9x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_split
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_split
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.v
new file mode 100644
index 0000000..5151eeb
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/bram18k_tdp.v
@@ -0,0 +1,396 @@
+// 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
+
+module dpram_18x1024_x2 (
+ clk_a_0,
+ WEN_a_0,
+ REN_a_0,
+ WR_ADDR_a_0,
+ RD_ADDR_a_0,
+ WDATA_a_0,
+ RDATA_a_0,
+
+ clk_b_0,
+ WEN_b_0,
+ REN_b_0,
+ WR_ADDR_b_0,
+ RD_ADDR_b_0,
+ WDATA_b_0,
+ RDATA_b_0,
+
+ clk_a_1,
+ WEN_a_1,
+ REN_a_1,
+ WR_ADDR_a_1,
+ RD_ADDR_a_1,
+ WDATA_a_1,
+ RDATA_a_1,
+
+ clk_b_1,
+ WEN_b_1,
+ REN_b_1,
+ WR_ADDR_b_1,
+ RD_ADDR_b_1,
+ WDATA_b_1,
+ RDATA_b_1
+);
+
+parameter ADDR_WIDTH0 = 10;
+parameter DATA_WIDTH0 = 18;
+parameter BE1_WIDTH0 = 2;
+parameter BE2_WIDTH0 = 2;
+
+parameter ADDR_WIDTH1 = 10;
+parameter DATA_WIDTH1 = 18;
+parameter BE1_WIDTH1 = 2;
+parameter BE2_WIDTH1 = 2;
+
+input wire clk_a_0;
+input wire WEN_a_0;
+input wire REN_a_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_a_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_a_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_a_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_a_0;
+
+input wire clk_b_0;
+input wire WEN_b_0;
+input wire REN_b_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_b_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_b_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_b_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_b_0;
+
+input wire clk_a_1;
+input wire WEN_a_1;
+input wire REN_a_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_a_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_a_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_a_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_a_1;
+
+input wire clk_b_1;
+input wire WEN_b_1;
+input wire REN_b_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_b_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_b_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_b_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_b_1;
+
+DPRAM_18K_BLK #(
+ .ADDR_WIDTH(ADDR_WIDTH0),
+ .DATA_WIDTH(DATA_WIDTH0),
+ .BE1_WIDTH(BE1_WIDTH0),
+ .BE2_WIDTH(BE2_WIDTH0)
+ ) dpram_x18_inst0 (
+
+ .CLK1_i(clk_a_0),
+ .WEN1_i(WEN_a_0),
+ .REN1_i(REN_a_0),
+ .WR1_ADDR_i(WR_ADDR_a_0),
+ .RD1_ADDR_i(RD_ADDR_a_0),
+ .WDATA1_i(WDATA_a_0),
+ .RDATA1_o(RDATA_a_0),
+
+ .CLK2_i(clk_b_0),
+ .WEN2_i(WEN_b_0),
+ .REN2_i(REN_b_0),
+ .WR2_ADDR_i(WR_ADDR_b_0),
+ .RD2_ADDR_i(RD_ADDR_b_0),
+ .WDATA2_i(WDATA_b_0),
+ .RDATA2_o(RDATA_b_0)
+ );
+
+
+DPRAM_18K_BLK #(
+ .ADDR_WIDTH(ADDR_WIDTH1),
+ .DATA_WIDTH(DATA_WIDTH1),
+ .BE1_WIDTH(BE1_WIDTH1),
+ .BE2_WIDTH(BE2_WIDTH1)
+ ) dpram_x18_inst1 (
+
+ .CLK1_i(clk_a_1),
+ .WEN1_i(WEN_a_1),
+ .REN1_i(REN_a_1),
+ .WR1_ADDR_i(WR_ADDR_a_1),
+ .RD1_ADDR_i(RD_ADDR_a_1),
+ .WDATA1_i(WDATA_a_1),
+ .RDATA1_o(RDATA_a_1),
+
+ .CLK2_i(clk_b_1),
+ .WEN2_i(WEN_b_1),
+ .REN2_i(REN_b_1),
+ .WR2_ADDR_i(WR_ADDR_b_1),
+ .RD2_ADDR_i(RD_ADDR_b_1),
+ .WDATA2_i(WDATA_b_1),
+ .RDATA2_o(RDATA_b_1)
+ );
+
+endmodule
+
+module dpram_9x2048_x2 (
+ clk_a_0,
+ WEN_a_0,
+ REN_a_0,
+ WR_ADDR_a_0,
+ RD_ADDR_a_0,
+ WDATA_a_0,
+ RDATA_a_0,
+
+ clk_b_0,
+ WEN_b_0,
+ REN_b_0,
+ WR_ADDR_b_0,
+ RD_ADDR_b_0,
+ WDATA_b_0,
+ RDATA_b_0,
+
+ clk_a_1,
+ WEN_a_1,
+ REN_a_1,
+ WR_ADDR_a_1,
+ RD_ADDR_a_1,
+ WDATA_a_1,
+ RDATA_a_1,
+
+ clk_b_1,
+ WEN_b_1,
+ REN_b_1,
+ WR_ADDR_b_1,
+ RD_ADDR_b_1,
+ WDATA_b_1,
+ RDATA_b_1
+);
+
+parameter ADDR_WIDTH0 = 11;
+parameter DATA_WIDTH0 = 9;
+parameter BE1_WIDTH0 = 1;
+parameter BE2_WIDTH0 = 1;
+
+parameter ADDR_WIDTH1 = 11;
+parameter DATA_WIDTH1 = 9;
+parameter BE1_WIDTH1 = 1;
+parameter BE2_WIDTH1 = 1;
+
+input wire clk_a_0;
+input wire WEN_a_0;
+input wire REN_a_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_a_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_a_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_a_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_a_0;
+
+input wire clk_b_0;
+input wire WEN_b_0;
+input wire REN_b_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_b_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_b_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_b_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_b_0;
+
+input wire clk_a_1;
+input wire WEN_a_1;
+input wire REN_a_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_a_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_a_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_a_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_a_1;
+
+input wire clk_b_1;
+input wire WEN_b_1;
+input wire REN_b_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_b_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_b_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_b_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_b_1;
+
+DPRAM_18K_BLK #(
+ .ADDR_WIDTH(ADDR_WIDTH0),
+ .DATA_WIDTH(DATA_WIDTH0),
+ .BE1_WIDTH(BE1_WIDTH0),
+ .BE2_WIDTH(BE2_WIDTH0)
+ ) dpram_x18_inst0 (
+
+ .CLK1_i(clk_a_0),
+ .WEN1_i(WEN_a_0),
+ .REN1_i(REN_a_0),
+ .WR1_ADDR_i(WR_ADDR_a_0),
+ .RD1_ADDR_i(RD_ADDR_a_0),
+ .WDATA1_i(WDATA_a_0),
+ .RDATA1_o(RDATA_a_0),
+
+ .CLK2_i(clk_b_0),
+ .WEN2_i(WEN_b_0),
+ .REN2_i(REN_b_0),
+ .WR2_ADDR_i(WR_ADDR_b_0),
+ .RD2_ADDR_i(RD_ADDR_b_0),
+ .WDATA2_i(WDATA_b_0),
+ .RDATA2_o(RDATA_b_0)
+ );
+
+
+DPRAM_18K_BLK #(
+ .ADDR_WIDTH(ADDR_WIDTH1),
+ .DATA_WIDTH(DATA_WIDTH1),
+ .BE1_WIDTH(BE1_WIDTH1),
+ .BE2_WIDTH(BE2_WIDTH1)
+ ) dpram_x18_inst1 (
+
+ .CLK1_i(clk_a_1),
+ .WEN1_i(WEN_a_1),
+ .REN1_i(REN_a_1),
+ .WR1_ADDR_i(WR_ADDR_a_1),
+ .RD1_ADDR_i(RD_ADDR_a_1),
+ .WDATA1_i(WDATA_a_1),
+ .RDATA1_o(RDATA_a_1),
+
+ .CLK2_i(clk_b_1),
+ .WEN2_i(WEN_b_1),
+ .REN2_i(REN_b_1),
+ .WR2_ADDR_i(WR_ADDR_b_1),
+ .RD2_ADDR_i(RD_ADDR_b_1),
+ .WDATA2_i(WDATA_b_1),
+ .RDATA2_o(RDATA_b_1)
+ );
+
+endmodule
+
+module dpram_18x1024_9x2048 (
+ clk_a_0,
+ WEN_a_0,
+ REN_a_0,
+ WR_ADDR_a_0,
+ RD_ADDR_a_0,
+ WDATA_a_0,
+ RDATA_a_0,
+
+ clk_b_0,
+ WEN_b_0,
+ REN_b_0,
+ WR_ADDR_b_0,
+ RD_ADDR_b_0,
+ WDATA_b_0,
+ RDATA_b_0,
+
+ clk_a_1,
+ WEN_a_1,
+ REN_a_1,
+ WR_ADDR_a_1,
+ RD_ADDR_a_1,
+ WDATA_a_1,
+ RDATA_a_1,
+
+ clk_b_1,
+ WEN_b_1,
+ REN_b_1,
+ WR_ADDR_b_1,
+ RD_ADDR_b_1,
+ WDATA_b_1,
+ RDATA_b_1
+);
+
+parameter ADDR_WIDTH0 = 10;
+parameter DATA_WIDTH0 = 18;
+parameter BE1_WIDTH0 = 2;
+parameter BE2_WIDTH0 = 2;
+
+parameter ADDR_WIDTH1 = 11;
+parameter DATA_WIDTH1 = 9;
+parameter BE1_WIDTH1 = 1;
+parameter BE2_WIDTH1 = 1;
+
+input wire clk_a_0;
+input wire WEN_a_0;
+input wire REN_a_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_a_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_a_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_a_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_a_0;
+
+input wire clk_b_0;
+input wire WEN_b_0;
+input wire REN_b_0;
+input wire [ADDR_WIDTH0-1 :0] WR_ADDR_b_0;
+input wire [ADDR_WIDTH0-1 :0] RD_ADDR_b_0;
+input wire [DATA_WIDTH0-1 :0] WDATA_b_0;
+output wire [DATA_WIDTH0-1 :0] RDATA_b_0;
+
+input wire clk_a_1;
+input wire WEN_a_1;
+input wire REN_a_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_a_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_a_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_a_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_a_1;
+
+input wire clk_b_1;
+input wire WEN_b_1;
+input wire REN_b_1;
+input wire [ADDR_WIDTH1-1 :0] WR_ADDR_b_1;
+input wire [ADDR_WIDTH1-1 :0] RD_ADDR_b_1;
+input wire [DATA_WIDTH1-1 :0] WDATA_b_1;
+output wire [DATA_WIDTH1-1 :0] RDATA_b_1;
+
+DPRAM_18K_BLK #(
+ .ADDR_WIDTH(ADDR_WIDTH0),
+ .DATA_WIDTH(DATA_WIDTH0),
+ .BE1_WIDTH(BE1_WIDTH0),
+ .BE2_WIDTH(BE2_WIDTH0)
+ ) dpram_x18_inst0 (
+
+ .CLK1_i(clk_a_0),
+ .WEN1_i(WEN_a_0),
+ .REN1_i(REN_a_0),
+ .WR1_ADDR_i(WR_ADDR_a_0),
+ .RD1_ADDR_i(RD_ADDR_a_0),
+ .WDATA1_i(WDATA_a_0),
+ .RDATA1_o(RDATA_a_0),
+
+ .CLK2_i(clk_b_0),
+ .WEN2_i(WEN_b_0),
+ .REN2_i(REN_b_0),
+ .WR2_ADDR_i(WR_ADDR_b_0),
+ .RD2_ADDR_i(RD_ADDR_b_0),
+ .WDATA2_i(WDATA_b_0),
+ .RDATA2_o(RDATA_b_0)
+ );
+
+
+DPRAM_18K_BLK #(
+ .ADDR_WIDTH(ADDR_WIDTH1),
+ .DATA_WIDTH(DATA_WIDTH1),
+ .BE1_WIDTH(BE1_WIDTH1),
+ .BE2_WIDTH(BE2_WIDTH1)
+ ) dpram_x18_inst1 (
+
+ .CLK1_i(clk_a_1),
+ .WEN1_i(WEN_a_1),
+ .REN1_i(REN_a_1),
+ .WR1_ADDR_i(WR_ADDR_a_1),
+ .RD1_ADDR_i(RD_ADDR_a_1),
+ .WDATA1_i(WDATA_a_1),
+ .RDATA1_o(RDATA_a_1),
+
+ .CLK2_i(clk_b_1),
+ .WEN2_i(WEN_b_1),
+ .REN2_i(REN_b_1),
+ .WR2_ADDR_i(WR_ADDR_b_1),
+ .RD2_ADDR_i(RD_ADDR_b_1),
+ .WDATA2_i(WDATA_b_1),
+ .RDATA2_o(RDATA_b_1)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/Makefile
new file mode 100644
index 0000000..83ea28e
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/Makefile
@@ -0,0 +1,49 @@
+# 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
+
+TESTBENCH = bram18k_tdp_tb.v
+POST_SYNTH = dpram_18x1024_9x2048_post_synth dpram_9x2048_x2_post_synth dpram_18x1024_x2_post_synth
+ADDR_WIDTH0 = 10 11 10
+DATA_WIDTH0 = 18 9 18
+ADDR_WIDTH1 = 11 11 10
+DATA_WIDTH1 = 9 9 18
+TOP = dpram_18x1024_9x2048 dpram_9x2048_x2 dpram_18x1024_x2
+ADDR_DEFINES0 = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR_DEFINES1 = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA_DEFINES0 = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA_DEFINES1 = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR_DEFINES0)) $(word $(1),$(ADDR_DEFINES1)) $(word $(1),$(DATA_DEFINES0)) $(word $(1),$(DATA_DEFINES1)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+#FIXME: $(call simulate_post_synth,3)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/bram18k_tdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/bram18k_tdp_tb.v
new file mode 100644
index 0000000..ec5ca14
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram18k_tdp/sim/bram18k_tdp_tb.v
@@ -0,0 +1,364 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 50;
+ localparam ADDR_INCR = 1;
+
+ reg clk_a;
+ reg rce_a_0;
+ reg rce_a_1;
+ reg [`ADDR_WIDTH0-1:0] ra_a_0;
+ reg [`ADDR_WIDTH1-1:0] ra_a_1;
+ wire [`DATA_WIDTH0-1:0] rq_a_0;
+ wire [`DATA_WIDTH1-1:0] rq_a_1;
+ reg wce_a_0;
+ reg wce_a_1;
+ reg [`ADDR_WIDTH0-1:0] wa_a_0;
+ reg [`ADDR_WIDTH1-1:0] wa_a_1;
+ reg [`DATA_WIDTH0-1:0] wd_a_0;
+ reg [`DATA_WIDTH1-1:0] wd_a_1;
+
+ reg clk_b;
+ reg rce_b_0;
+ reg rce_b_1;
+ reg [`ADDR_WIDTH0-1:0] ra_b_0;
+ reg [`ADDR_WIDTH1-1:0] ra_b_1;
+ wire [`DATA_WIDTH0-1:0] rq_b_0;
+ wire [`DATA_WIDTH1-1:0] rq_b_1;
+ reg wce_b_0;
+ reg wce_b_1;
+ reg [`ADDR_WIDTH0-1:0] wa_b_0;
+ reg [`ADDR_WIDTH1-1:0] wa_b_1;
+ reg [`DATA_WIDTH0-1:0] wd_b_0;
+ reg [`DATA_WIDTH1-1:0] wd_b_1;
+
+
+ initial clk_a = 0;
+ initial clk_b = 0;
+ initial ra_a_0 = 0;
+ initial ra_a_1 = 0;
+ initial ra_b_0 = 0;
+ initial ra_b_1 = 0;
+ initial rce_a_0 = 0;
+ initial rce_a_1 = 0;
+ initial rce_b_0 = 0;
+ initial rce_b_1 = 0;
+ initial wce_a_0 = 0;
+ initial wce_a_1 = 0;
+ initial wce_b_0 = 0;
+ initial wce_b_1 = 0;
+ initial forever #(PERIOD / 2.0) clk_a = ~clk_a;
+ initial begin
+ #(PERIOD / 4.0);
+ forever #(PERIOD / 2.0) clk_b = ~clk_b;
+ end
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a0;
+ integer b0;
+ integer a1;
+ integer b1;
+
+ reg done_a0;
+ reg done_b0;
+ reg done_a1;
+ reg done_b1;
+ initial done_a0 = 1'b0;
+ initial done_b0 = 1'b0;
+ initial done_a1 = 1'b0;
+ initial done_b1 = 1'b0;
+ wire done_sim = done_a0 & done_b0 & done_a1 & done_b1;
+
+ reg [`DATA_WIDTH0-1:0] expected_a_0;
+ reg [`DATA_WIDTH1-1:0] expected_a_1;
+ reg [`DATA_WIDTH0-1:0] expected_b_0;
+ reg [`DATA_WIDTH1-1:0] expected_b_1;
+
+ always @(posedge clk_a) begin
+ expected_a_0 <= (a0 | (a0 << 20) | 20'h55000) & {`DATA_WIDTH0{1'b1}};
+ expected_a_1 <= ((a1+1) | ((a1+1) << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+ end
+ always @(posedge clk_b) begin
+ expected_b_0 <= ((b0+2) | ((b0+2) << 20) | 20'h55000) & {`DATA_WIDTH0{1'b1}};
+ expected_b_1 <= ((b1+3) | ((b1+3) << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+ end
+
+ wire error_a_0 = a0 != 0 ? (rq_a_0 !== expected_a_0) : 0;
+ wire error_a_1 = a1 != 0 ? (rq_a_1 !== expected_a_1) : 0;
+ wire error_b_0 = b0 != (1<<`ADDR_WIDTH0) / 2 ? (rq_b_0 !== expected_b_0) : 0;
+ wire error_b_1 = b1 != (1<<`ADDR_WIDTH1) / 2 ? (rq_b_1 !== expected_b_1) : 0;
+
+ integer error_a_0_cnt = 0;
+ integer error_a_1_cnt = 0;
+ integer error_b_0_cnt = 0;
+ integer error_b_1_cnt = 0;
+
+ always @ (posedge clk_a)
+ begin
+ if (error_a_0)
+ error_a_0_cnt <= error_a_0_cnt + 1'b1;
+ if (error_a_1)
+ error_a_1_cnt <= error_a_1_cnt + 1'b1;
+ end
+ always @ (posedge clk_b)
+ begin
+ if (error_b_0)
+ error_b_0_cnt <= error_b_0_cnt + 1'b1;
+ if (error_b_1)
+ error_b_1_cnt <= error_b_1_cnt + 1'b1;
+ end
+
+ // PORTs A0
+ initial #(1) begin
+ // Write data
+ for (a0 = 0; a0 < (1<<`ADDR_WIDTH0) / 2; a0 = a0 + ADDR_INCR) begin
+ @(negedge clk_a) begin
+ wa_a_0 = a0;
+ wd_a_0 = a0 | (a0 << 20) | 20'h55000;
+ wce_a_0 = 1;
+ end
+ @(posedge clk_a) begin
+ #(PERIOD/10) wce_a_0 = 0;
+ end
+ end
+ // Read data
+ for (a0 = 0; a0 < (1<<`ADDR_WIDTH0) / 2; a0 = a0 + ADDR_INCR) begin
+ @(negedge clk_a) begin
+ ra_a_0 = a0;
+ rce_a_0 = 1;
+ end
+ @(posedge clk_a) begin
+ #(PERIOD/10) rce_a_0 = 0;
+ if ( rq_a_0 !== expected_a_0) begin
+ $display("%d: PORT A0: FAIL: mismatch act=%x exp=%x at %x", $time, rq_a_0, expected_a_0, a0);
+ end else begin
+ $display("%d: PORT A0: OK: act=%x exp=%x at %x", $time, rq_a_0, expected_a_0, a0);
+ end
+ end
+ end
+ done_a0 = 1'b1;
+ a0 = 0;
+ // PORTs B0
+ @(posedge clk_b)
+ #2;
+ // Write data
+ for (b0 = (1<<`ADDR_WIDTH0) / 2; b0 < (1<<`ADDR_WIDTH0); b0 = b0 + ADDR_INCR) begin
+ @(negedge clk_b) begin
+ wa_b_0 = b0;
+ wd_b_0 = (b0+2) | ((b0+2) << 20) | 20'h55000;
+ wce_b_0 = 1;
+ end
+ @(posedge clk_b) begin
+ #(PERIOD/10) wce_b_0 = 0;
+ end
+ end
+ // Read data
+ for (b0 = (1<<`ADDR_WIDTH0) / 2; b0 < (1<<`ADDR_WIDTH0); b0 = b0 + ADDR_INCR) begin
+ @(negedge clk_b) begin
+ ra_b_0 = b0;
+ rce_b_0 = 1;
+ end
+ @(posedge clk_b) begin
+ #(PERIOD/10) rce_b_0 = 0;
+ if ( rq_b_0 !== expected_b_0) begin
+ $display("%d: PORT B0: FAIL: mismatch act=%x exp=%x at %x", $time, rq_b_0, expected_b_0, b0);
+ end else begin
+ $display("%d: PORT B0: OK: act=%x exp=%x at %x", $time, rq_b_0, expected_b_0, b0);
+ end
+ end
+ end
+ done_b0 = 1'b1;
+ b0 = (1<<`ADDR_WIDTH0) / 2;
+ // PORTs A1
+ @(posedge clk_a)
+ #2;
+ // Write data
+ for (a1 = 0; a1 < (1<<`ADDR_WIDTH1) / 2; a1 = a1 + ADDR_INCR) begin
+ @(negedge clk_a) begin
+ wa_a_1 = a1;
+ wd_a_1 = (a1+1) | ((a1+1) << 20) | 20'h55000;
+ wce_a_1 = 1;
+ end
+ @(posedge clk_a) begin
+ #(PERIOD/10) wce_a_1 = 0;
+ end
+ end
+ // Read data
+ for (a1 = 0; a1 < (1<<`ADDR_WIDTH1) / 2; a1 = a1 + ADDR_INCR) begin
+ @(negedge clk_a) begin
+ ra_a_1 = a1;
+ rce_a_1 = 1;
+ end
+ @(posedge clk_a) begin
+ #(PERIOD/10) rce_a_1 = 0;
+ if ( rq_a_1 !== expected_a_1) begin
+ $display("%d: PORT A1: FAIL: mismatch act=%x exp=%x at %x", $time, rq_a_1, expected_a_1, a1);
+ end else begin
+ $display("%d: PORT A1: OK: act=%x exp=%x at %x", $time, rq_a_1, expected_a_1, a1);
+ end
+ end
+ end
+ done_a1 = 1'b1;
+ a1 = 0;
+ // PORTs B1
+ @(posedge clk_b)
+ #2;
+ // Write data
+ for (b1 = (1<<`ADDR_WIDTH1) / 2; b1 < (1<<`ADDR_WIDTH1); b1 = b1 + ADDR_INCR) begin
+ @(negedge clk_b) begin
+ wa_b_1 = b1;
+ wd_b_1 = (b1+3) | ((b1+3) << 20) | 20'h55000;
+ wce_b_1 = 1;
+ end
+ @(posedge clk_b) begin
+ #(PERIOD/10) wce_b_1 = 0;
+ end
+ end
+ // Read data
+ for (b1 = (1<<`ADDR_WIDTH1) / 2; b1 < (1<<`ADDR_WIDTH1); b1 = b1 + ADDR_INCR) begin
+ @(negedge clk_b) begin
+ ra_b_1 = b1;
+ rce_b_1 = 1;
+ end
+ @(posedge clk_b) begin
+ #(PERIOD/10) rce_b_1 = 0;
+ if ( rq_b_1 !== expected_b_1) begin
+ $display("%d: PORT B1: FAIL: mismatch act=%x exp=%x at %x", $time, rq_b_1, expected_b_1, b1);
+ end else begin
+ $display("%d: PORT B1: OK: act=%x exp=%x at %x", $time, rq_b_1, expected_b_1, b1);
+ end
+ end
+ end
+ done_b1 = 1'b1;
+ b1 = (1<<`ADDR_WIDTH1) / 2;
+ end
+
+ // Scan for simulation finish
+ always @(posedge clk_a, posedge clk_b) begin
+ if (done_sim)
+ $finish_and_return( (error_a_0_cnt == 0 & error_b_0_cnt == 0 & error_a_1_cnt == 0 & error_b_1_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "dpram_18x1024_9x2048": begin
+ dpram_18x1024_9x2048 #() bram (
+ .clk_a_0(clk_a),
+ .REN_a_0(rce_a_0),
+ .RD_ADDR_a_0(ra_a_0),
+ .RDATA_a_0(rq_a_0),
+ .WEN_a_0(wce_a_0),
+ .WR_ADDR_a_0(wa_a_0),
+ .WDATA_a_0(wd_a_0),
+ .clk_b_0(clk_b),
+ .REN_b_0(rce_b_0),
+ .RD_ADDR_b_0(ra_b_0),
+ .RDATA_b_0(rq_b_0),
+ .WEN_b_0(wce_b_0),
+ .WR_ADDR_b_0(wa_b_0),
+ .WDATA_b_0(wd_b_0),
+
+ .clk_a_1(clk_a),
+ .REN_a_1(rce_a_1),
+ .RD_ADDR_a_1(ra_a_1),
+ .RDATA_a_1(rq_a_1),
+ .WEN_a_1(wce_a_1),
+ .WR_ADDR_a_1(wa_a_1),
+ .WDATA_a_1(wd_a_1),
+ .clk_b_1(clk_b),
+ .REN_b_1(rce_b_1),
+ .RD_ADDR_b_1(ra_b_1),
+ .RDATA_b_1(rq_b_1),
+ .WEN_b_1(wce_b_1),
+ .WR_ADDR_b_1(wa_b_1),
+ .WDATA_b_1(wd_b_1)
+ );
+ end
+ "dpram_9x2048_x2": begin
+ dpram_9x2048_x2 #() bram (
+ .clk_a_0(clk_a),
+ .REN_a_0(rce_a_0),
+ .RD_ADDR_a_0(ra_a_0),
+ .RDATA_a_0(rq_a_0),
+ .WEN_a_0(wce_a_0),
+ .WR_ADDR_a_0(wa_a_0),
+ .WDATA_a_0(wd_a_0),
+ .clk_b_0(clk_b),
+ .REN_b_0(rce_b_0),
+ .RD_ADDR_b_0(ra_b_0),
+ .RDATA_b_0(rq_b_0),
+ .WEN_b_0(wce_b_0),
+ .WR_ADDR_b_0(wa_b_0),
+ .WDATA_b_0(wd_b_0),
+
+ .clk_a_1(clk_a),
+ .REN_a_1(rce_a_1),
+ .RD_ADDR_a_1(ra_a_1),
+ .RDATA_a_1(rq_a_1),
+ .WEN_a_1(wce_a_1),
+ .WR_ADDR_a_1(wa_a_1),
+ .WDATA_a_1(wd_a_1),
+ .clk_b_1(clk_b),
+ .REN_b_1(rce_b_1),
+ .RD_ADDR_b_1(ra_b_1),
+ .RDATA_b_1(rq_b_1),
+ .WEN_b_1(wce_b_1),
+ .WR_ADDR_b_1(wa_b_1),
+ .WDATA_b_1(wd_b_1)
+ );
+ end
+ "dpram_18x1024_x2": begin
+ dpram_18x1024_x2 #() bram (
+ .clk_a_0(clk_a),
+ .REN_a_0(rce_a_0),
+ .RD_ADDR_a_0(ra_a_0),
+ .RDATA_a_0(rq_a_0),
+ .WEN_a_0(wce_a_0),
+ .WR_ADDR_a_0(wa_a_0),
+ .WDATA_a_0(wd_a_0),
+ .clk_b_0(clk_b),
+ .REN_b_0(rce_b_0),
+ .RD_ADDR_b_0(ra_b_0),
+ .RDATA_b_0(rq_b_0),
+ .WEN_b_0(wce_b_0),
+ .WR_ADDR_b_0(wa_b_0),
+ .WDATA_b_0(wd_b_0),
+
+ .clk_a_1(clk_a),
+ .REN_a_1(rce_a_1),
+ .RD_ADDR_a_1(ra_a_1),
+ .RDATA_a_1(rq_a_1),
+ .WEN_a_1(wce_a_1),
+ .WR_ADDR_a_1(wa_a_1),
+ .WDATA_a_1(wd_a_1),
+ .clk_b_1(clk_b),
+ .REN_b_1(rce_b_1),
+ .RD_ADDR_b_1(ra_b_1),
+ .RDATA_b_1(rq_b_1),
+ .WEN_b_1(wce_b_1),
+ .WR_ADDR_b_1(wa_b_1),
+ .WDATA_b_1(wd_b_1)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.tcl
new file mode 100644
index 0000000..dacbe77
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.tcl
@@ -0,0 +1,38 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram36k_afifo
+
+select af1024x36_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top af1024x36_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af1024x36_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X36_RD_X36_nonsplit
+
+select -clear
+design -load bram36k_afifo
+select af2048x18_2048x18
+select *
+synth_quicklogic -family qlf_k6n10f -top af2048x18_2048x18 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af2048x18_2048x18_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X18_RD_X18_nonsplit
+
+select -clear
+design -load bram36k_afifo
+select af4096x9_4096x9
+select *
+synth_quicklogic -family qlf_k6n10f -top af4096x9_4096x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/af4096x9_4096x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_ASYNC_WR_X9_RD_X9_nonsplit
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.v
new file mode 100644
index 0000000..1b97e7f
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/bram36k_afifo.v
@@ -0,0 +1,141 @@
+// 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
+
+module af1024x36_1024x36 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module af2048x18_2048x18 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module af4096x9_4096x9 (DIN,PUSH,POP,clock0,clock1,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0,clock1;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+AFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .Push_Clk(clock0),
+ .Pop_Clk(clock1),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/Makefile
new file mode 100644
index 0000000..8b777b5
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/Makefile
@@ -0,0 +1,49 @@
+# 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
+
+TESTBENCH = bram36k_afifo_tb.v
+POST_SYNTH = af1024x36_1024x36_post_synth af2048x18_2048x18_post_synth af4096x9_4096x9_post_synth
+ADDR_WIDTH0 = 10 11 12
+DATA_WIDTH0 = 36 18 9
+ADDR_WIDTH1 = 10 11 12
+DATA_WIDTH1 = 36 18 9
+TOP = af1024x36_1024x36 af2048x18_2048x18 af4096x9_4096x9
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+# FIXME: $(call simulate_post_synth,5)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/bram36k_afifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/bram36k_afifo_tb.v
new file mode 100644
index 0000000..addf547
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_afifo/sim/bram36k_afifo_tb.v
@@ -0,0 +1,177 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 30;
+ localparam ADDR_INCR = 1;
+
+ reg clk0;
+ reg clk1;
+ reg flush;
+ reg pop;
+ wire [`DATA_WIDTH1-1:0] dout;
+ reg push;
+ reg [`DATA_WIDTH0-1:0] din;
+ wire almost_full,almost_empty;
+ wire full, empty;
+ wire full_watermark, empty_watermark;
+ wire overrun_error, underrun_error;
+
+ initial
+ begin
+ clk0 = 0;
+ clk1 = 0;
+ pop = 0;
+ push = 0;
+ flush = 1;
+ din = 0;
+ #40
+ flush = 0;
+ end
+
+ initial forever #(PERIOD / 3.0) clk0 = ~clk0;
+ initial forever #(PERIOD / 2.0) clk1 = ~clk1;
+
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+
+ reg done;
+ initial done = 1'b0;
+
+ reg read_test;
+ initial read_test = 0;
+
+ reg [`DATA_WIDTH1-1:0] expected;
+ initial expected = 0;
+
+ always @(posedge clk1) begin
+ expected <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+ end
+
+ wire error = ((a != 0) && read_test) ? dout !== expected : 0;
+
+ integer error_cnt = 0;
+ always @ (posedge clk1)
+ begin
+ if (error)
+ error_cnt <= error_cnt + 1'b1;
+ end
+
+
+ initial #(50) begin
+ @(posedge clk0)
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0); a = a + ADDR_INCR) begin
+ @(negedge clk0) begin
+ din = a | (a << 20) | 20'h55000;
+ push = 1;
+ end
+ @(posedge clk0) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk1) begin
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk1) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ end
+
+ // Scan for simulation finish
+ always @(posedge clk1) begin
+ if (done)
+ $finish_and_return( (error_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "af1024x36_1024x36": begin
+ af1024x36_1024x36 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "af2048x18_2048x18": begin
+ af2048x18_2048x18 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "af4096x9_4096x9": begin
+ af4096x9_4096x9 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk0),
+ .clock1(clk1),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.tcl
new file mode 100644
index 0000000..b5d38b0
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.tcl
@@ -0,0 +1,71 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram36_sdp
+
+select spram_36x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_36x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_36x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X36_nonsplit
+
+select -clear
+design -load bram36_sdp
+select spram_32x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_32x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_32x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X36_nonsplit
+
+select -clear
+design -load bram36_sdp
+select spram_18x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_18x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_18x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_nonsplit
+
+select -clear
+design -load bram36_sdp
+select spram_16x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_16x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_16x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_nonsplit
+
+select -clear
+design -load bram36_sdp
+select spram_9x4096
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_9x4096 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_9x4096_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_nonsplit
+
+select -clear
+design -load bram36_sdp
+select spram_8x4096
+select *
+synth_quicklogic -family qlf_k6n10f -top spram_8x4096 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/spram_8x4096_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_nonsplit
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.v
new file mode 100644
index 0000000..783bc36
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/bram36k_sdp.v
@@ -0,0 +1,297 @@
+// 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
+
+module spram_36x1024 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 36;
+parameter BE_WIDTH = 4;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x36_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(4'b1111),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
+
+module spram_32x1024 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 10;
+parameter RD_ADDR_WIDTH = 10;
+parameter WR_DATA_WIDTH = 32;
+parameter RD_DATA_WIDTH = 32;
+parameter BE_WIDTH = 4;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x36_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(4'b1111),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
+
+module spram_18x2048 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 11;
+parameter RD_ADDR_WIDTH = 11;
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x36_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(2'b11),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
+
+module spram_16x2048 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 11;
+parameter RD_ADDR_WIDTH = 11;
+parameter WR_DATA_WIDTH = 16;
+parameter RD_DATA_WIDTH = 16;
+parameter BE_WIDTH = 2;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x36_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(2'b11),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
+
+module spram_9x4096 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 12;
+parameter RD_ADDR_WIDTH = 12;
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 9;
+parameter BE_WIDTH = 1;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x36_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(1'b1),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
+
+module spram_8x4096 (
+ WEN_i,
+ REN_i,
+ clock0,
+ clock1,
+ WR_ADDR_i,
+ RD_ADDR_i,
+ WDATA_i,
+ RDATA_o
+);
+
+parameter WR_ADDR_WIDTH = 12;
+parameter RD_ADDR_WIDTH = 12;
+parameter WR_DATA_WIDTH = 8;
+parameter RD_DATA_WIDTH = 8;
+parameter BE_WIDTH = 1;
+
+input wire WEN_i;
+input wire REN_i;
+input wire clock0;
+input wire clock1;
+input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
+input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
+input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
+output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
+
+RAM_36K_BLK #(
+ .WR_ADDR_WIDTH(WR_ADDR_WIDTH),
+ .RD_ADDR_WIDTH(RD_ADDR_WIDTH),
+ .WR_DATA_WIDTH(WR_DATA_WIDTH),
+ .RD_DATA_WIDTH(RD_DATA_WIDTH),
+ .BE_WIDTH(BE_WIDTH)
+ ) spram_x36_inst (
+
+ .WEN_i(WEN_i),
+ .WR_BE_i(1'b1),
+ .REN_i(REN_i),
+ .WR_CLK_i(clock0),
+ .RD_CLK_i(clock1),
+ .WR_ADDR_i(WR_ADDR_i),
+ .RD_ADDR_i(RD_ADDR_i),
+ .WDATA_i(WDATA_i),
+ .RDATA_o(RDATA_o)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/Makefile
new file mode 100644
index 0000000..ca7d1af
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/Makefile
@@ -0,0 +1,51 @@
+# 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
+
+TESTBENCH = bram36k_sdp_tb.v
+POST_SYNTH = spram_36x1024_post_synth spram_32x1024_post_synth spram_18x2048_post_synth spram_16x2048_post_synth spram_9x4096_post_synth spram_8x4096_post_synth
+ADDR_WIDTH = 10 10 11 11 12 12
+DATA_WIDTH = 36 32 18 16 9 8
+TOP = spram_36x1024 spram_32x1024 spram_18x2048 spram_16x2048 spram_9x4096 spram_8x4096
+ADDR_DEFINES = $(foreach awidth, $(ADDR_WIDTH),-DADDR_WIDTH="$(awidth)")
+DATA_DEFINES = $(foreach dwidth, $(DATA_WIDTH),-DDATA_WIDTH="$(dwidth)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR_DEFINES)) $(word $(1),$(DATA_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+# FIXME: $(call simulate_post_synth,5)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
+ $(call simulate_post_synth,4)
+ $(call clean_post_synth_sim,4)
+ $(call simulate_post_synth,5)
+ $(call clean_post_synth_sim,5)
+ $(call simulate_post_synth,6)
+ $(call clean_post_synth_sim,6)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/bram36k_sdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/bram36k_sdp_tb.v
new file mode 100644
index 0000000..1c003ec
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sdp/sim/bram36k_sdp_tb.v
@@ -0,0 +1,176 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 50;
+ localparam ADDR_INCR = 1;
+
+ reg clk;
+ reg rce;
+ reg [`ADDR_WIDTH-1:0] ra;
+ wire [`DATA_WIDTH-1:0] rq;
+ reg wce;
+ reg [`ADDR_WIDTH-1:0] wa;
+ reg [`DATA_WIDTH-1:0] wd;
+
+ initial clk = 0;
+ initial ra = 0;
+ initial rce = 0;
+ initial forever #(PERIOD / 2.0) clk = ~clk;
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+
+ reg done;
+ initial done = 1'b0;
+
+ reg [`DATA_WIDTH-1:0] expected;
+
+ always @(posedge clk) begin
+ expected <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH{1'b1}};
+ end
+
+ wire error = ((a != 0) && read_test) ? rq !== expected : 0;
+
+ integer error_cnt = 0;
+ always @ (posedge clk)
+ begin
+ if (error)
+ error_cnt <= error_cnt + 1'b1;
+ end
+
+ reg read_test;
+ initial read_test = 0;
+
+ initial #(1) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH); a = a + ADDR_INCR) begin
+ @(negedge clk) begin
+ wa = a;
+ wd = a | (a << 20) | 20'h55000;
+ wce = 1;
+ end
+ @(posedge clk) begin
+ #(PERIOD/10) wce = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH); a = a + ADDR_INCR) begin
+ @(negedge clk) begin
+ ra = a;
+ rce = 1;
+ end
+ @(posedge clk) begin
+ #(PERIOD/10) rce = 0;
+ if ( rq !== expected) begin
+ $display("%d: FAIL: mismatch act=%x exp=%x at %x", $time, rq, expected, a);
+ end else begin
+ $display("%d: OK: act=%x exp=%x at %x", $time, rq, expected, a);
+ end
+ end
+ end
+ done = 1'b1;
+ end
+
+ // Scan for simulation finish
+ always @(posedge clk) begin
+ if (done)
+ $finish_and_return( (error_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "spram_36x1024": begin
+ spram_36x1024 #() bram (
+ .clock0(clk),
+ .clock1(clk),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ "spram_32x1024": begin
+ spram_32x1024 #() bram (
+ .clock0(clk),
+ .clock1(clk),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ "spram_18x2048": begin
+ spram_18x2048 #() bram (
+ .clock0(clk),
+ .clock1(clk),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ "spram_16x2048": begin
+ spram_16x2048 #() bram (
+ .clock0(clk),
+ .clock1(clk),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ "spram_9x4096": begin
+ spram_9x4096 #() bram (
+ .clock0(clk),
+ .clock1(clk),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ "spram_8x4096": begin
+ spram_8x4096 #() bram (
+ .clock0(clk),
+ .clock1(clk),
+ .REN_i(rce),
+ .RD_ADDR_i(ra),
+ .RDATA_o(rq),
+ .WEN_i(wce),
+ .WR_ADDR_i(wa),
+ .WDATA_i(wd)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.tcl
new file mode 100644
index 0000000..8ffd95f
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.tcl
@@ -0,0 +1,38 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram36k_sfifo
+
+select f1024x36_1024x36
+select *
+synth_quicklogic -family qlf_k6n10f -top f1024x36_1024x36 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f1024x36_1024x36_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X36_RD_X36_nonsplit
+
+select -clear
+design -load bram36k_sfifo
+select f2048x18_2048x18
+select *
+synth_quicklogic -family qlf_k6n10f -top f2048x18_2048x18 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f2048x18_2048x18_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X18_RD_X18_nonsplit
+
+select -clear
+design -load bram36k_sfifo
+select f4096x9_4096x9
+select *
+synth_quicklogic -family qlf_k6n10f -top f4096x9_4096x9 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/f4096x9_4096x9_post_synth.v
+select -assert-count 1 t:TDP36K_FIFO_SYNC_WR_X9_RD_X9_nonsplit
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.v
new file mode 100644
index 0000000..63df3b2
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/bram36k_sfifo.v
@@ -0,0 +1,138 @@
+// 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
+
+module f1024x36_1024x36 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 36;
+parameter RD_DATA_WIDTH = 36;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module f2048x18_2048x18 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 18;
+parameter RD_DATA_WIDTH = 18;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
+
+module f4096x9_4096x9 (DIN,PUSH,POP,clock0,Async_Flush,Almost_Full,Almost_Empty,Full,Empty,Full_Watermark,Empty_Watermark,Overrun_Error,Underrun_Error,DOUT);
+
+parameter WR_DATA_WIDTH = 9;
+parameter RD_DATA_WIDTH = 9;
+parameter UPAE_DBITS = 12'd10;
+parameter UPAF_DBITS = 12'd10;
+
+input clock0;
+input PUSH,POP;
+input [WR_DATA_WIDTH-1:0] DIN;
+input Async_Flush;
+output [RD_DATA_WIDTH-1:0] DOUT;
+output Almost_Full,Almost_Empty;
+output Full, Empty;
+output Full_Watermark, Empty_Watermark;
+output Overrun_Error, Underrun_Error;
+
+SFIFO_36K_BLK # (.WR_DATA_WIDTH(WR_DATA_WIDTH),.RD_DATA_WIDTH(RD_DATA_WIDTH),.UPAE_DBITS(UPAE_DBITS),.UPAF_DBITS(UPAF_DBITS)
+ )
+ FIFO_INST (
+ .DIN(DIN),
+ .PUSH(PUSH),
+ .POP(POP),
+ .CLK(clock0),
+ .Async_Flush(Async_Flush),
+
+ .Overrun_Error(Overrun_Error),
+ .Full_Watermark(Full_Watermark),
+ .Almost_Full(Almost_Full),
+ .Full(Full),
+
+ .Underrun_Error(Underrun_Error),
+ .Empty_Watermark(Empty_Watermark),
+ .Almost_Empty(Almost_Empty),
+ .Empty(Empty),
+
+ .DOUT(DOUT)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/Makefile
new file mode 100644
index 0000000..1cb26f3
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/Makefile
@@ -0,0 +1,49 @@
+# 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
+
+TESTBENCH = bram36k_sfifo_tb.v
+POST_SYNTH = f1024x36_1024x36_post_synth f2048x18_2048x18_post_synth f4096x9_4096x9_post_synth
+ADDR_WIDTH0 = 10 11 12
+DATA_WIDTH0 = 36 18 9
+ADDR_WIDTH1 = 10 11 12
+DATA_WIDTH1 = 36 18 9
+TOP = f1024x36_1024x36 f2048x18_2048x18 f4096x9_4096x9
+ADDR0_DEFINES = $(foreach awidth0, $(ADDR_WIDTH0),-DADDR_WIDTH0="$(awidth0)")
+ADDR1_DEFINES = $(foreach awidth1, $(ADDR_WIDTH1),-DADDR_WIDTH1="$(awidth1)")
+DATA0_DEFINES = $(foreach dwidth0, $(DATA_WIDTH0),-DDATA_WIDTH0="$(dwidth0)")
+DATA1_DEFINES = $(foreach dwidth1, $(DATA_WIDTH1),-DDATA_WIDTH1="$(dwidth1)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR0_DEFINES)) $(word $(1),$(ADDR1_DEFINES)) $(word $(1),$(DATA0_DEFINES)) $(word $(1),$(DATA1_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+# FIXME: $(call simulate_post_synth,5)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/bram36k_sfifo_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/bram36k_sfifo_tb.v
new file mode 100644
index 0000000..df2362c
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_sfifo/sim/bram36k_sfifo_tb.v
@@ -0,0 +1,170 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 30;
+ localparam ADDR_INCR = 1;
+
+ reg clk;
+ reg flush;
+ reg pop;
+ wire [`DATA_WIDTH1-1:0] dout;
+ reg push;
+ reg [`DATA_WIDTH0-1:0] din;
+ wire almost_full,almost_empty;
+ wire full, empty;
+ wire full_watermark, empty_watermark;
+ wire overrun_error, underrun_error;
+
+ initial
+ begin
+ clk = 0;
+ pop = 0;
+ push = 0;
+ flush = 1;
+ din = 0;
+ #40
+ flush = 0;
+ end
+
+ initial forever #(PERIOD / 3.0) clk = ~clk;
+
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+
+ reg done;
+ initial done = 1'b0;
+
+ reg read_test;
+ initial read_test = 0;
+
+ reg [`DATA_WIDTH1-1:0] expected;
+ initial expected = 0;
+
+ always @(posedge clk) begin
+ expected <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH1{1'b1}};
+ end
+
+ wire error = ((a != 0) && read_test) ? dout !== expected : 0;
+
+ integer error_cnt = 0;
+ always @ (posedge clk)
+ begin
+ if (error)
+ error_cnt <= error_cnt + 1'b1;
+ end
+
+ initial #(50) begin
+ @(posedge clk)
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH0); a = a + ADDR_INCR) begin
+ @(negedge clk) begin
+ din = a | (a << 20) | 20'h55000;
+ push = 1;
+ end
+ @(posedge clk) begin
+ #(PERIOD/10) push = 0;
+ end
+ end
+ // Read data
+ read_test = 1;
+ for (a = 0; a < (1<<`ADDR_WIDTH1); a = a + ADDR_INCR) begin
+ @(posedge clk) begin
+ #(PERIOD/10) pop = 0;
+ if ( dout !== expected) begin
+ $display("%d: FAIL: mismatch act=%x exp=%x at %x", $time, dout, expected, a);
+ end else begin
+ $display("%d: OK: act=%x exp=%x at %x", $time, dout, expected, a);
+ end
+ end
+ @(negedge clk) begin
+ pop = 1;
+ end
+ end
+ done = 1'b1;
+ end
+
+ // Scan for simulation finish
+ always @(posedge clk) begin
+ if (done)
+ $finish_and_return( (error_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "f1024x36_1024x36": begin
+ f1024x36_1024x36 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "f2048x18_2048x18": begin
+ f2048x18_2048x18 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ "f4096x9_4096x9": begin
+ f4096x9_4096x9 #() afifo (
+ .DIN(din),
+ .PUSH(push),
+ .POP(pop),
+ .clock0(clk),
+ .Async_Flush(flush),
+ .Almost_Full(almost_full),
+ .Almost_Empty(almost_empty),
+ .Full(full),
+ .Empty(empty),
+ .Full_Watermark(full_watermark),
+ .Empty_Watermark(empty_watermark),
+ .Overrun_Error(overrun_error),
+ .Underrun_Error(underrun_error),
+ .DOUT(dout)
+ );
+ end
+ endcase
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.tcl b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.tcl
new file mode 100644
index 0000000..df4591e
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.tcl
@@ -0,0 +1,38 @@
+yosys -import
+
+if { [info procs ql-qlf-k6n10f] == {} } { plugin -i ql-qlf }
+yosys -import ;
+
+read_verilog $::env(DESIGN_TOP).v
+design -save bram36k_tdp
+
+select dpram_36x1024
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_36x1024 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_36x1024_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X36_RD_X36_nonsplit
+
+select -clear
+design -load bram36k_tdp
+select dpram_18x2048
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_18x2048 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_18x2048_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X18_RD_X18_nonsplit
+
+select -clear
+design -load bram36k_tdp
+select dpram_9x4096
+select *
+synth_quicklogic -family qlf_k6n10f -top dpram_9x4096 -bram_types
+opt_expr -undriven
+opt_clean
+stat
+write_verilog sim/dpram_9x4096_post_synth.v
+select -assert-count 1 t:TDP36K_BRAM_WR_X9_RD_X9_nonsplit
\ No newline at end of file
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.v
new file mode 100644
index 0000000..89fdbec
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/bram36k_tdp.v
@@ -0,0 +1,213 @@
+// 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
+
+module dpram_36x1024 (
+ clock0,
+ WEN1_i,
+ REN1_i,
+ WR1_ADDR_i,
+ RD1_ADDR_i,
+ WDATA1_i,
+ RDATA1_o,
+
+ clock1,
+ WEN2_i,
+ REN2_i,
+ WR2_ADDR_i,
+ RD2_ADDR_i,
+ WDATA2_i,
+ RDATA2_o
+);
+
+parameter ADDR_WIDTH = 10;
+parameter DATA_WIDTH = 36;
+parameter BE1_WIDTH = 4;
+parameter BE2_WIDTH = 4;
+
+input wire clock0;
+input wire WEN1_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire clock1;
+input wire WEN2_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+DPRAM_36K_BLK #(
+ .ADDR_WIDTH(ADDR_WIDTH),
+ .DATA_WIDTH(DATA_WIDTH),
+ .BE1_WIDTH(BE1_WIDTH),
+ .BE2_WIDTH(BE2_WIDTH)
+ ) dpram_x36_inst (
+ .CLK1_i(clock0),
+ .WEN1_i(WEN1_i),
+ .WR1_BE_i(4'b1111),
+ .REN1_i(REN1_i),
+ .WR1_ADDR_i(WR1_ADDR_i),
+ .RD1_ADDR_i(RD1_ADDR_i),
+ .WDATA1_i(WDATA1_i),
+ .RDATA1_o(RDATA1_o),
+
+ .CLK2_i(clock1),
+ .WEN2_i(WEN2_i),
+ .WR2_BE_i(4'b1111),
+ .REN2_i(REN2_i),
+ .WR2_ADDR_i(WR2_ADDR_i),
+ .RD2_ADDR_i(RD2_ADDR_i),
+ .WDATA2_i(WDATA2_i),
+ .RDATA2_o(RDATA2_o)
+ );
+
+endmodule
+
+module dpram_18x2048 (
+ clock0,
+ WEN1_i,
+ REN1_i,
+ WR1_ADDR_i,
+ RD1_ADDR_i,
+ WDATA1_i,
+ RDATA1_o,
+
+ clock1,
+ WEN2_i,
+ REN2_i,
+ WR2_ADDR_i,
+ RD2_ADDR_i,
+ WDATA2_i,
+ RDATA2_o
+);
+
+parameter ADDR_WIDTH = 11;
+parameter DATA_WIDTH = 18;
+parameter BE1_WIDTH = 2;
+parameter BE2_WIDTH = 2;
+
+input wire clock0;
+input wire WEN1_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire clock1;
+input wire WEN2_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+DPRAM_36K_BLK #(
+ .ADDR_WIDTH(ADDR_WIDTH),
+ .DATA_WIDTH(DATA_WIDTH),
+ .BE1_WIDTH(BE1_WIDTH),
+ .BE2_WIDTH(BE2_WIDTH)
+ ) dpram_x36_inst (
+ .CLK1_i(clock0),
+ .WEN1_i(WEN1_i),
+ .WR1_BE_i(2'b11),
+ .REN1_i(REN1_i),
+ .WR1_ADDR_i(WR1_ADDR_i),
+ .RD1_ADDR_i(RD1_ADDR_i),
+ .WDATA1_i(WDATA1_i),
+ .RDATA1_o(RDATA1_o),
+
+ .CLK2_i(clock1),
+ .WEN2_i(WEN2_i),
+ .WR2_BE_i(2'b11),
+ .REN2_i(REN2_i),
+ .WR2_ADDR_i(WR2_ADDR_i),
+ .RD2_ADDR_i(RD2_ADDR_i),
+ .WDATA2_i(WDATA2_i),
+ .RDATA2_o(RDATA2_o)
+ );
+
+endmodule
+
+module dpram_9x4096 (
+ clock0,
+ WEN1_i,
+ REN1_i,
+ WR1_ADDR_i,
+ RD1_ADDR_i,
+ WDATA1_i,
+ RDATA1_o,
+
+ clock1,
+ WEN2_i,
+ REN2_i,
+ WR2_ADDR_i,
+ RD2_ADDR_i,
+ WDATA2_i,
+ RDATA2_o
+);
+
+parameter ADDR_WIDTH = 12;
+parameter DATA_WIDTH = 9;
+parameter BE1_WIDTH = 1;
+parameter BE2_WIDTH = 1;
+
+input wire clock0;
+input wire WEN1_i;
+input wire REN1_i;
+input wire [ADDR_WIDTH-1 :0] WR1_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD1_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA1_i;
+output wire [DATA_WIDTH-1 :0] RDATA1_o;
+
+input wire clock1;
+input wire WEN2_i;
+input wire REN2_i;
+input wire [ADDR_WIDTH-1 :0] WR2_ADDR_i;
+input wire [ADDR_WIDTH-1 :0] RD2_ADDR_i;
+input wire [DATA_WIDTH-1 :0] WDATA2_i;
+output wire [DATA_WIDTH-1 :0] RDATA2_o;
+
+DPRAM_36K_BLK #(
+ .ADDR_WIDTH(ADDR_WIDTH),
+ .DATA_WIDTH(DATA_WIDTH),
+ .BE1_WIDTH(BE1_WIDTH),
+ .BE2_WIDTH(BE2_WIDTH)
+ ) dpram_x36_inst (
+ .CLK1_i(clock0),
+ .WEN1_i(WEN1_i),
+ .WR1_BE_i(1'b1),
+ .REN1_i(REN1_i),
+ .WR1_ADDR_i(WR1_ADDR_i),
+ .RD1_ADDR_i(RD1_ADDR_i),
+ .WDATA1_i(WDATA1_i),
+ .RDATA1_o(RDATA1_o),
+
+ .CLK2_i(clock1),
+ .WEN2_i(WEN2_i),
+ .WR2_BE_i(1'b1),
+ .REN2_i(REN2_i),
+ .WR2_ADDR_i(WR2_ADDR_i),
+ .RD2_ADDR_i(RD2_ADDR_i),
+ .WDATA2_i(WDATA2_i),
+ .RDATA2_o(RDATA2_o)
+ );
+
+endmodule
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/Makefile b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/Makefile
new file mode 100644
index 0000000..2a0c20d
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/Makefile
@@ -0,0 +1,45 @@
+# 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
+
+TESTBENCH = bram36k_tdp_tb.v
+POST_SYNTH = dpram_36x1024_post_synth dpram_18x2048_post_synth dpram_9x4096_post_synth
+ADDR_WIDTH = 10 11 12
+DATA_WIDTH = 36 18 9
+TOP = dpram_36x1024 dpram_18x2048 dpram_9x4096
+ADDR_DEFINES = $(foreach awidth, $(ADDR_WIDTH),-DADDR_WIDTH="$(awidth)")
+DATA_DEFINES = $(foreach dwidth, $(DATA_WIDTH),-DDATA_WIDTH="$(dwidth)")
+TOP_DEFINES = $(foreach top, $(TOP),-DTOP="$(top)")
+VCD_DEFINES = $(foreach vcd, $(POST_SYNTH),-DVCD="$(vcd).vcd")
+
+SIM_LIBS = $(shell find ../../../../qlf_k6n10f -name "*.v" -not -name "*_map.v")
+
+define simulate_post_synth
+ @iverilog -vvvv -g2005 $(word $(1),$(ADDR_DEFINES)) $(word $(1),$(DATA_DEFINES)) $(word $(1),$(TOP_DEFINES)) $(word $(1),$(VCD_DEFINES)) -o $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).v $(SIM_LIBS) $(TESTBENCH) > $(word $(1),$(POST_SYNTH)).vvp.log 2>&1
+ @vvp -vvvv $(word $(1),$(POST_SYNTH)).vvp > $(word $(1),$(POST_SYNTH)).vcd.log 2>&1
+endef
+
+define clean_post_synth_sim
+ @rm -rf $(word $(1),$(POST_SYNTH)).vcd $(word $(1),$(POST_SYNTH)).vvp $(word $(1),$(POST_SYNTH)).vvp.log $(word $(1),$(POST_SYNTH)).vcd.log
+endef
+
+# FIXME: $(call simulate_post_synth,5)
+sim:
+ $(call simulate_post_synth,1)
+ $(call clean_post_synth_sim,1)
+ $(call simulate_post_synth,2)
+ $(call clean_post_synth_sim,2)
+ $(call simulate_post_synth,3)
+ $(call clean_post_synth_sim,3)
diff --git a/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/bram36k_tdp_tb.v b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/bram36k_tdp_tb.v
new file mode 100644
index 0000000..01de7e7
--- /dev/null
+++ b/ql-qlf-plugin/tests/qlf_k6n10f/bram36k_tdp/sim/bram36k_tdp_tb.v
@@ -0,0 +1,220 @@
+// 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
+
+`timescale 1ns/1ps
+
+`define STRINGIFY(x) `"x`"
+
+module TB;
+ localparam PERIOD = 50;
+ localparam ADDR_INCR = 1;
+
+ reg clk_a;
+ reg rce_a;
+ reg [`ADDR_WIDTH-1:0] ra_a;
+ wire [`DATA_WIDTH-1:0] rq_a;
+ reg wce_a;
+ reg [`ADDR_WIDTH-1:0] wa_a;
+ reg [`DATA_WIDTH-1:0] wd_a;
+
+ reg clk_b;
+ reg rce_b;
+ reg [`ADDR_WIDTH-1:0] ra_b;
+ wire [`DATA_WIDTH-1:0] rq_b;
+ reg wce_b;
+ reg [`ADDR_WIDTH-1:0] wa_b;
+ reg [`DATA_WIDTH-1:0] wd_b;
+
+
+ initial clk_a = 0;
+ initial clk_b = 0;
+ initial ra_a = 0;
+ initial ra_b = 0;
+ initial rce_a = 0;
+ initial rce_b = 0;
+ initial forever #(PERIOD / 2.0) clk_a = ~clk_a;
+ initial begin
+ #(PERIOD / 4.0);
+ forever #(PERIOD / 2.0) clk_b = ~clk_b;
+ end
+ initial begin
+ $dumpfile(`STRINGIFY(`VCD));
+ $dumpvars;
+ end
+
+ integer a;
+ integer b;
+
+ reg done_a;
+ reg done_b;
+ initial done_a = 1'b0;
+ initial done_b = 1'b0;
+ wire done_sim = done_a & done_b;
+
+ reg [`DATA_WIDTH-1:0] expected_a;
+ reg [`DATA_WIDTH-1:0] expected_b;
+
+ always @(posedge clk_a) begin
+ expected_a <= (a | (a << 20) | 20'h55000) & {`DATA_WIDTH{1'b1}};
+ end
+ always @(posedge clk_b) begin
+ expected_b <= (b | (b << 20) | 20'h55000) & {`DATA_WIDTH{1'b1}};
+ end
+
+ wire error_a = a != 0 ? rq_a !== expected_a : 0;
+ wire error_b = b != (1<<`ADDR_WIDTH) / 2 ? rq_b !== expected_b : 0;
+
+ integer error_a_cnt = 0;
+ integer error_b_cnt = 0;
+
+ always @ (posedge clk_a)
+ begin
+ if (error_a)
+ error_a_cnt <= error_a_cnt + 1'b1;
+ end
+ always @ (posedge clk_b)
+ begin
+ if (error_b)
+ error_b_cnt <= error_b_cnt + 1'b1;
+ end
+ // PORT A
+ initial #(1) begin
+ // Write data
+ for (a = 0; a < (1<<`ADDR_WIDTH) / 2; a = a + ADDR_INCR) begin
+ @(negedge clk_a) begin
+ wa_a = a;
+ wd_a = a | (a << 20) | 20'h55000;
+ wce_a = 1;
+ end
+ @(posedge clk_a) begin
+ #(PERIOD/10) wce_a = 0;
+ end
+ end
+ // Read data
+ for (a = 0; a < (1<<`ADDR_WIDTH) / 2; a = a + ADDR_INCR) begin
+ @(negedge clk_a) begin
+ ra_a = a;
+ rce_a = 1;
+ end
+ @(posedge clk_a) begin
+ #(PERIOD/10) rce_a = 0;
+ if ( rq_a !== expected_a) begin
+ $display("%d: PORT A: FAIL: mismatch act=%x exp=%x at %x", $time, rq_a, expected_a, a);
+ end else begin
+ $display("%d: PORT A: OK: act=%x exp=%x at %x", $time, rq_a, expected_a, a);
+ end
+ end
+ end
+ done_a = 1'b1;
+ end
+
+ // PORT B
+ initial #(1) begin
+ // Write data
+ for (b = (1<<`ADDR_WIDTH) / 2; b < (1<<`ADDR_WIDTH); b = b + ADDR_INCR) begin
+ @(negedge clk_b) begin
+ wa_b = b;
+ wd_b = b | (b << 20) | 20'h55000;
+ wce_b = 1;
+ end
+ @(posedge clk_b) begin
+ #(PERIOD/10) wce_b = 0;
+ end
+ end
+ // Read data
+ for (b = (1<<`ADDR_WIDTH) / 2; b < (1<<`ADDR_WIDTH); b = b + ADDR_INCR) begin
+ @(negedge clk_b) begin
+ ra_b = b;
+ rce_b = 1;
+ end
+ @(posedge clk_b) begin
+ #(PERIOD/10) rce_b = 0;
+ if ( rq_b !== expected_b) begin
+ $display("%d: PORT B: FAIL: mismatch act=%x exp=%x at %x", $time, rq_b, expected_b, b);
+ end else begin
+ $display("%d: PORT B: OK: act=%x exp=%x at %x", $time, rq_b, expected_b, b);
+ end
+ end
+ end
+ done_b = 1'b1;
+ end
+
+ // Scan for simulation finish
+ always @(posedge clk_a, posedge clk_b) begin
+ if (done_sim)
+ $finish_and_return( (error_a_cnt == 0 & error_b_cnt == 0) ? 0 : -1 );
+ end
+
+ case (`STRINGIFY(`TOP))
+ "dpram_36x1024": begin
+ dpram_36x1024 #() bram (
+ .clock0(clk_a),
+ .REN1_i(rce_a),
+ .RD1_ADDR_i(ra_a),
+ .RDATA1_o(rq_a),
+ .WEN1_i(wce_a),
+ .WR1_ADDR_i(wa_a),
+ .WDATA1_i(wd_a),
+
+ .clock1(clk_b),
+ .REN2_i(rce_b),
+ .RD2_ADDR_i(ra_b),
+ .RDATA2_o(rq_b),
+ .WEN2_i(wce_b),
+ .WR2_ADDR_i(wa_b),
+ .WDATA2_i(wd_b)
+ );
+ end
+ "dpram_18x2048": begin
+ dpram_18x2048 #() bram (
+ .clock0(clk_a),
+ .REN1_i(rce_a),
+ .RD1_ADDR_i(ra_a),
+ .RDATA1_o(rq_a),
+ .WEN1_i(wce_a),
+ .WR1_ADDR_i(wa_a),
+ .WDATA1_i(wd_a),
+
+ .clock1(clk_b),
+ .REN2_i(rce_b),
+ .RD2_ADDR_i(ra_b),
+ .RDATA2_o(rq_b),
+ .WEN2_i(wce_b),
+ .WR2_ADDR_i(wa_b),
+ .WDATA2_i(wd_b)
+ );
+ end
+ "dpram_9x4096": begin
+ dpram_9x4096 #() bram (
+ .clock0(clk_a),
+ .REN1_i(rce_a),
+ .RD1_ADDR_i(ra_a),
+ .RDATA1_o(rq_a),
+ .WEN1_i(wce_a),
+ .WR1_ADDR_i(wa_a),
+ .WDATA1_i(wd_a),
+
+ .clock1(clk_b),
+ .REN2_i(rce_b),
+ .RD2_ADDR_i(ra_b),
+ .RDATA2_o(rq_b),
+ .WEN2_i(wce_b),
+ .WR2_ADDR_i(wa_b),
+ .WDATA2_i(wd_b)
+ );
+ end
+ endcase
+endmodule