Added simulation models for EOS-S3 hard blocks
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
diff --git a/ql-qlf-plugin/Makefile b/ql-qlf-plugin/Makefile
index a03bd71..522de75 100644
--- a/ql-qlf-plugin/Makefile
+++ b/ql-qlf-plugin/Makefile
@@ -36,10 +36,13 @@
$(PP3_DIR)/pp3_latches_map.v \
$(PP3_DIR)/pp3_lut_map.v \
$(PP3_DIR)/pp3_lutdefs.txt \
+ $(PP3_DIR)/pp3_brams_sim.v \
$(PP3_DIR)/pp3_brams_map.v \
$(PP3_DIR)/pp3_brams.txt \
$(PP3_DIR)/pp3_bram_init_8_16.vh \
- $(PP3_DIR)/pp3_bram_init_32.vh
+ $(PP3_DIR)/pp3_bram_init_32.vh \
+ $(PP3_DIR)/pp3_qlal4s3b_sim.v \
+ $(PP3_DIR)/pp3_mult_sim.v
retrieve-pmgen:=$(shell mkdir -p pmgen && wget -nc -O pmgen/pmgen.py https://raw.githubusercontent.com/SymbiFlow/yosys/master%2Bwip/passes/pmgen/pmgen.py)
diff --git a/ql-qlf-plugin/pp3/pp3_brams_sim.v b/ql-qlf-plugin/pp3/pp3_brams_sim.v
new file mode 100644
index 0000000..a5bc4a6
--- /dev/null
+++ b/ql-qlf-plugin/pp3/pp3_brams_sim.v
@@ -0,0 +1,2879 @@
+`timescale 1ns/10ps
+module fifo_controller_model(
+ Rst_n,
+ Push_Clk,
+ Pop_Clk,
+
+ Fifo_Push,
+ Fifo_Push_Flush,
+ Fifo_Full,
+ Fifo_Full_Usr,
+
+ Fifo_Pop,
+ Fifo_Pop_Flush,
+ Fifo_Empty,
+ Fifo_Empty_Usr,
+
+ Write_Addr,
+
+ Read_Addr,
+
+ // Static Control Signals
+ Fifo_Ram_Mode,
+ Fifo_Sync_Mode,
+ Fifo_Push_Width,
+ Fifo_Pop_Width
+ );
+
+
+
+ //************* PPII 4K Parameters **************************//
+
+ parameter MAX_PTR_WIDTH = 12;
+
+ parameter DEPTH1 = (1<<(MAX_PTR_WIDTH-3));
+ parameter DEPTH2 = (1<<(MAX_PTR_WIDTH-2));
+ parameter DEPTH3 = (1<<(MAX_PTR_WIDTH-1));
+
+ parameter D1_QTR_A = MAX_PTR_WIDTH - 5;
+ parameter D2_QTR_A = MAX_PTR_WIDTH - 4;
+ parameter D3_QTR_A = MAX_PTR_WIDTH - 3;
+
+ input Rst_n;
+ input Push_Clk;
+ input Pop_Clk;
+
+ input Fifo_Push;
+ input Fifo_Push_Flush;
+ output Fifo_Full;
+ output [3:0] Fifo_Full_Usr;
+
+ input Fifo_Pop;
+ input Fifo_Pop_Flush;
+ output Fifo_Empty;
+ output [3:0] Fifo_Empty_Usr;
+
+ output [MAX_PTR_WIDTH-2:0] Write_Addr;
+
+ output [MAX_PTR_WIDTH-2:0] Read_Addr;
+
+ input Fifo_Ram_Mode;
+ input Fifo_Sync_Mode;
+ input [1:0] Fifo_Push_Width;
+ input [1:0] Fifo_Pop_Width;
+
+ reg flush_pop_clk_tf;
+ reg flush_pop2push_clk1;
+ reg flush_push_clk_tf;
+ reg flush_push2pop_clk1;
+ reg pop_local_flush_mask;
+ reg push_flush_tf_pop_clk;
+ reg pop2push_ack1;
+ reg pop2push_ack2;
+ reg push_local_flush_mask;
+ reg pop_flush_tf_push_clk;
+ reg push2pop_ack1;
+ reg push2pop_ack2;
+
+ reg fifo_full_flag_f;
+ reg [3:0] Fifo_Full_Usr;
+
+ reg fifo_empty_flag_f;
+ reg [3:0] Fifo_Empty_Usr;
+
+ reg [MAX_PTR_WIDTH-1:0] push_ptr_push_clk;
+ reg [MAX_PTR_WIDTH-1:0] pop_ptr_push_clk;
+ reg [MAX_PTR_WIDTH-1:0] pop_ptr_async;
+ reg [MAX_PTR_WIDTH-1:0] pop_ptr_pop_clk ;
+ reg [MAX_PTR_WIDTH-1:0] push_ptr_pop_clk;
+ reg [MAX_PTR_WIDTH-1:0] push_ptr_async;
+
+ reg [1:0] push_ptr_push_clk_mask;
+ reg [1:0] pop_ptr_pop_clk_mask;
+
+ reg [MAX_PTR_WIDTH-1:0] pop_ptr_push_clk_mux;
+ reg [MAX_PTR_WIDTH-1:0] push_ptr_pop_clk_mux;
+
+ reg match_room4none;
+ reg match_room4one;
+ reg match_room4half;
+ reg match_room4quart;
+
+ reg match_all_left;
+ reg match_half_left;
+ reg match_quart_left;
+
+ reg [MAX_PTR_WIDTH-1:0] depth1_reg;
+ reg [MAX_PTR_WIDTH-1:0] depth2_reg;
+ reg [MAX_PTR_WIDTH-1:0] depth3_reg;
+
+
+ wire push_clk_rst;
+ wire push_clk_rst_mux;
+ wire push_flush_done;
+ wire pop_clk_rst;
+ wire pop_clk_rst_mux;
+ wire pop_flush_done;
+
+ wire push_flush_gated;
+ wire pop_flush_gated;
+
+ wire [MAX_PTR_WIDTH-2:0] Write_Addr;
+ wire [MAX_PTR_WIDTH-2:0] Read_Addr;
+
+ wire [MAX_PTR_WIDTH-1:0] push_ptr_push_clk_plus1;
+ wire [MAX_PTR_WIDTH-1:0] next_push_ptr_push_clk;
+ wire [MAX_PTR_WIDTH-1:0] pop_ptr_pop_clk_plus1;
+ wire [MAX_PTR_WIDTH-1:0] next_pop_ptr_pop_clk;
+ wire [MAX_PTR_WIDTH-1:0] next_push_ptr_push_clk_mask;
+ wire [MAX_PTR_WIDTH-1:0] next_pop_ptr_pop_clk_mask;
+
+ wire [MAX_PTR_WIDTH-1:0] pop_ptr_push_clk_l_shift1;
+ wire [MAX_PTR_WIDTH-1:0] pop_ptr_push_clk_l_shift2;
+ wire [MAX_PTR_WIDTH-1:0] pop_ptr_push_clk_r_shift1;
+ wire [MAX_PTR_WIDTH-1:0] pop_ptr_push_clk_r_shift2;
+
+ wire [MAX_PTR_WIDTH-1:0] push_ptr_pop_clk_l_shift1;
+ wire [MAX_PTR_WIDTH-1:0] push_ptr_pop_clk_l_shift2;
+ wire [MAX_PTR_WIDTH-1:0] push_ptr_pop_clk_r_shift1;
+ wire [MAX_PTR_WIDTH-1:0] push_ptr_pop_clk_r_shift2;
+
+ wire [MAX_PTR_WIDTH-1:0] push_diff;
+ wire [MAX_PTR_WIDTH-1:0] push_diff_plus_1;
+ wire [MAX_PTR_WIDTH-1:0] pop_diff;
+
+ wire match_room4all;
+ wire match_room4eight;
+
+ wire match_one_left;
+ wire match_one2eight_left;
+
+ integer depth_sel_push;
+ integer depth_sel_pop;
+
+ initial
+ begin
+ depth1_reg = DEPTH1;
+ depth2_reg = DEPTH2;
+ depth3_reg = DEPTH3;
+ end
+
+ initial
+ begin
+ flush_pop_clk_tf <= 1'b0;
+ push2pop_ack1 <= 1'b0;
+ push2pop_ack2 <= 1'b0;
+ pop_local_flush_mask <= 1'b0;
+ flush_push2pop_clk1 <= 1'b0;
+ push_flush_tf_pop_clk <= 1'b0;
+ flush_push_clk_tf <= 1'b0;
+ pop2push_ack1 <= 1'b0;
+ pop2push_ack2 <= 1'b0;
+ push_local_flush_mask <= 1'b0;
+ flush_pop2push_clk1 <= 1'b0;
+ pop_flush_tf_push_clk <= 1'b0;
+ push_ptr_push_clk <= 0;
+ pop_ptr_push_clk <= 0;
+ pop_ptr_async <= 0;
+ fifo_full_flag_f <= 0;
+ pop_ptr_pop_clk <= 0;
+ push_ptr_pop_clk <= 0;
+ push_ptr_async <= 0;
+ fifo_empty_flag_f <= 1;
+ Fifo_Full_Usr <= 4'b0001;
+ Fifo_Empty_Usr <= 4'b0000;
+ end
+
+ assign Fifo_Full = fifo_full_flag_f;
+ assign Fifo_Empty = fifo_empty_flag_f;
+
+ assign Write_Addr = push_ptr_push_clk[MAX_PTR_WIDTH-2:0];
+ assign Read_Addr = next_pop_ptr_pop_clk[MAX_PTR_WIDTH-2:0];
+
+ assign push_ptr_push_clk_plus1 = push_ptr_push_clk + 1;
+ assign next_push_ptr_push_clk = ( Fifo_Push ) ? push_ptr_push_clk_plus1 : push_ptr_push_clk;
+ assign next_push_ptr_push_clk_mask = { ( push_ptr_push_clk_mask & next_push_ptr_push_clk[MAX_PTR_WIDTH-1:MAX_PTR_WIDTH-2] ), next_push_ptr_push_clk[MAX_PTR_WIDTH-3:0] };
+
+ assign pop_ptr_pop_clk_plus1 = pop_ptr_pop_clk + 1;
+ assign next_pop_ptr_pop_clk = ( Fifo_Pop ) ? pop_ptr_pop_clk_plus1 : pop_ptr_pop_clk;
+ assign next_pop_ptr_pop_clk_mask = { ( pop_ptr_pop_clk_mask & next_pop_ptr_pop_clk[MAX_PTR_WIDTH-1:MAX_PTR_WIDTH-2] ), next_pop_ptr_pop_clk[MAX_PTR_WIDTH-3:0] };
+
+ assign pop_ptr_push_clk_l_shift1 = { pop_ptr_push_clk[MAX_PTR_WIDTH-2:0], 1'b0 };
+ assign pop_ptr_push_clk_l_shift2 = { pop_ptr_push_clk[MAX_PTR_WIDTH-3:0], 2'b0 };
+ assign pop_ptr_push_clk_r_shift1 = { 1'b0, pop_ptr_push_clk[MAX_PTR_WIDTH-1:1] };
+ assign pop_ptr_push_clk_r_shift2 = { 2'b0, pop_ptr_push_clk[MAX_PTR_WIDTH-1:2] };
+
+ assign push_ptr_pop_clk_l_shift1 = { push_ptr_pop_clk[MAX_PTR_WIDTH-2:0], 1'b0 };
+ assign push_ptr_pop_clk_l_shift2 = { push_ptr_pop_clk[MAX_PTR_WIDTH-3:0], 2'b0 };
+ assign push_ptr_pop_clk_r_shift1 = { 1'b0, push_ptr_pop_clk[MAX_PTR_WIDTH-1:1] };
+ assign push_ptr_pop_clk_r_shift2 = { 2'b0, push_ptr_pop_clk[MAX_PTR_WIDTH-1:2] };
+
+ assign push_diff = next_push_ptr_push_clk_mask - pop_ptr_push_clk_mux;
+ assign push_diff_plus_1 = push_diff + 1;
+ assign pop_diff = push_ptr_pop_clk_mux - next_pop_ptr_pop_clk_mask;
+
+ assign match_room4all = ~|push_diff;
+ assign match_room4eight = ( depth_sel_push == 3 ) ? ( push_diff >= DEPTH3-8 ) : ( depth_sel_push == 2 ) ? ( push_diff >= DEPTH2-8 ) : ( push_diff >= DEPTH1-8 );
+
+ assign match_one_left = ( pop_diff == 1 );
+ assign match_one2eight_left = ( pop_diff < 8 );
+
+ assign push_flush_gated = Fifo_Push_Flush & ~push_local_flush_mask;
+ assign pop_flush_gated = Fifo_Pop_Flush & ~pop_local_flush_mask;
+
+ assign push_clk_rst = flush_pop2push_clk1 ^ pop_flush_tf_push_clk;
+ assign pop_clk_rst = flush_push2pop_clk1 ^ push_flush_tf_pop_clk;
+
+ assign pop_flush_done = push2pop_ack1 ^ push2pop_ack2;
+ assign push_flush_done = pop2push_ack1 ^ pop2push_ack2;
+
+ assign push_clk_rst_mux = ( Fifo_Sync_Mode ) ? ( Fifo_Push_Flush | Fifo_Pop_Flush ) : ( push_flush_gated | push_clk_rst );
+ assign pop_clk_rst_mux = ( Fifo_Sync_Mode ) ? ( Fifo_Push_Flush | Fifo_Pop_Flush ) : ( pop_flush_gated | ( pop_local_flush_mask & ~pop_flush_done ) | pop_clk_rst );
+
+
+ reg match_room_at_most63, match_at_most63_left;
+
+ always@( push_diff or push_diff_plus_1 or depth_sel_push or match_room4none or match_room4one )
+ begin
+ if( depth_sel_push == 1 )
+ begin
+ match_room4none <= ( push_diff[D1_QTR_A+2:0] == depth1_reg[D1_QTR_A+2:0] );
+// syao 2/12/2013
+ match_room4one <= ( push_diff_plus_1[D1_QTR_A+2:0] == depth1_reg ) | match_room4none;
+
+ match_room4half <= ( push_diff[D1_QTR_A+1] == 1'b1 );
+ match_room4quart <= ( push_diff[D1_QTR_A] == 1'b1 );
+
+ match_room_at_most63 <= push_diff[6];
+ end
+ else if( depth_sel_push == 2 )
+ begin
+ match_room4none <= ( push_diff[D2_QTR_A+2:0] == depth2_reg[D2_QTR_A+2:0] );
+// syao 2/12/2013
+ match_room4one <= ( push_diff_plus_1[D2_QTR_A+2:0] == depth2_reg ) | match_room4none;
+
+ match_room4half <= ( push_diff[D2_QTR_A+1] == 1'b1 );
+ match_room4quart <= ( push_diff[D2_QTR_A] == 1'b1 );
+
+// syao 2/12/2013
+// match_room_at_most63 <= push_diff[6];
+ match_room_at_most63 <= &push_diff[7:6];
+ end
+ else
+ begin
+ match_room4none <= ( push_diff == depth3_reg );
+ match_room4one <= ( push_diff_plus_1 == depth3_reg ) | match_room4none;
+
+ match_room4half <= ( push_diff[D3_QTR_A+1] == 1'b1 );
+ match_room4quart <= ( push_diff[D3_QTR_A] == 1'b1 );
+
+// syao 2/12/2013
+// match_room_at_most63 <= &push_diff[7:6];
+ match_room_at_most63 <= &push_diff[8:6];
+ end
+ end
+
+
+
+ assign room4_32s = ~push_diff[5];
+ assign room4_16s = ~push_diff[4];
+ assign room4_8s = ~push_diff[3];
+ assign room4_4s = ~push_diff[2];
+ assign room4_2s = ~push_diff[1];
+ assign room4_1s = &push_diff[1:0];
+
+ always@( depth_sel_pop or pop_diff )
+ begin
+ if( depth_sel_pop == 1 )
+ begin
+ match_all_left <= ( pop_diff[D1_QTR_A+2:0] == depth1_reg[D1_QTR_A+2:0] );
+
+ match_half_left <= ( pop_diff[D1_QTR_A+1] == 1'b1 );
+ match_quart_left <= ( pop_diff[D1_QTR_A] == 1'b1 );
+
+ match_at_most63_left <= ~pop_diff[6];
+ end
+ else if( depth_sel_pop == 2 )
+ begin
+ match_all_left <= ( pop_diff[D2_QTR_A+2:0] == depth2_reg[D2_QTR_A+2:0] );
+
+ match_half_left <= ( pop_diff[D2_QTR_A+1] == 1'b1 );
+ match_quart_left <= ( pop_diff[D2_QTR_A] == 1'b1 );
+
+// syao 2/12/2013
+// match_at_most63_left <= ~pop_diff[6];
+ match_at_most63_left <= ~|pop_diff[7:6];
+ end
+ else
+ begin
+ match_all_left <= ( pop_diff == depth3_reg );
+
+ match_half_left <= ( pop_diff[D3_QTR_A+1] == 1'b1 );
+ match_quart_left <= ( pop_diff[D3_QTR_A] == 1'b1 );
+
+// syao 2/12/2013
+// match_at_most63_left <= ~|pop_diff[7:6];
+ match_at_most63_left <= ~|pop_diff[8:6];
+ end
+ end
+
+
+
+ assign at_least_32 = pop_diff[5];
+ assign at_least_16 = pop_diff[4];
+ assign at_least_8 = pop_diff[3];
+ assign at_least_4 = pop_diff[2];
+ assign at_least_2 = pop_diff[1];
+ assign one_left = pop_diff[0];
+
+
+ always@( posedge Pop_Clk or negedge Rst_n )
+ begin
+ if( ~Rst_n )
+ begin
+ push2pop_ack1 <= 1'b0;
+ push2pop_ack2 <= 1'b0;
+ flush_pop_clk_tf <= 1'b0;
+ pop_local_flush_mask <= 1'b0;
+ flush_push2pop_clk1 <= 1'b0;
+ push_flush_tf_pop_clk <= 1'b0;
+ end
+ else
+ begin
+ push2pop_ack1 <= pop_flush_tf_push_clk;
+ push2pop_ack2 <= push2pop_ack1;
+ flush_push2pop_clk1 <= flush_push_clk_tf;
+ if( pop_flush_gated )
+ begin
+ flush_pop_clk_tf <= ~flush_pop_clk_tf;
+ end
+
+ if( pop_flush_gated & ~Fifo_Sync_Mode )
+ begin
+ pop_local_flush_mask <= 1'b1;
+ end
+ else if( pop_flush_done )
+ begin
+ pop_local_flush_mask <= 1'b0;
+ end
+
+ if( pop_clk_rst )
+ begin
+ push_flush_tf_pop_clk <= ~push_flush_tf_pop_clk;
+ end
+ end
+ end
+
+ always@( posedge Push_Clk or negedge Rst_n )
+ begin
+ if( ~Rst_n )
+ begin
+ pop2push_ack1 <= 1'b0;
+ pop2push_ack2 <= 1'b0;
+ flush_push_clk_tf <= 1'b0;
+ push_local_flush_mask <= 1'b0;
+ flush_pop2push_clk1 <= 1'b0;
+ pop_flush_tf_push_clk <= 1'b0;
+ end
+ else
+ begin
+ pop2push_ack1 <= push_flush_tf_pop_clk;
+ pop2push_ack2 <= pop2push_ack1;
+ flush_pop2push_clk1 <= flush_pop_clk_tf;
+ if( push_flush_gated )
+ begin
+ flush_push_clk_tf <= ~flush_push_clk_tf;
+ end
+
+ if( push_flush_gated & ~Fifo_Sync_Mode )
+ begin
+ push_local_flush_mask <= 1'b1;
+ end
+ else if( push_flush_done )
+ begin
+ push_local_flush_mask <= 1'b0;
+ end
+
+ if( push_clk_rst )
+ begin
+ pop_flush_tf_push_clk <= ~pop_flush_tf_push_clk;
+ end
+ end
+ end
+
+ always@( Fifo_Push_Width or Fifo_Pop_Width or pop_ptr_push_clk_l_shift1 or pop_ptr_push_clk_l_shift2 or pop_ptr_push_clk_r_shift1 or
+ pop_ptr_push_clk_r_shift2 or push_ptr_pop_clk_l_shift1 or push_ptr_pop_clk_l_shift2 or push_ptr_pop_clk_r_shift1 or push_ptr_pop_clk_r_shift2 or
+ pop_ptr_push_clk or push_ptr_pop_clk )
+ begin
+ case( { Fifo_Push_Width, Fifo_Pop_Width } )
+ 4'b0001: // byte push halfword pop
+ begin
+ push_ptr_push_clk_mask <= 2'b11;
+ pop_ptr_pop_clk_mask <= 2'b01;
+ pop_ptr_push_clk_mux <= pop_ptr_push_clk_l_shift1;
+ push_ptr_pop_clk_mux <= push_ptr_pop_clk_r_shift1;
+ end
+ 4'b0010: // byte push word pop
+ begin
+ push_ptr_push_clk_mask <= 2'b11;
+ pop_ptr_pop_clk_mask <= 2'b00;
+ pop_ptr_push_clk_mux <= pop_ptr_push_clk_l_shift2;
+ push_ptr_pop_clk_mux <= push_ptr_pop_clk_r_shift2;
+ end
+ 4'b0100: // halfword push byte pop
+ begin
+ push_ptr_push_clk_mask <= 2'b01;
+ pop_ptr_pop_clk_mask <= 2'b11;
+ pop_ptr_push_clk_mux <= pop_ptr_push_clk_r_shift1;
+ push_ptr_pop_clk_mux <= push_ptr_pop_clk_l_shift1;
+ end
+ 4'b0110: // halfword push word pop
+ begin
+ push_ptr_push_clk_mask <= 2'b11;
+ pop_ptr_pop_clk_mask <= 2'b01;
+ pop_ptr_push_clk_mux <= pop_ptr_push_clk_l_shift1;
+ push_ptr_pop_clk_mux <= push_ptr_pop_clk_r_shift1;
+ end
+ 4'b1000: // word push byte pop
+ begin
+ push_ptr_push_clk_mask <= 2'b00;
+ pop_ptr_pop_clk_mask <= 2'b11;
+ pop_ptr_push_clk_mux <= pop_ptr_push_clk_r_shift2;
+ push_ptr_pop_clk_mux <= push_ptr_pop_clk_l_shift2;
+ end
+ 4'b1001: // word push halfword pop
+ begin
+ push_ptr_push_clk_mask <= 2'b01;
+ pop_ptr_pop_clk_mask <= 2'b11;
+ pop_ptr_push_clk_mux <= pop_ptr_push_clk_r_shift1;
+ push_ptr_pop_clk_mux <= push_ptr_pop_clk_l_shift1;
+ end
+ default: // no conversion
+ begin
+ push_ptr_push_clk_mask <= 2'b11;
+ pop_ptr_pop_clk_mask <= 2'b11;
+ pop_ptr_push_clk_mux <= pop_ptr_push_clk;
+ push_ptr_pop_clk_mux <= push_ptr_pop_clk;
+ end
+ endcase
+ end
+
+ always@( Fifo_Ram_Mode or Fifo_Push_Width )
+ begin
+ if( Fifo_Ram_Mode == Fifo_Push_Width[0] )
+ begin
+ depth_sel_push <= 2;
+ end
+ else if( Fifo_Ram_Mode == Fifo_Push_Width[1] )
+ begin
+ depth_sel_push <= 1;
+ end
+ else
+ begin
+ depth_sel_push <= 3;
+ end
+ end
+
+ always@( Fifo_Ram_Mode or Fifo_Pop_Width )
+ begin
+ if( Fifo_Ram_Mode == Fifo_Pop_Width[0] )
+ begin
+ depth_sel_pop <= 2;
+ end
+ else if( Fifo_Ram_Mode == Fifo_Pop_Width[1] )
+ begin
+ depth_sel_pop <= 1;
+ end
+ else
+ begin
+ depth_sel_pop <= 3;
+ end
+ end
+
+ always@( posedge Push_Clk or negedge Rst_n )
+ begin
+ if( ~Rst_n )
+ begin
+ push_ptr_push_clk <= 0;
+ pop_ptr_push_clk <= 0;
+ pop_ptr_async <= 0;
+ fifo_full_flag_f <= 0;
+ end
+ else
+ begin
+ if( push_clk_rst_mux )
+ begin
+ push_ptr_push_clk <= 0;
+ pop_ptr_push_clk <= 0;
+ pop_ptr_async <= 0;
+ fifo_full_flag_f <= 0;
+ end
+ else
+ begin
+ push_ptr_push_clk <= next_push_ptr_push_clk;
+ pop_ptr_push_clk <= ( Fifo_Sync_Mode ) ? next_pop_ptr_pop_clk : pop_ptr_async;
+ pop_ptr_async <= pop_ptr_pop_clk;
+ fifo_full_flag_f <= match_room4one | match_room4none;
+ end
+ end
+ end
+
+ always@( posedge Pop_Clk or negedge Rst_n )
+ begin
+ if( ~Rst_n )
+ begin
+ pop_ptr_pop_clk <= 0;
+ push_ptr_pop_clk <= 0;
+ push_ptr_async <= 0;
+ fifo_empty_flag_f <= 1;
+ end
+ else
+ begin
+ if( pop_clk_rst_mux )
+ begin
+ pop_ptr_pop_clk <= 0;
+ push_ptr_pop_clk <= 0;
+ push_ptr_async <= 0;
+ fifo_empty_flag_f <= 1;
+ end
+ else
+ begin
+ pop_ptr_pop_clk <= next_pop_ptr_pop_clk;
+ push_ptr_pop_clk <= ( Fifo_Sync_Mode ) ? next_push_ptr_push_clk : push_ptr_async;
+ push_ptr_async <= push_ptr_push_clk;
+ fifo_empty_flag_f <= ( pop_diff == 1 ) | ( pop_diff == 0 );
+ end
+ end
+ end
+
+ always@( posedge Push_Clk or negedge Rst_n )
+ begin
+ if( ~Rst_n )
+ begin
+
+//based on rtl, this should be full after reset
+// Fifo_Full_Usr <= 4'b1000;
+ Fifo_Full_Usr <= 4'b0001;
+ end
+ else
+ begin
+ if( match_room4none )
+ begin
+ Fifo_Full_Usr <= 4'b0000;
+ end
+ else if( match_room4all )
+ begin
+ Fifo_Full_Usr <= 4'b0001;
+ end
+ else if( ~match_room4half )
+ begin
+ Fifo_Full_Usr <= 4'b0010;
+ end
+ else if( ~match_room4quart )
+ begin
+ Fifo_Full_Usr <= 4'b0011;
+ end
+ else
+ begin
+ if (match_room_at_most63)
+ begin
+ if (room4_32s)
+ Fifo_Full_Usr <= 4'b1010;
+ else if (room4_16s)
+ Fifo_Full_Usr <= 4'b1011;
+ else if (room4_8s)
+ Fifo_Full_Usr <= 4'b1100;
+ else if (room4_4s)
+ Fifo_Full_Usr <= 4'b1101;
+ else if (room4_2s)
+ Fifo_Full_Usr <= 4'b1110;
+ else if (room4_1s)
+ Fifo_Full_Usr <= 4'b1111;
+ else
+ Fifo_Full_Usr <= 4'b1110;
+ end
+ else
+ Fifo_Full_Usr <= 4'b0100;
+ end
+ end
+ end
+
+ always@( posedge Pop_Clk or negedge Rst_n )
+ begin
+ if( ~Rst_n )
+ begin
+ Fifo_Empty_Usr <= 4'b0000;
+ end
+ else
+ begin
+ if( Fifo_Pop_Flush | ( pop_local_flush_mask & ~pop_flush_done ) | pop_clk_rst )
+ begin
+ Fifo_Empty_Usr <= 4'b0000;
+ end
+ else
+ if( match_all_left )
+ begin
+ Fifo_Empty_Usr <= 4'b1111;
+ end
+ else if( match_half_left )
+ begin
+ Fifo_Empty_Usr <= 4'b1110;
+ end
+ else if( match_quart_left )
+ begin
+ Fifo_Empty_Usr <= 4'b1101;
+ end
+ else
+ begin
+ if (match_at_most63_left)
+ begin
+ if (at_least_32)
+ Fifo_Empty_Usr <= 4'b0110;
+ else if (at_least_16)
+ Fifo_Empty_Usr <= 4'b0101;
+ else if (at_least_8)
+ Fifo_Empty_Usr <= 4'b0100;
+ else if (at_least_4)
+ Fifo_Empty_Usr <= 4'b0011;
+ else if (at_least_2)
+ Fifo_Empty_Usr <= 4'b0010;
+ else if (one_left)
+ Fifo_Empty_Usr <= 4'b0001;
+ else Fifo_Empty_Usr <= 4'b0000;
+ end
+ else
+ Fifo_Empty_Usr <= 4'b1000;
+ end
+ end
+ end
+endmodule
+
+`timescale 10 ps /1 ps
+
+//`define ADDRWID 8
+`define DATAWID 18
+`define WEWID 2
+//`define DEPTH 256
+
+module ram(
+ AA,
+ AB,
+ CLKA,
+ CLKB,
+ WENA,
+ WENB,
+ CENA,
+ CENB,
+ WENBA,
+ WENBB,
+ DA,
+ QA,
+ DB,
+ QB
+ );
+
+
+parameter ADDRWID = 8;
+parameter DEPTH = (1<<ADDRWID);
+
+parameter [9215:0] INIT = 9216'bx;
+parameter INIT_FILE="init.mem";
+parameter init_ad = 0;
+
+parameter data_width_int = 16;
+parameter data_depth_int = 1024;
+
+ output [`DATAWID-1:0] QA;
+ input CLKA;
+ input CENA;
+ input WENA;
+ input [`WEWID-1:0] WENBA;
+ input [ADDRWID-1:0] AA;
+ input [`DATAWID-1:0] DA;
+ output [`DATAWID-1:0] QB;
+
+ input CLKB;
+ input CENB;
+ input WENB;
+ input [`WEWID-1:0] WENBB;
+ input [ADDRWID-1:0] AB;
+ input [`DATAWID-1:0] DB;
+
+ integer i, j, k, l, m, n, o;
+
+ wire CEN1;
+ wire OEN1;
+ wire WEN1;
+ wire [`WEWID-1:0] WENB1;
+ wire [ADDRWID-1:0] A1;
+
+ reg [ADDRWID-1:0] AddrOut1;
+ wire [`DATAWID-1:0] I1;
+
+ wire CEN2;
+ wire OEN2;
+ wire WEN2;
+ wire [`WEWID-1:0] WENB2;
+ wire [ADDRWID-1:0] A2;
+
+ reg [ADDRWID-1:0] AddrOut2;
+ wire [`DATAWID-1:0] I2;
+
+ reg [`DATAWID-1:0] O1, QAreg;
+ reg [`DATAWID-1:0] O2, QBreg;
+
+ reg WEN1_f;
+ reg WEN2_f;
+ reg [ADDRWID-1:0] A2_f;
+ reg [ADDRWID-1:0] A1_f;
+
+ wire CEN1_SEL;
+ wire WEN1_SEL;
+ wire [ADDRWID-1:0] A1_SEL;
+ wire [`DATAWID-1:0] I1_SEL;
+ wire [`WEWID-1:0] WENB1_SEL;
+
+ wire CEN2_SEL;
+ wire WEN2_SEL;
+ wire [ADDRWID-1:0] A2_SEL;
+ wire [`DATAWID-1:0] I2_SEL;
+ wire [`WEWID-1:0] WENB2_SEL;
+ wire overlap;
+
+ wire CLKA_d, CLKB_d, CEN1_d, CEN2_d;
+
+ assign A1_SEL = AA;
+ assign I1_SEL = DA;
+ assign CEN1_SEL = CENA;
+ assign WEN1_SEL = WENA;
+ assign WENB1_SEL = WENBA;
+
+ assign A2_SEL = AB;
+ assign I2_SEL = DB;
+ assign CEN2_SEL = CENB;
+ assign WEN2_SEL = WENB;
+ assign WENB2_SEL = WENBB;
+
+ assign CEN1 = CEN1_SEL;
+ assign OEN1 = 1'b0;
+ assign WEN1 = WEN1_SEL;
+ assign WENB1 = WENB1_SEL;
+ assign A1 = A1_SEL;
+ assign I1 = I1_SEL;
+
+ assign CEN2 = CEN2_SEL;
+ assign OEN2 = 1'b0;
+ assign WEN2 = WEN2_SEL;
+ assign WENB2 = WENB2_SEL;
+ assign A2 = A2_SEL;
+ assign I2 = I2_SEL;
+
+ //assign QA = O1;
+ //assign QB = O2;
+
+ reg [`DATAWID-1:0] ram[DEPTH-1:0];
+ reg [data_width_int-1 :0] ram_dum[data_depth_int-1:0];
+ reg [`DATAWID-1:0] wrData1;
+ reg [`DATAWID-1:0] wrData2;
+ wire [`DATAWID-1:0] tmpData1;
+ wire [`DATAWID-1:0] tmpData2;
+
+ reg CENreg1, CENreg2;
+
+ assign #1 CLKA_d = CLKA;
+ assign #1 CLKB_d = CLKB;
+ // updated by sya 20130523
+ assign #2 CEN1_d = CEN1;
+ assign #2 CEN2_d = CEN2;
+
+ assign QA = QAreg | O1;
+ assign QB = QBreg | O2;
+
+ assign tmpData1 = ram[A1];
+ assign tmpData2 = ram[A2];
+
+ assign overlap = ( A1_f == A2_f ) & WEN1_f & WEN2_f;
+
+ initial begin
+ `ifndef YOSYS
+ $readmemh(INIT_FILE,ram_dum);
+ `endif
+ #10
+ n =0;
+ o =0;
+ for( i = 0; i < DEPTH; i = i+1 )
+ begin
+ if (data_width_int > 16)
+ ram[i] <= {1'b0,ram_dum[i][((16*init_ad)+16)-1:((16*init_ad)+8)],1'b0,ram_dum[i][((16*init_ad)+8)-1: (16*init_ad)]};
+ else if (data_width_int <= 8 && data_depth_int <= 1024)
+ ram[i] <= {1'b0,ram_dum[i+n+1+(1024*init_ad)][7:0],1'b0,ram_dum[i+n+(1024*init_ad)][7:0]};
+ else if (data_width_int <= 8 && data_depth_int > 1024)
+ ram[i] <= {1'b0,ram_dum[i+o+init_ad+1][7:0],1'b0,ram_dum[i+o+init_ad][7:0]};
+ else if (data_width_int > 8 && data_width_int <= 16 && data_depth_int > 512)
+ ram[i] <= {1'b0,ram_dum[i+n+init_ad][15:8],1'b0,ram_dum[i+n+init_ad][7:0]};
+ else
+ ram[i] <= {1'b0,ram_dum[i+(512*init_ad)][15:8],1'b0,ram_dum[i+(512*init_ad)][7:0]};
+
+ n= n+1;
+ o= o+3;
+ end
+ end
+
+ always@( WENB1 or I1 or tmpData1 )
+ begin
+ for( j = 0; j < 9; j = j+1 )
+ begin
+ wrData1[j] <= ( WENB1[0] ) ? tmpData1[j] : I1[j];
+ end
+ for( l = 9; l < 19; l = l+1 )
+ begin
+ wrData1[l] <= ( WENB1[1] ) ? tmpData1[l] : I1[l];
+ end
+ end
+
+ always@( posedge CLKA )
+ begin
+ if( ~WEN1 & ~CEN1 )
+ begin
+ ram[A1] <= wrData1[`DATAWID-1:0];
+ end
+ end
+
+//pre-charging to 1 every clock cycle
+ always@( posedge CLKA_d)
+ if(~CEN1_d)
+ begin
+ O1 = 18'h3ffff;
+ #100;
+ O1 = 18'h00000;
+ end
+
+
+ always@( posedge CLKA )
+ if (~CEN1)
+ begin
+ AddrOut1 <= A1;
+ end
+
+ always@( posedge CLKA_d)
+ if (~CEN1_d)
+ begin
+ QAreg <= ram[AddrOut1];
+ end
+
+
+ always@( posedge CLKA )
+ begin
+ WEN1_f <= ~WEN1 & ~CEN1;
+ A1_f<= A1;
+
+ end
+
+ always@( WENB2 or I2 or tmpData2 )
+ begin
+ for( k = 0; k < 9; k = k+1 )
+ begin
+ wrData2[k] <= ( WENB2[0] ) ? tmpData2[k] : I2[k];
+ end
+ for( m = 9; m < 19; m = m+1 )
+ begin
+ wrData2[m] <= ( WENB2[1] ) ? tmpData2[m] : I2[m];
+ end
+ end
+
+ always@( posedge CLKB )
+ begin
+ if( ~WEN2 & ~CEN2 )
+ begin
+ ram[A2] <= wrData2[`DATAWID-1:0];
+ end
+ end
+
+//pre-charging to 1 every clock cycle
+ always@( posedge CLKB_d )
+ if(~CEN2_d)
+ begin
+ O2 = 18'h3ffff;
+ #100;
+ O2 = 18'h00000;
+ end
+
+ always@( posedge CLKB )
+ if (~CEN2)
+ begin
+ AddrOut2 <= A2;
+ end
+
+ always@( posedge CLKB_d )
+ if (~CEN2_d)
+ begin
+ QBreg <= ram[AddrOut2];
+ end
+
+ always@( posedge CLKB )
+ begin
+ WEN2_f <= ~WEN2 & ~CEN2;
+ A2_f<=A2;
+
+ end
+
+ always@( A1_f or A2_f or overlap)
+ begin
+ if( overlap )
+ begin
+ ram[A1_f] <= 18'bxxxxxxxxxxxxxxxxxx;
+ end
+ end
+
+endmodule
+
+`timescale 1 ns /10 ps
+//`define ADDRWID 10
+`define DATAWID 18
+`define WEWID 2
+
+module x2_model(
+ Concat_En,
+
+ ram0_WIDTH_SELA,
+ ram0_WIDTH_SELB,
+ ram0_PLRD,
+
+ ram0_CEA,
+ ram0_CEB,
+ ram0_I,
+ ram0_O,
+ ram0_AA,
+ ram0_AB,
+ ram0_CSBA,
+ ram0_CSBB,
+ ram0_WENBA,
+
+ ram1_WIDTH_SELA,
+ ram1_WIDTH_SELB,
+ ram1_PLRD,
+
+ ram1_CEA,
+ ram1_CEB,
+ ram1_I,
+ ram1_O,
+ ram1_AA,
+ ram1_AB,
+ ram1_CSBA,
+ ram1_CSBB,
+ ram1_WENBA
+ );
+
+parameter ADDRWID = 10;
+parameter [18431:0] INIT = 18432'bx;
+parameter INIT_FILE="init.mem";
+parameter data_width_int = 16;
+parameter data_depth_int = 1024;
+parameter init_ad1 = 0;
+parameter init_ad2 = (data_depth_int > 1024)?2:1;
+
+
+ input Concat_En;
+
+ input [1:0] ram0_WIDTH_SELA;
+ input [1:0] ram0_WIDTH_SELB;
+ input ram0_PLRD;
+ input ram0_CEA;
+ input ram0_CEB;
+ input [`DATAWID-1:0] ram0_I;
+ output [`DATAWID-1:0] ram0_O;
+ input [ADDRWID-1:0] ram0_AA;
+ input [ADDRWID-1:0] ram0_AB;
+ input ram0_CSBA;
+ input ram0_CSBB;
+ input [`WEWID-1:0] ram0_WENBA;
+
+ input [1:0] ram1_WIDTH_SELA;
+ input [1:0] ram1_WIDTH_SELB;
+ input ram1_PLRD;
+ input ram1_CEA;
+ input ram1_CEB;
+ input [`DATAWID-1:0] ram1_I;
+ output [`DATAWID-1:0] ram1_O;
+ input [ADDRWID-1:0] ram1_AA;
+ input [ADDRWID-1:0] ram1_AB;
+ input ram1_CSBA;
+ input ram1_CSBB;
+ input [`WEWID-1:0] ram1_WENBA;
+
+ reg ram0_PLRDA_SEL;
+ reg ram0_PLRDB_SEL;
+ reg ram1_PLRDA_SEL;
+ reg ram1_PLRDB_SEL;
+ reg ram_AA_ram_SEL;
+ reg ram_AB_ram_SEL;
+
+ reg [`WEWID-1:0] ram0_WENBA_SEL;
+ reg [`WEWID-1:0] ram0_WENBB_SEL;
+ reg [`WEWID-1:0] ram1_WENBA_SEL;
+ reg [`WEWID-1:0] ram1_WENBB_SEL;
+
+ reg ram0_A_x9_SEL;
+ reg ram0_B_x9_SEL;
+ reg ram1_A_x9_SEL;
+ reg ram1_B_x9_SEL;
+
+ reg [ADDRWID-3:0] ram0_AA_SEL;
+ reg [ADDRWID-3:0] ram0_AB_SEL;
+ reg [ADDRWID-3:0] ram1_AA_SEL;
+ reg [ADDRWID-3:0] ram1_AB_SEL;
+
+ reg ram0_AA_byte_SEL;
+ reg ram0_AB_byte_SEL;
+ reg ram1_AA_byte_SEL;
+ reg ram1_AB_byte_SEL;
+
+ reg ram0_AA_byte_SEL_Q;
+ reg ram0_AB_byte_SEL_Q;
+ reg ram1_AA_byte_SEL_Q;
+ reg ram1_AB_byte_SEL_Q;
+ reg ram0_A_mux_ctl_Q;
+ reg ram0_B_mux_ctl_Q;
+ reg ram1_A_mux_ctl_Q;
+ reg ram1_B_mux_ctl_Q;
+
+ reg ram0_O_mux_ctrl_Q;
+ reg ram1_O_mux_ctrl_Q;
+
+ reg ram_AA_ram_SEL_Q;
+ reg ram_AB_ram_SEL_Q;
+
+ wire [`DATAWID-1:0] QA_1_SEL3;
+ wire [`DATAWID-1:0] QB_0_SEL2;
+ wire [`DATAWID-1:0] QB_1_SEL2;
+
+ reg [`DATAWID-1:0] QA_0_Q;
+ reg [`DATAWID-1:0] QB_0_Q;
+ reg [`DATAWID-1:0] QA_1_Q;
+ reg [`DATAWID-1:0] QB_1_Q;
+
+ wire [`DATAWID-1:0] QA_0;
+ wire [`DATAWID-1:0] QB_0;
+ wire [`DATAWID-1:0] QA_1;
+ wire [`DATAWID-1:0] QB_1;
+
+ wire ram0_CSBA_SEL;
+ wire ram0_CSBB_SEL;
+ wire ram1_CSBA_SEL;
+ wire ram1_CSBB_SEL;
+
+ wire [`DATAWID-1:0] ram0_I_SEL1;
+ wire [`DATAWID-1:0] ram1_I_SEL1;
+
+ wire dual_port;
+
+ wire ram0_WEBA_SEL;
+ wire ram0_WEBB_SEL;
+ wire ram1_WEBA_SEL;
+ wire ram1_WEBB_SEL;
+
+ wire [`DATAWID-1:0] ram1_I_SEL2;
+
+ wire [`DATAWID-1:0] QA_1_SEL2;
+ wire [`DATAWID-1:0] QA_0_SEL1;
+ wire [`DATAWID-1:0] QB_0_SEL1;
+ wire [`DATAWID-1:0] QA_1_SEL1;
+ wire [`DATAWID-1:0] QB_1_SEL1;
+
+ wire [`DATAWID-1:0] QB_0_SEL3;
+ wire [`DATAWID-1:0] QA_0_SEL2;
+
+ initial
+ begin
+ QA_0_Q <= 0;
+ QB_0_Q <= 0;
+ QA_1_Q <= 0;
+ QB_1_Q <= 0;
+ ram0_AA_byte_SEL_Q <= 0;
+ ram0_A_mux_ctl_Q <= 0;
+ ram0_AB_byte_SEL_Q <= 0;
+ ram0_B_mux_ctl_Q <= 0;
+ ram1_AA_byte_SEL_Q <= 0;
+ ram1_A_mux_ctl_Q <= 0;
+ ram1_AB_byte_SEL_Q <= 0;
+ ram1_B_mux_ctl_Q <= 0;
+ ram_AA_ram_SEL_Q <= 0;
+ ram1_O_mux_ctrl_Q <= 0;
+ ram_AB_ram_SEL_Q <= 0;
+ ram0_O_mux_ctrl_Q <= 0;
+ end
+
+ assign dual_port = Concat_En & ~( ram0_WIDTH_SELA[1] | ram0_WIDTH_SELB[1] );
+
+ assign ram0_CSBA_SEL = ram0_CSBA;
+ assign ram0_CSBB_SEL = ram0_CSBB;
+ assign ram1_CSBA_SEL = Concat_En ? ram0_CSBA : ram1_CSBA;
+ assign ram1_CSBB_SEL = Concat_En ? ram0_CSBB : ram1_CSBB;
+
+ assign ram0_O = QB_0_SEL3;
+ assign ram1_O = dual_port ? QA_1_SEL3 : QB_1_SEL2;
+
+ assign ram0_I_SEL1[8:0] = ram0_I[8:0];
+ assign ram1_I_SEL1[8:0] = ram1_I[8:0];
+ assign ram0_I_SEL1[17:9] = ram0_AA_byte_SEL ? ram0_I[8:0] : ram0_I[17:9];
+ assign ram1_I_SEL1[17:9] = ( ( ~Concat_En & ram1_AA_byte_SEL ) | ( dual_port & ram0_AB_byte_SEL ) ) ? ram1_I[8:0] : ram1_I[17:9];
+
+ assign ram1_I_SEL2 = ( Concat_En & ~ram0_WIDTH_SELA[1] ) ? ram0_I_SEL1 : ram1_I_SEL1;
+
+ assign ram0_WEBA_SEL = &ram0_WENBA_SEL;
+ assign ram0_WEBB_SEL = &ram0_WENBB_SEL;
+ assign ram1_WEBA_SEL = &ram1_WENBA_SEL;
+ assign ram1_WEBB_SEL = &ram1_WENBB_SEL;
+
+ assign QA_0_SEL1 = ( ram0_PLRDA_SEL ) ? QA_0_Q : QA_0 ;
+ assign QB_0_SEL1 = ( ram0_PLRDB_SEL ) ? QB_0_Q : QB_0 ;
+ assign QA_1_SEL1 = ( ram1_PLRDA_SEL ) ? QA_1_Q : QA_1 ;
+ assign QB_1_SEL1 = ( ram1_PLRDB_SEL ) ? QB_1_Q : QB_1 ;
+
+ assign QA_1_SEL3 = ram1_O_mux_ctrl_Q ? QA_1_SEL2 : QA_0_SEL2;
+
+ assign QA_0_SEL2[8:0] = ram0_A_mux_ctl_Q ? QA_0_SEL1[17:9] : QA_0_SEL1[8:0] ;
+ assign QB_0_SEL2[8:0] = ram0_B_mux_ctl_Q ? QB_0_SEL1[17:9] : QB_0_SEL1[8:0] ;
+ assign QA_1_SEL2[8:0] = ram1_A_mux_ctl_Q ? QA_1_SEL1[17:9] : QA_1_SEL1[8:0] ;
+ assign QB_1_SEL2[8:0] = ram1_B_mux_ctl_Q ? QB_1_SEL1[17:9] : QB_1_SEL1[8:0] ;
+
+ assign QA_0_SEL2[17:9] = QA_0_SEL1[17:9];
+ assign QB_0_SEL2[17:9] = QB_0_SEL1[17:9];
+ assign QA_1_SEL2[17:9] = QA_1_SEL1[17:9];
+ assign QB_1_SEL2[17:9] = QB_1_SEL1[17:9];
+
+ assign QB_0_SEL3 = ram0_O_mux_ctrl_Q ? QB_1_SEL2 : QB_0_SEL2;
+
+ always@( posedge ram0_CEA )
+ begin
+ QA_0_Q <= QA_0;
+ end
+ always@( posedge ram0_CEB )
+ begin
+ QB_0_Q <= QB_0;
+ end
+ always@( posedge ram1_CEA )
+ begin
+ QA_1_Q <= QA_1;
+ end
+ always@( posedge ram1_CEB )
+ begin
+ QB_1_Q <= QB_1;
+ end
+
+ always@( posedge ram0_CEA )
+ begin
+ if( ram0_CSBA_SEL == 0 )
+ ram0_AA_byte_SEL_Q <= ram0_AA_byte_SEL;
+ if( ram0_PLRDA_SEL || ( ram0_CSBA_SEL == 0 ) )
+ ram0_A_mux_ctl_Q <= ram0_A_x9_SEL & ( ram0_PLRDA_SEL ? ram0_AA_byte_SEL_Q : ram0_AA_byte_SEL );
+ end
+
+ always@( posedge ram0_CEB)
+ begin
+ if( ram0_CSBB_SEL == 0 )
+ ram0_AB_byte_SEL_Q <= ram0_AB_byte_SEL;
+ if( ram0_PLRDB_SEL || ( ram0_CSBB_SEL == 0 ) )
+ ram0_B_mux_ctl_Q <= ram0_B_x9_SEL & ( ram0_PLRDB_SEL ? ram0_AB_byte_SEL_Q : ram0_AB_byte_SEL );
+ end
+
+ always@( posedge ram1_CEA )
+ begin
+ if( ram1_CSBA_SEL == 0 )
+ ram1_AA_byte_SEL_Q <= ram1_AA_byte_SEL;
+ if( ram1_PLRDA_SEL || (ram1_CSBA_SEL == 0 ) )
+ ram1_A_mux_ctl_Q <= ram1_A_x9_SEL & ( ram1_PLRDA_SEL ? ram1_AA_byte_SEL_Q : ram1_AA_byte_SEL );
+ end
+
+ always@( posedge ram1_CEB )
+ begin
+ if( ram1_CSBB_SEL == 0 )
+ ram1_AB_byte_SEL_Q <= ram1_AB_byte_SEL;
+ if( ram1_PLRDB_SEL || (ram1_CSBB_SEL == 0 ) )
+ ram1_B_mux_ctl_Q <= ram1_B_x9_SEL & ( ram1_PLRDB_SEL ? ram1_AB_byte_SEL_Q : ram1_AB_byte_SEL );
+ end
+
+ always@( posedge ram0_CEA )
+ begin
+ ram_AA_ram_SEL_Q <= ram_AA_ram_SEL;
+ ram1_O_mux_ctrl_Q <= ( ram0_PLRDA_SEL ? ram_AA_ram_SEL_Q : ram_AA_ram_SEL );
+ end
+
+ always@( posedge ram0_CEB )
+ begin
+ ram_AB_ram_SEL_Q <= ram_AB_ram_SEL;
+ ram0_O_mux_ctrl_Q <= ( ram0_PLRDB_SEL ? ram_AB_ram_SEL_Q : ram_AB_ram_SEL );
+ end
+
+ always@( Concat_En or ram0_WIDTH_SELA or ram0_WIDTH_SELB or ram0_AA or ram0_AB or ram0_WENBA or
+ ram1_AA or ram1_AB or ram1_WENBA or ram0_PLRD or ram1_PLRD or ram1_WIDTH_SELA or ram1_WIDTH_SELB )
+ begin
+ ram0_A_x9_SEL <= ( ~|ram0_WIDTH_SELA );
+ ram1_A_x9_SEL <= ( ~|ram0_WIDTH_SELA );
+ ram0_B_x9_SEL <= ( ~|ram0_WIDTH_SELB );
+ ram0_AA_byte_SEL <= ram0_AA[0] & ( ~|ram0_WIDTH_SELA );
+ ram0_AB_byte_SEL <= ram0_AB[0] & ( ~|ram0_WIDTH_SELB );
+ if( ~Concat_En )
+ begin
+ ram_AA_ram_SEL <= 1'b0;
+ ram_AB_ram_SEL <= 1'b0;
+ ram1_B_x9_SEL <= ( ~|ram1_WIDTH_SELB );
+
+ ram0_PLRDA_SEL <= ram0_PLRD;
+ ram0_PLRDB_SEL <= ram0_PLRD;
+ ram1_PLRDA_SEL <= ram1_PLRD;
+ ram1_PLRDB_SEL <= ram1_PLRD;
+ ram0_WENBB_SEL <= {`WEWID{1'b1}};
+ ram1_WENBB_SEL <= {`WEWID{1'b1}};
+
+ ram0_AA_SEL <= ram0_AA >> ( ~|ram0_WIDTH_SELA );
+ ram0_WENBA_SEL[0] <= ( ram0_AA[0] & ( ~|ram0_WIDTH_SELA ) ) | ram0_WENBA[0];
+ ram0_WENBA_SEL[1] <= ( ~ram0_AA[0] & ( ~|ram0_WIDTH_SELA ) ) | ram0_WENBA[( |ram0_WIDTH_SELA )];
+ ram0_AB_SEL <= ram0_AB >> ( ~|ram0_WIDTH_SELB );
+
+ ram1_AA_SEL <= ram1_AA >> ( ~|ram1_WIDTH_SELA );
+ ram1_AA_byte_SEL <= ram1_AA[0] & ( ~|ram1_WIDTH_SELA );
+ ram1_WENBA_SEL[0] <= ( ram1_AA[0] & ( ~|ram1_WIDTH_SELA ) ) | ram1_WENBA[0];
+ ram1_WENBA_SEL[1] <= ( ~ram1_AA[0] & ( ~|ram1_WIDTH_SELA ) ) | ram1_WENBA[( |ram1_WIDTH_SELA )];
+ ram1_AB_SEL <= ram1_AB >> ( ~|ram1_WIDTH_SELB );
+ ram1_AB_byte_SEL <= ram1_AB[0] & ( ~|ram1_WIDTH_SELB );
+ end
+ else
+ begin
+ ram_AA_ram_SEL <= ~ram0_WIDTH_SELA[1] & ram0_AA[~ram0_WIDTH_SELA[0]];
+ ram_AB_ram_SEL <= ~ram0_WIDTH_SELB[1] & ram0_AB[~ram0_WIDTH_SELB[0]];
+ ram1_B_x9_SEL <= ( ~|ram0_WIDTH_SELB );
+
+ ram0_PLRDA_SEL <= ram1_PLRD;
+ ram1_PLRDA_SEL <= ram1_PLRD;
+ ram0_PLRDB_SEL <= ram0_PLRD;
+ ram1_PLRDB_SEL <= ram0_PLRD;
+
+ ram0_AA_SEL <= ram0_AA >> { ~ram0_WIDTH_SELA[1] & ~( ram0_WIDTH_SELA[1] ^ ram0_WIDTH_SELA[0] ), ~ram0_WIDTH_SELA[1] & ram0_WIDTH_SELA[0] };
+ ram1_AA_SEL <= ram0_AA >> { ~ram0_WIDTH_SELA[1] & ~( ram0_WIDTH_SELA[1] ^ ram0_WIDTH_SELA[0] ), ~ram0_WIDTH_SELA[1] & ram0_WIDTH_SELA[0] };
+ ram1_AA_byte_SEL <= ram0_AA[0] & ( ~|ram0_WIDTH_SELA );
+ ram0_WENBA_SEL[0] <= ram0_WENBA[0] | ( ~ram0_WIDTH_SELA[1] & ( ram0_AA[0] | ( ~ram0_WIDTH_SELA[0] & ram0_AA[1] ) ) );
+ ram0_WENBA_SEL[1] <= ( ( ~|ram0_WIDTH_SELA & ram0_WENBA[0] ) | ( |ram0_WIDTH_SELA & ram0_WENBA[1] ) ) | ( ~ram0_WIDTH_SELA[1] & ( ( ram0_WIDTH_SELA[0] & ram0_AA[0] ) | ( ~ram0_WIDTH_SELA[0] & ~ram0_AA[0] ) | ( ~ram0_WIDTH_SELA[0] & ram0_AA[1] ) ) );
+
+ ram1_WENBA_SEL[0] <= ( ( ~ram0_WIDTH_SELA[1] & ram0_WENBA[0] ) | ( ram0_WIDTH_SELA[1] & ram1_WENBA[0] ) ) | ( ~ram0_WIDTH_SELA[1] & ( ( ram0_WIDTH_SELA[0] & ~ram0_AA[0] ) | ( ~ram0_WIDTH_SELA[0] & ram0_AA[0] ) | ( ~ram0_WIDTH_SELA[0] & ~ram0_AA[1] ) ) );
+ ram1_WENBA_SEL[1] <= ( ( ( ram0_WIDTH_SELA == 2'b00 ) & ram0_WENBA[0] ) | ( ( ram0_WIDTH_SELA[1] == 1'b1 ) & ram1_WENBA[1] ) | ( ( ram0_WIDTH_SELA == 2'b01 ) & ram0_WENBA[1] ) ) | ( ~ram0_WIDTH_SELA[1] & ( ~ram0_AA[0] | ( ~ram0_WIDTH_SELA[0] & ~ram0_AA[1] ) ) );
+
+ ram0_AB_SEL <= ram0_AB >> { ~ram0_WIDTH_SELB[1] & ~( ram0_WIDTH_SELB[1] ^ ram0_WIDTH_SELB[0] ), ~ram0_WIDTH_SELB[1] & ram0_WIDTH_SELB[0] };
+ ram1_AB_SEL <= ram0_AB >> { ~ram0_WIDTH_SELB[1] & ~( ram0_WIDTH_SELB[1] ^ ram0_WIDTH_SELB[0] ), ~ram0_WIDTH_SELB[1] & ram0_WIDTH_SELB[0] };
+ ram1_AB_byte_SEL <= ram0_AB[0] & ( ~|ram0_WIDTH_SELB );
+ ram0_WENBB_SEL[0] <= ram0_WIDTH_SELB[1] | ( ram0_WIDTH_SELA[1] | ram1_WENBA[0] | ( ram0_AB[0] | ( ~ram0_WIDTH_SELB[0] & ram0_AB[1] ) ) );
+ ram0_WENBB_SEL[1] <= ram0_WIDTH_SELB[1] | ( ram0_WIDTH_SELA[1] | ( ( ~|ram0_WIDTH_SELB & ram1_WENBA[0] ) | ( |ram0_WIDTH_SELB & ram1_WENBA[1] ) ) | ( ( ram0_WIDTH_SELB[0] & ram0_AB[0] ) | ( ~ram0_WIDTH_SELB[0] & ~ram0_AB[0] ) | ( ~ram0_WIDTH_SELB[0] & ram0_AB[1] ) ) );
+ ram1_WENBB_SEL[0] <= ram0_WIDTH_SELB[1] | ( ram0_WIDTH_SELA[1] | ram1_WENBA[0] | ( ( ram0_WIDTH_SELB[0] & ~ram0_AB[0] ) | ( ~ram0_WIDTH_SELB[0] & ram0_AB[0] ) | ( ~ram0_WIDTH_SELB[0] & ~ram0_AB[1] ) ) );
+ ram1_WENBB_SEL[1] <= ram0_WIDTH_SELB[1] | ( ram0_WIDTH_SELA[1] | ( ( ~|ram0_WIDTH_SELB & ram1_WENBA[0] ) | ( |ram0_WIDTH_SELB & ram1_WENBA[1] ) ) | ( ~ram0_AB[0] | ( ~ram0_WIDTH_SELB[0] & ~ram0_AB[1] ) ) );
+ end
+ end
+
+ ram #(.ADDRWID(ADDRWID-2),
+ .INIT(INIT[ 0*9216 +: 9216]),
+ .INIT_FILE(INIT_FILE),
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int),
+ .init_ad(init_ad1)
+ )
+ ram0_inst(
+ .AA( ram0_AA_SEL ),
+ .AB( ram0_AB_SEL ),
+ .CLKA( ram0_CEA ),
+ .CLKB( ram0_CEB ),
+ .WENA( ram0_WEBA_SEL ),
+ .WENB( ram0_WEBB_SEL ),
+ .CENA( ram0_CSBA_SEL ),
+ .CENB( ram0_CSBB_SEL ),
+ .WENBA( ram0_WENBA_SEL ),
+ .WENBB( ram0_WENBB_SEL ),
+ .DA( ram0_I_SEL1 ),
+ .QA( QA_0 ),
+ .DB( ram1_I_SEL1 ),
+ .QB( QB_0 )
+ );
+
+ ram #(.ADDRWID(ADDRWID-2),
+ .INIT(INIT[ 1*9216 +: 9216]),
+ .INIT_FILE(INIT_FILE),
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int),
+ .init_ad(init_ad2)
+ )
+ ram1_inst(
+ .AA( ram1_AA_SEL ),
+ .AB( ram1_AB_SEL ),
+ .CLKA( ram1_CEA ),
+ .CLKB( ram1_CEB ),
+ .WENA( ram1_WEBA_SEL ),
+ .WENB( ram1_WEBB_SEL ),
+ .CENA( ram1_CSBA_SEL ),
+ .CENB( ram1_CSBB_SEL ),
+ .WENBA( ram1_WENBA_SEL ),
+ .WENBB( ram1_WENBB_SEL ),
+ .DA( ram1_I_SEL2 ),
+ .QA( QA_1 ),
+ .DB( ram1_I_SEL1 ),
+ .QB( QB_1 )
+ );
+
+endmodule
+
+`timescale 1 ns /10 ps
+`define ADDRWID 11
+`define DATAWID 18
+`define WEWID 2
+
+module ram_block_8K (
+ CLK1_0,
+ CLK2_0,
+ WD_0,
+ RD_0,
+ A1_0,
+ A2_0,
+ CS1_0,
+ CS2_0,
+ WEN1_0,
+ POP_0,
+ Almost_Full_0,
+ Almost_Empty_0,
+ PUSH_FLAG_0,
+ POP_FLAG_0,
+
+ FIFO_EN_0,
+ SYNC_FIFO_0,
+ PIPELINE_RD_0,
+ WIDTH_SELECT1_0,
+ WIDTH_SELECT2_0,
+
+ CLK1_1,
+ CLK2_1,
+ WD_1,
+ RD_1,
+ A1_1,
+ A2_1,
+ CS1_1,
+ CS2_1,
+ WEN1_1,
+ POP_1,
+ Almost_Empty_1,
+ Almost_Full_1,
+ PUSH_FLAG_1,
+ POP_FLAG_1,
+
+ FIFO_EN_1,
+ SYNC_FIFO_1,
+ PIPELINE_RD_1,
+ WIDTH_SELECT1_1,
+ WIDTH_SELECT2_1,
+
+ CONCAT_EN_0,
+ CONCAT_EN_1,
+
+ PUSH_0,
+ PUSH_1,
+ aFlushN_0,
+ aFlushN_1
+ );
+
+parameter [18431:0] INIT = 18432'bx;
+parameter INIT_FILE="init.mem";
+parameter data_width_int = 16;
+parameter data_depth_int = 1024;
+
+ input CLK1_0;
+ input CLK2_0;
+ input [`DATAWID-1:0] WD_0;
+ output [`DATAWID-1:0] RD_0;
+ input [`ADDRWID-1:0] A1_0; //chnge
+ input [`ADDRWID-1:0] A2_0; //chnge
+ input CS1_0;
+ input CS2_0;
+ input [`WEWID-1:0] WEN1_0;
+ input POP_0;
+ output Almost_Full_0;
+ output Almost_Empty_0;
+ output [3:0] PUSH_FLAG_0;
+ output [3:0] POP_FLAG_0;
+ input FIFO_EN_0;
+ input SYNC_FIFO_0;
+ input PIPELINE_RD_0;
+ input [1:0] WIDTH_SELECT1_0;
+ input [1:0] WIDTH_SELECT2_0;
+
+ input CLK1_1;
+ input CLK2_1;
+ input [`DATAWID-1:0] WD_1;
+ output [`DATAWID-1:0] RD_1;
+ input [`ADDRWID-1:0] A1_1; //chnge
+ input [`ADDRWID-1:0] A2_1; //chnge
+ input CS1_1;
+ input CS2_1;
+ input [`WEWID-1:0] WEN1_1;
+ input POP_1;
+ output Almost_Full_1;
+ output Almost_Empty_1;
+ output [3:0] PUSH_FLAG_1;
+ output [3:0] POP_FLAG_1;
+ input FIFO_EN_1;
+ input SYNC_FIFO_1;
+ input PIPELINE_RD_1;
+ input [1:0] WIDTH_SELECT1_1;
+ input [1:0] WIDTH_SELECT2_1;
+
+ input CONCAT_EN_0;
+ input CONCAT_EN_1;
+
+
+ input PUSH_0;
+ input PUSH_1;
+ input aFlushN_0;
+ input aFlushN_1;
+
+ reg rstn;
+
+ wire [`WEWID-1:0] RAM0_WENb1_SEL;
+ wire [`WEWID-1:0] RAM1_WENb1_SEL;
+
+ wire RAM0_CS1_SEL;
+ wire RAM0_CS2_SEL;
+ wire RAM1_CS1_SEL;
+ wire RAM1_CS2_SEL;
+
+ wire [`ADDRWID-1:0] Fifo0_Write_Addr;
+ wire [`ADDRWID-1:0] Fifo0_Read_Addr;
+
+ wire [`ADDRWID-1:0] Fifo1_Write_Addr;
+ wire [`ADDRWID-1:0] Fifo1_Read_Addr;
+
+ wire [`ADDRWID-1:0] RAM0_AA_SEL;
+ wire [`ADDRWID-1:0] RAM0_AB_SEL;
+ wire [`ADDRWID-1:0] RAM1_AA_SEL;
+ wire [`ADDRWID-1:0] RAM1_AB_SEL;
+
+ wire Concat_En_SEL;
+
+ // To simulate POR
+ initial
+ begin
+ rstn = 1'b0;
+ #30 rstn = 1'b1;
+ end
+
+ assign fifo0_rstn = rstn & aFlushN_0;
+ assign fifo1_rstn = rstn & aFlushN_1;
+
+ assign Concat_En_SEL = ( CONCAT_EN_0 | WIDTH_SELECT1_0[1] | WIDTH_SELECT2_0[1] )? 1'b1 : 1'b0;
+
+ assign RAM0_AA_SEL = FIFO_EN_0 ? Fifo0_Write_Addr : A1_0[`ADDRWID-1:0];
+ assign RAM0_AB_SEL = FIFO_EN_0 ? Fifo0_Read_Addr : A2_0[`ADDRWID-1:0];
+ assign RAM1_AA_SEL = FIFO_EN_1 ? Fifo1_Write_Addr : A1_1[`ADDRWID-1:0];
+ assign RAM1_AB_SEL = FIFO_EN_1 ? Fifo1_Read_Addr : A2_1[`ADDRWID-1:0];
+
+ assign RAM0_WENb1_SEL = FIFO_EN_0 ? { `WEWID{ ~PUSH_0 } } : ~WEN1_0;
+ assign RAM1_WENb1_SEL = ( FIFO_EN_1 & ~Concat_En_SEL ) ? { `WEWID{ ~PUSH_1 } } :
+ ( ( FIFO_EN_0 & Concat_En_SEL ) ? ( WIDTH_SELECT1_0[1] ? { `WEWID{ ~PUSH_0 } } : { `WEWID{ 1'b1 } } ) : ~WEN1_1 );
+
+ assign RAM0_CS1_SEL = ( FIFO_EN_0 ? CS1_0 : ~CS1_0 );
+ assign RAM0_CS2_SEL = ( FIFO_EN_0 ? CS2_0 : ~CS2_0 );
+ assign RAM1_CS1_SEL = ( FIFO_EN_1 ? CS1_1 : ~CS1_1 );
+ assign RAM1_CS2_SEL = ( FIFO_EN_1 ? CS2_1 : ~CS2_1 );
+
+ x2_model #(.ADDRWID(`ADDRWID),
+ .INIT(INIT),
+ .INIT_FILE(INIT_FILE),
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int)
+ )
+ x2_8K_model_inst(
+ .Concat_En( Concat_En_SEL ),
+
+ .ram0_WIDTH_SELA( WIDTH_SELECT1_0 ),
+ .ram0_WIDTH_SELB( WIDTH_SELECT2_0 ),
+ .ram0_PLRD( PIPELINE_RD_0 ),
+
+ .ram0_CEA( CLK1_0 ),
+ .ram0_CEB( CLK2_0 ),
+ .ram0_I( WD_0 ),
+ .ram0_O( RD_0 ),
+ .ram0_AA( RAM0_AA_SEL ),
+ .ram0_AB( RAM0_AB_SEL ),
+ .ram0_CSBA( RAM0_CS1_SEL ),
+ .ram0_CSBB( RAM0_CS2_SEL ),
+ .ram0_WENBA( RAM0_WENb1_SEL ),
+
+ .ram1_WIDTH_SELA( WIDTH_SELECT1_1 ),
+ .ram1_WIDTH_SELB( WIDTH_SELECT2_1 ),
+ .ram1_PLRD( PIPELINE_RD_1 ),
+
+ .ram1_CEA( CLK1_1 ),
+ .ram1_CEB( CLK2_1 ),
+ .ram1_I( WD_1 ),
+ .ram1_O( RD_1 ),
+ .ram1_AA( RAM1_AA_SEL ),
+ .ram1_AB( RAM1_AB_SEL ),
+ .ram1_CSBA( RAM1_CS1_SEL ),
+ .ram1_CSBB( RAM1_CS2_SEL ),
+ .ram1_WENBA( RAM1_WENb1_SEL )
+ );
+
+ fifo_controller_model #(.MAX_PTR_WIDTH(`ADDRWID+1)) fifo_controller0_inst(
+ .Push_Clk( CLK1_0 ),
+ .Pop_Clk( CLK2_0 ),
+
+ .Fifo_Push( PUSH_0 ),
+ .Fifo_Push_Flush( CS1_0 ),
+ .Fifo_Full( Almost_Full_0 ),
+ .Fifo_Full_Usr( PUSH_FLAG_0 ),
+
+ .Fifo_Pop( POP_0 ),
+ .Fifo_Pop_Flush( CS2_0 ),
+ .Fifo_Empty( Almost_Empty_0 ),
+ .Fifo_Empty_Usr( POP_FLAG_0 ),
+
+ .Write_Addr( Fifo0_Write_Addr ),
+
+ .Read_Addr( Fifo0_Read_Addr ),
+
+ .Fifo_Ram_Mode( Concat_En_SEL ),
+ .Fifo_Sync_Mode( SYNC_FIFO_0 ),
+ .Fifo_Push_Width( WIDTH_SELECT1_0 ),
+ .Fifo_Pop_Width( WIDTH_SELECT2_0 ),
+ .Rst_n( fifo0_rstn )
+ );
+
+ fifo_controller_model #(.MAX_PTR_WIDTH(`ADDRWID+1)) fifo_controller1_inst(
+ .Push_Clk( CLK1_1 ),
+ .Pop_Clk( CLK2_1 ),
+
+ .Fifo_Push( PUSH_1 ),
+ .Fifo_Push_Flush( CS1_1 ),
+ .Fifo_Full( Almost_Full_1 ),
+ .Fifo_Full_Usr( PUSH_FLAG_1 ),
+
+ .Fifo_Pop( POP_1 ),
+ .Fifo_Pop_Flush( CS2_1 ),
+ .Fifo_Empty( Almost_Empty_1 ),
+ .Fifo_Empty_Usr( POP_FLAG_1 ),
+
+ .Write_Addr( Fifo1_Write_Addr ),
+
+ .Read_Addr( Fifo1_Read_Addr ),
+
+ .Fifo_Ram_Mode( 1'b0 ),
+ .Fifo_Sync_Mode( SYNC_FIFO_1 ),
+ .Fifo_Push_Width( { 1'b0, WIDTH_SELECT1_1[0] } ),
+ .Fifo_Pop_Width( { 1'b0, WIDTH_SELECT2_1[0] } ),
+ .Rst_n( fifo1_rstn )
+ );
+
+endmodule
+
+module sw_mux (
+ port_out,
+ default_port,
+ alt_port,
+ switch
+ );
+
+ output port_out;
+ input default_port;
+ input alt_port;
+ input switch;
+
+ assign port_out = switch ? alt_port : default_port;
+
+endmodule
+
+
+`define ADDRWID_8k2 11
+`define DATAWID 18
+`define WEWID 2
+
+module ram8k_2x1_cell (
+ CLK1_0,
+ CLK2_0,
+ CLK1S_0,
+ CLK2S_0,
+ WD_0,
+ RD_0,
+ A1_0,
+ A2_0,
+ CS1_0,
+ CS2_0,
+ WEN1_0,
+ CLK1EN_0,
+ CLK2EN_0,
+ P1_0,
+ P2_0,
+ Almost_Full_0,
+ Almost_Empty_0,
+ PUSH_FLAG_0,
+ POP_FLAG_0,
+
+ FIFO_EN_0,
+ SYNC_FIFO_0,
+ PIPELINE_RD_0,
+ WIDTH_SELECT1_0,
+ WIDTH_SELECT2_0,
+ DIR_0,
+ ASYNC_FLUSH_0,
+ ASYNC_FLUSH_S0,
+
+ CLK1_1,
+ CLK2_1,
+ CLK1S_1,
+ CLK2S_1,
+ WD_1,
+ RD_1,
+ A1_1,
+ A2_1,
+ CS1_1,
+ CS2_1,
+ WEN1_1,
+ CLK1EN_1,
+ CLK2EN_1,
+ P1_1,
+ P2_1,
+ Almost_Empty_1,
+ Almost_Full_1,
+ PUSH_FLAG_1,
+ POP_FLAG_1,
+
+ FIFO_EN_1,
+ SYNC_FIFO_1,
+ PIPELINE_RD_1,
+ WIDTH_SELECT1_1,
+ WIDTH_SELECT2_1,
+ DIR_1,
+ ASYNC_FLUSH_1,
+ ASYNC_FLUSH_S1,
+
+ CONCAT_EN_0,
+ CONCAT_EN_1
+ );
+
+parameter [18431:0] INIT = 18432'bx;
+parameter INIT_FILE="init.mem";
+parameter data_width_int = 16;
+parameter data_depth_int = 1024;
+
+ input CLK1_0;
+ input CLK2_0;
+ input CLK1S_0;
+ input CLK2S_0;
+ input [`DATAWID-1:0] WD_0;
+ output [`DATAWID-1:0] RD_0;
+ input [`ADDRWID_8k2-1:0] A1_0;
+ input [`ADDRWID_8k2-1:0] A2_0;
+ input CS1_0;
+ input CS2_0;
+ input [`WEWID-1:0] WEN1_0;
+ input CLK1EN_0;
+ input CLK2EN_0;
+ input P1_0;
+ input P2_0;
+ output Almost_Full_0;
+ output Almost_Empty_0;
+ output [3:0] PUSH_FLAG_0;
+ output [3:0] POP_FLAG_0;
+ input FIFO_EN_0;
+ input SYNC_FIFO_0;
+ input DIR_0;
+ input ASYNC_FLUSH_0;
+ input ASYNC_FLUSH_S0;
+ input PIPELINE_RD_0;
+ input [1:0] WIDTH_SELECT1_0;
+ input [1:0] WIDTH_SELECT2_0;
+
+ input CLK1_1;
+ input CLK2_1;
+ input CLK1S_1;
+ input CLK2S_1;
+ input [`DATAWID-1:0] WD_1;
+ output [`DATAWID-1:0] RD_1;
+ input [`ADDRWID_8k2-1:0] A1_1;
+ input [`ADDRWID_8k2-1:0] A2_1;
+ input CS1_1;
+ input CS2_1;
+ input [`WEWID-1:0] WEN1_1;
+ input CLK1EN_1;
+ input CLK2EN_1;
+ input P1_1;
+ input P2_1;
+ output Almost_Full_1;
+ output Almost_Empty_1;
+ output [3:0] PUSH_FLAG_1;
+ output [3:0] POP_FLAG_1;
+ input FIFO_EN_1;
+ input SYNC_FIFO_1;
+ input DIR_1;
+ input ASYNC_FLUSH_1;
+ input ASYNC_FLUSH_S1;
+ input PIPELINE_RD_1;
+ input [1:0] WIDTH_SELECT1_1;
+ input [1:0] WIDTH_SELECT2_1;
+
+ input CONCAT_EN_0;
+ input CONCAT_EN_1;
+
+//CODE here
+reg RAM0_domain_sw;
+reg RAM1_domain_sw;
+
+wire CLK1P_0, CLK1P_1, CLK2P_0, CLK2P_1, ASYNC_FLUSHP_1, ASYNC_FLUSHP_0;
+
+assign WidSel1_1 = WIDTH_SELECT1_0[1];
+assign WidSel2_1 = WIDTH_SELECT2_0[1];
+
+assign CLK1P_0 = CLK1S_0 ? ~CLK1_0 : CLK1_0;
+assign CLK1P_1 = CLK1S_1 ? ~CLK1_1 : CLK1_1;
+assign CLK2P_0 = CLK2S_0 ? ~CLK2_0 : CLK2_0;
+assign CLK2P_1 = CLK2S_1 ? ~CLK2_1 : CLK2_1;
+assign ASYNC_FLUSHP_0 = ASYNC_FLUSH_S0? ~ASYNC_FLUSH_0 : ASYNC_FLUSH_0;
+assign ASYNC_FLUSHP_1 = ASYNC_FLUSH_S1? ~ASYNC_FLUSH_1 : ASYNC_FLUSH_1;
+
+
+/* FIFO mode-only switching */
+always @( CONCAT_EN_0 or FIFO_EN_0 or FIFO_EN_1 or WidSel1_1 or WidSel2_1 or DIR_0 or DIR_1)
+
+begin
+ if (CONCAT_EN_0) //CONCAT enabled, only RAM0 ports are checked
+ begin
+ if (~FIFO_EN_0) //RAM MODE (no switching)
+ begin
+ RAM0_domain_sw = 1'b0; //Both Switches are on default during RAM mode
+ RAM1_domain_sw = 1'b0;
+ end
+ else //FIFO Mode
+ begin
+ RAM0_domain_sw = DIR_0; //Both Switches will get DIR_0 (primary port) during concat
+ RAM1_domain_sw = DIR_0;
+ end
+ end
+ else //CONCAT disabled, RAM0 and RAM1 ports are be checked
+ begin
+ if (WidSel1_1 || WidSel2_1) //AUTO-CONCAT FIFO/RAM Mode Horizontal Concatenation
+ begin
+ if (~FIFO_EN_0) //RAM MODE (no switching)
+ begin
+ RAM0_domain_sw = 1'b0; //Both Switches are on default during RAM mode
+ RAM1_domain_sw = 1'b0;
+ end
+ else //FIFO Mode
+ begin
+ RAM0_domain_sw = DIR_0; //Both Switches will get DIR_0 (primary port) during concat
+ RAM1_domain_sw = DIR_0;
+ end
+ end
+ else //FIFO/RAM Individual Mode
+ begin
+ if (~FIFO_EN_0) //RAM0 Mode
+ RAM0_domain_sw = 1'b0;
+ else //FIFO0 Mode
+ RAM0_domain_sw = DIR_0;
+ if (~FIFO_EN_1) //RAM1 Mode
+ RAM1_domain_sw = 1'b0;
+ else //FIFO1 Mode
+ RAM1_domain_sw = DIR_1;
+ end
+ end
+end
+
+assign RAM0_Clk1_gated = CLK1EN_0 & CLK1P_0;
+assign RAM0_Clk2_gated = CLK2EN_0 & CLK2P_0;
+assign RAM1_Clk1_gated = CLK1EN_1 & CLK1P_1;
+assign RAM1_Clk2_gated = CLK2EN_1 & CLK2P_1;
+
+//PORT1 of RAMs is designated to PUSH circuitry, while PORT2 gets POP circuitry
+sw_mux RAM0_clk_sw_port1 (.port_out(RAM0_clk_port1), .default_port(RAM0_Clk1_gated), .alt_port(RAM0_Clk2_gated), .switch(RAM0_domain_sw));
+sw_mux RAM0_P_sw_port1 (.port_out(RAM0_push_port1), .default_port(P1_0), .alt_port(P2_0), .switch(RAM0_domain_sw));
+sw_mux RAM0_Flush_sw_port1 (.port_out(RAM0CS_Sync_Flush_port1), .default_port(CS1_0), .alt_port(CS2_0), .switch(RAM0_domain_sw));
+sw_mux RAM0_WidSel0_port1 (.port_out(RAM0_Wid_Sel0_port1), .default_port(WIDTH_SELECT1_0[0]), .alt_port(WIDTH_SELECT2_0[0]), .switch(RAM0_domain_sw));
+sw_mux RAM0_WidSel1_port1 (.port_out(RAM0_Wid_Sel1_port1), .default_port(WIDTH_SELECT1_0[1]), .alt_port(WIDTH_SELECT2_0[1]), .switch(RAM0_domain_sw));
+
+sw_mux RAM0_clk_sw_port2 (.port_out(RAM0_clk_port2), .default_port(RAM0_Clk2_gated), .alt_port(RAM0_Clk1_gated), .switch(RAM0_domain_sw));
+sw_mux RAM0_P_sw_port2 (.port_out(RAM0_pop_port2), .default_port(P2_0), .alt_port(P1_0), .switch(RAM0_domain_sw));
+sw_mux RAM0_Flush_sw_port2 (.port_out(RAM0CS_Sync_Flush_port2), .default_port(CS2_0), .alt_port(CS1_0), .switch(RAM0_domain_sw));
+sw_mux RAM0_WidSel0_port2 (.port_out(RAM0_Wid_Sel0_port2), .default_port(WIDTH_SELECT2_0[0]), .alt_port(WIDTH_SELECT1_0[0]), .switch(RAM0_domain_sw));
+sw_mux RAM0_WidSel1_port2 (.port_out(RAM0_Wid_Sel1_port2), .default_port(WIDTH_SELECT2_0[1]), .alt_port(WIDTH_SELECT1_0[1]), .switch(RAM0_domain_sw));
+
+sw_mux RAM1_clk_sw_port1 (.port_out(RAM1_clk_port1), .default_port(RAM1_Clk1_gated), .alt_port(RAM1_Clk2_gated), .switch(RAM1_domain_sw));
+sw_mux RAM1_P_sw_port1 (.port_out(RAM1_push_port1), .default_port(P1_1), .alt_port(P2_1), .switch(RAM1_domain_sw));
+sw_mux RAM1_Flush_sw_port1 (.port_out(RAM1CS_Sync_Flush_port1), .default_port(CS1_1), .alt_port(CS2_1), .switch(RAM1_domain_sw));
+sw_mux RAM1_WidSel0_port1 (.port_out(RAM1_Wid_Sel0_port1), .default_port(WIDTH_SELECT1_1[0]), .alt_port(WIDTH_SELECT2_1[0]), .switch(RAM1_domain_sw));
+sw_mux RAM1_WidSel1_port1 (.port_out(RAM1_Wid_Sel1_port1), .default_port(WIDTH_SELECT1_1[1]), .alt_port(WIDTH_SELECT2_1[1]), .switch(RAM1_domain_sw));
+
+
+sw_mux RAM1_clk_sw_port2 (.port_out(RAM1_clk_port2), .default_port(RAM1_Clk2_gated), .alt_port(RAM1_Clk1_gated), .switch(RAM1_domain_sw));
+sw_mux RAM1_P_sw_port2 (.port_out(RAM1_pop_port2), .default_port(P2_1), .alt_port(P1_1), .switch(RAM1_domain_sw));
+sw_mux RAM1_Flush_sw_port2 (.port_out(RAM1CS_Sync_Flush_port2), .default_port(CS2_1), .alt_port(CS1_1), .switch(RAM1_domain_sw));
+sw_mux RAM1_WidSel0_port2 (.port_out(RAM1_Wid_Sel0_port2), .default_port(WIDTH_SELECT2_1[0]), .alt_port(WIDTH_SELECT1_1[0]), .switch(RAM1_domain_sw));
+sw_mux RAM1_WidSel1_port2 (.port_out(RAM1_Wid_Sel1_port2), .default_port(WIDTH_SELECT2_1[1]), .alt_port(WIDTH_SELECT1_1[1]), .switch(RAM1_domain_sw));
+
+ram_block_8K # ( .INIT(INIT),
+ .INIT_FILE(INIT_FILE),
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int)
+ )
+ram_block_8K_inst (
+ .CLK1_0(RAM0_clk_port1),
+ .CLK2_0(RAM0_clk_port2),
+ .WD_0(WD_0),
+ .RD_0(RD_0),
+ .A1_0(A1_0),
+ .A2_0(A2_0),
+ .CS1_0(RAM0CS_Sync_Flush_port1),
+ .CS2_0(RAM0CS_Sync_Flush_port2),
+ .WEN1_0(WEN1_0),
+ .POP_0(RAM0_pop_port2),
+ .Almost_Full_0(Almost_Full_0),
+ .Almost_Empty_0(Almost_Empty_0),
+ .PUSH_FLAG_0(PUSH_FLAG_0),
+ .POP_FLAG_0(POP_FLAG_0),
+
+ .FIFO_EN_0(FIFO_EN_0),
+ .SYNC_FIFO_0(SYNC_FIFO_0),
+ .PIPELINE_RD_0(PIPELINE_RD_0),
+ .WIDTH_SELECT1_0({RAM0_Wid_Sel1_port1,RAM0_Wid_Sel0_port1}),
+ .WIDTH_SELECT2_0({RAM0_Wid_Sel1_port2,RAM0_Wid_Sel0_port2}),
+
+ .CLK1_1(RAM1_clk_port1),
+ .CLK2_1(RAM1_clk_port2),
+ .WD_1(WD_1),
+ .RD_1(RD_1),
+ .A1_1(A1_1),
+ .A2_1(A2_1),
+ .CS1_1(RAM1CS_Sync_Flush_port1),
+ .CS2_1(RAM1CS_Sync_Flush_port2),
+ .WEN1_1(WEN1_1),
+ .POP_1(RAM1_pop_port2),
+ .Almost_Empty_1(Almost_Empty_1),
+ .Almost_Full_1(Almost_Full_1),
+ .PUSH_FLAG_1(PUSH_FLAG_1),
+ .POP_FLAG_1(POP_FLAG_1),
+
+ .FIFO_EN_1(FIFO_EN_1),
+ .SYNC_FIFO_1(SYNC_FIFO_1),
+ .PIPELINE_RD_1(PIPELINE_RD_1),
+ .WIDTH_SELECT1_1({RAM1_Wid_Sel1_port1,RAM1_Wid_Sel0_port1}),
+ .WIDTH_SELECT2_1({RAM1_Wid_Sel1_port2,RAM1_Wid_Sel0_port2}),
+
+ .CONCAT_EN_0(CONCAT_EN_0),
+ .CONCAT_EN_1(CONCAT_EN_1),
+
+ .PUSH_0(RAM0_push_port1),
+ .PUSH_1(RAM1_push_port1),
+ .aFlushN_0(~ASYNC_FLUSHP_0),
+ .aFlushN_1(~ASYNC_FLUSHP_1)
+ );
+
+endmodule
+
+module ram8k_2x1_cell_macro # (
+ parameter [18431:0] INIT = 18432'bx,
+ parameter INIT_FILE="init.mem",
+ parameter data_width_int = 16,
+ parameter data_depth_int = 1024
+ )
+ (
+ input [10:0] A1_0,
+ input [10:0] A1_1,
+ input [10:0] A2_0,
+ input [10:0] A2_1,
+ (* clkbuf_sink *)
+ input CLK1_0,
+ (* clkbuf_sink *)
+ input CLK1_1,
+ (* clkbuf_sink *)
+ input CLK2_0,
+ (* clkbuf_sink *)
+ input CLK2_1,
+ output Almost_Empty_0, Almost_Empty_1, Almost_Full_0, Almost_Full_1,
+ input ASYNC_FLUSH_0, ASYNC_FLUSH_1, ASYNC_FLUSH_S0, ASYNC_FLUSH_S1, CLK1EN_0, CLK1EN_1, CLK1S_0, CLK1S_1, CLK2EN_0, CLK2EN_1, CLK2S_0, CLK2S_1, CONCAT_EN_0, CONCAT_EN_1, CS1_0, CS1_1,CS2_0, CS2_1, DIR_0, DIR_1, FIFO_EN_0, FIFO_EN_1, P1_0, P1_1, P2_0,P2_1, PIPELINE_RD_0, PIPELINE_RD_1,
+ output [3:0] POP_FLAG_0,
+ output [3:0] POP_FLAG_1,
+ output [3:0] PUSH_FLAG_0,
+ output [3:0] PUSH_FLAG_1,
+ output [17:0] RD_0,
+ output [17:0] RD_1,
+ input SYNC_FIFO_0, SYNC_FIFO_1,
+ input [17:0] WD_0,
+ input [17:0] WD_1,
+ input [1:0] WEN1_0,
+ input [1:0] WEN1_1,
+ input [1:0] WIDTH_SELECT1_0,
+ input [1:0] WIDTH_SELECT1_1,
+ input [1:0] WIDTH_SELECT2_0,
+ input [1:0] WIDTH_SELECT2_1,
+ input SD,DS,LS,SD_RB1,LS_RB1,DS_RB1,RMEA,RMEB,TEST1A,TEST1B,
+ input [3:0] RMA,
+ input [3:0] RMB);
+
+
+ ram8k_2x1_cell # (.INIT(INIT),
+ .INIT_FILE(INIT_FILE),
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int)
+ )
+ I1 (
+ .A1_0({ A1_0[10:0] }) , .A1_1({ A1_1[10:0] }),
+ .A2_0({ A2_0[10:0] }) , .A2_1({ A2_1[10:0] }),
+ .Almost_Empty_0(Almost_Empty_0),
+ .Almost_Empty_1(Almost_Empty_1),
+ .Almost_Full_0(Almost_Full_0),
+ .Almost_Full_1(Almost_Full_1),
+ .ASYNC_FLUSH_0(ASYNC_FLUSH_0),
+ .ASYNC_FLUSH_1(ASYNC_FLUSH_1),
+ .ASYNC_FLUSH_S0(ASYNC_FLUSH_S0),
+ .ASYNC_FLUSH_S1(ASYNC_FLUSH_S1) , .CLK1_0(CLK1_0),
+ .CLK1_1(CLK1_1) , .CLK1EN_0(CLK1EN_0) , .CLK1EN_1(CLK1EN_1),
+ .CLK1S_0(CLK1S_0) , .CLK1S_1(CLK1S_1) , .CLK2_0(CLK2_0),
+ .CLK2_1(CLK2_1) , .CLK2EN_0(CLK2EN_0) , .CLK2EN_1(CLK2EN_1),
+ .CLK2S_0(CLK2S_0) , .CLK2S_1(CLK2S_1),
+ .CONCAT_EN_0(CONCAT_EN_0) , .CONCAT_EN_1(CONCAT_EN_1),
+ .CS1_0(CS1_0) , .CS1_1(CS1_1) , .CS2_0(CS2_0) , .CS2_1(CS2_1),
+ .DIR_0(DIR_0) , .DIR_1(DIR_1) , .FIFO_EN_0(FIFO_EN_0),
+ .FIFO_EN_1(FIFO_EN_1) , .P1_0(P1_0) , .P1_1(P1_1) , .P2_0(P2_0),
+ .P2_1(P2_1) , .PIPELINE_RD_0(PIPELINE_RD_0),
+ .PIPELINE_RD_1(PIPELINE_RD_1),
+ .POP_FLAG_0({ POP_FLAG_0[3:0] }),
+ .POP_FLAG_1({ POP_FLAG_1[3:0] }),
+ .PUSH_FLAG_0({ PUSH_FLAG_0[3:0] }),
+ .PUSH_FLAG_1({ PUSH_FLAG_1[3:0] }) , .RD_0({ RD_0[17:0] }),
+ .RD_1({ RD_1[17:0] }) , .SYNC_FIFO_0(SYNC_FIFO_0),
+ .SYNC_FIFO_1(SYNC_FIFO_1) , .WD_0({ WD_0[17:0] }),
+ .WD_1({ WD_1[17:0] }) , .WEN1_0({ WEN1_0[1:0] }),
+ .WEN1_1({ WEN1_1[1:0] }),
+ .WIDTH_SELECT1_0({ WIDTH_SELECT1_0[1:0] }),
+ .WIDTH_SELECT1_1({ WIDTH_SELECT1_1[1:0] }),
+ .WIDTH_SELECT2_0({ WIDTH_SELECT2_0[1:0] }),
+ .WIDTH_SELECT2_1({ WIDTH_SELECT2_1[1:0] }) );
+
+endmodule /* ram8k_2x1_cell_macro */
+
+module RAM_8K_BLK ( WA,RA,WD,WClk,RClk,WClk_En,RClk_En,WEN,RD);
+
+parameter addr_int = 9,
+ data_depth_int = 512,
+ data_width_int = 18,
+ wr_enable_int = 2,
+ reg_rd_int = 0;
+
+parameter [8191:0] INIT = 8192'bx;
+parameter INIT_FILE="init.mem";
+
+input [addr_int-1:0] WA;
+input [addr_int-1:0] RA;
+input WClk,RClk;
+input WClk_En,RClk_En;
+input [wr_enable_int-1:0] WEN;
+input [data_width_int-1:0] WD;
+output [data_width_int-1:0] RD;
+
+wire VCC,GND;
+wire WClk0_Sel,RClk0_Sel;
+wire WClk1_Sel,RClk1_Sel;
+
+wire reg_rd0;
+wire reg_rd1;
+wire [10:0] addr_wr0,addr_rd0,addr_wr1,addr_rd1;
+
+wire [17:0] in_reg0;
+
+wire [2:0] wen_reg0;
+
+wire [15:0] out_reg0;
+
+wire [1:0] out_par0;
+
+wire [1:0] WS1_0,WS2_0;
+wire [1:0] WS_GND;
+
+wire LS,DS,SD,LS_RB1,DS_RB1,SD_RB1;
+
+wire WD0_SEL,RD0_SEL;
+wire WD1_SEL,RD1_SEL;
+
+assign VCC = 1'b1;
+assign GND = 1'b0;
+
+assign WD0_SEL = 1'b1;
+assign RD0_SEL = 1'b1;
+assign WD1_SEL = 1'b0;
+assign RD1_SEL = 1'b0;
+
+assign WClk0_Sel = 1'b0;
+assign RClk0_Sel = 1'b0;
+
+assign WClk1_Sel = 1'b0;
+assign RClk1_Sel = 1'b0;
+
+assign LS = 1'b0;
+assign DS = 1'b0;
+assign SD = 1'b0;
+assign LS_RB1 = 1'b0;
+assign DS_RB1 = 1'b0;
+assign SD_RB1 = 1'b0;
+
+assign reg_rd0 =reg_rd_int;
+assign WS_GND = 2'b00;
+
+assign reg_rd1 =1'b0;
+
+assign wen_reg0[2:wr_enable_int]=0;
+assign wen_reg0[wr_enable_int-1:0]=WEN;
+
+assign addr_wr1=11'b0000000000;
+assign addr_rd1=11'b0000000000;
+
+generate
+
+ if(addr_int == 11)
+ begin
+ assign addr_wr0[10:0]=WA;
+ assign addr_rd0[10:0]=RA;
+ end
+ else
+ begin
+ assign addr_wr0[10:addr_int]=0;
+ assign addr_wr0[addr_int-1:0]=WA;
+ assign addr_rd0[10:addr_int]=0;
+ assign addr_rd0[addr_int-1:0]=RA;
+ end
+
+ if (data_width_int == 16)
+ begin
+ assign in_reg0[data_width_int-1:0] =WD[data_width_int-1:0];
+ end
+ else if (data_width_int > 8 && data_width_int < 16)
+ begin
+ assign in_reg0[15:data_width_int] =0;
+ assign in_reg0[data_width_int-1:0] =WD[data_width_int-1:0];
+ end
+ else if (data_width_int <= 8)
+ begin
+ assign in_reg0[15:data_width_int] =0;
+ assign in_reg0[data_width_int-1:0] =WD[data_width_int-1:0];
+ end
+
+ if(data_width_int <=8)
+ begin
+ assign WS1_0 = 2'b00;
+ assign WS2_0 = 2'b00;
+ end
+ else if(data_width_int >8 && data_width_int <=16)
+ begin
+ assign WS1_0 = 2'b01;
+ assign WS2_0 = 2'b01;
+ end
+ else if(data_width_int > 16)
+ begin
+ assign WS1_0 = 2'b10;
+ assign WS2_0 = 2'b10;
+ end
+
+endgenerate
+
+ ram8k_2x1_cell_macro # (
+ `include "pp3_bram_init_8_16.vh"
+ .INIT_FILE(INIT_FILE),
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int)
+ )
+ U1 (
+ .A1_0(addr_wr0) ,
+ .A1_1(addr_wr1),
+ .A2_0(addr_rd0),
+ .A2_1(addr_rd1),
+ .ASYNC_FLUSH_0(GND), //chk
+ .ASYNC_FLUSH_1(GND), //chk
+ .ASYNC_FLUSH_S0(GND),
+ .ASYNC_FLUSH_S1(GND),
+ .CLK1_0(WClk),
+ .CLK1_1(GND),
+ .CLK1S_0(WClk0_Sel),
+ .CLK1S_1(WClk1_Sel),
+ .CLK1EN_0(WClk_En),
+ .CLK1EN_1(GND),
+ .CLK2_0(RClk),
+ .CLK2_1(GND),
+ .CLK2S_0(RClk0_Sel),
+ .CLK2S_1(RClk1_Sel),
+ .CLK2EN_0(RClk_En),
+ .CLK2EN_1(GND),
+ .CONCAT_EN_0(GND),
+ .CONCAT_EN_1(GND),
+ .CS1_0(WD0_SEL),
+ .CS1_1(WD1_SEL),
+ .CS2_0(RD0_SEL),
+ .CS2_1(RD1_SEL),
+ .DIR_0(GND),
+ .DIR_1(GND),
+ .FIFO_EN_0(GND),
+ .FIFO_EN_1(GND),
+ .P1_0(GND), //P1_0
+ .P1_1(GND), //P1_1
+ .P2_0(GND), //
+ .P2_1(GND), //
+ .PIPELINE_RD_0(reg_rd0),
+ .PIPELINE_RD_1(reg_rd1),
+ .SYNC_FIFO_0(GND),
+ .SYNC_FIFO_1(GND),
+ .WD_1({18{GND}}),
+ .WD_0({1'b0,in_reg0[15:8],1'b0,in_reg0[7:0]}),
+ .WIDTH_SELECT1_0(WS1_0),
+ .WIDTH_SELECT1_1(WS_GND),
+ .WIDTH_SELECT2_0(WS2_0),
+ .WIDTH_SELECT2_1(WS_GND),
+ .WEN1_0(wen_reg0[1:0]),
+ .WEN1_1({2{GND}}),
+ .Almost_Empty_0(),
+ .Almost_Empty_1(),
+ .Almost_Full_0(),
+ .Almost_Full_1(),
+ .POP_FLAG_0(),
+ .POP_FLAG_1(),
+ .PUSH_FLAG_0(),
+ .PUSH_FLAG_1(),
+ .RD_0({out_par0[1],out_reg0[15:8],out_par0[0],out_reg0[7:0]}),
+ .RD_1(),
+ .SD(SD),
+ .SD_RB1(SD_RB1),
+ .LS(LS),
+ .LS_RB1(LS_RB1),
+ .DS(DS),
+ .DS_RB1(DS_RB1),
+ .TEST1A(GND),
+ .TEST1B(GND),
+ .RMA(4'd0),
+ .RMB(4'd0),
+ .RMEA(GND),
+ .RMEB(GND)
+ );
+
+ assign RD[data_width_int-1 :0]= out_reg0[data_width_int-1 :0];
+
+
+endmodule
+
+
+module RAM_16K_BLK ( WA,RA,WD,WClk,RClk,WClk_En,RClk_En,WEN,RD);
+
+parameter addr_int = 9,
+ data_depth_int = 512,
+ data_width_int = 36,
+ wr_enable_int = 4,
+ reg_rd_int = 0;
+
+parameter [16383:0] INIT = 16384'bx;
+parameter INIT_FILE="init.mem";
+
+input [addr_int-1:0] WA;
+input [addr_int-1:0] RA;
+input WClk,RClk;
+input WClk_En,RClk_En;
+input [wr_enable_int-1:0] WEN;
+input [data_width_int-1:0] WD;
+output [data_width_int-1:0] RD;
+
+wire VCC,GND;
+
+wire WClk0_Sel,RClk0_Sel;
+wire WClk1_Sel,RClk1_Sel;
+
+wire reg_rd0;
+wire reg_rd1;
+wire [10:0] addr_wr0,addr_rd0,addr_wr1,addr_rd1;
+
+wire [31:0] in_reg0;
+
+wire [4:0] wen_reg0;
+
+wire [31:0] out_reg0;
+
+wire [3:0] out_par0;
+
+wire [1:0] WS1_0,WS2_0;
+wire [1:0] WS_GND;
+
+wire LS,DS,SD,LS_RB1,DS_RB1,SD_RB1;
+
+wire WD0_SEL,RD0_SEL;
+wire WD1_SEL,RD1_SEL;
+
+assign VCC = 1'b1;
+assign GND = 1'b0;
+
+assign WD0_SEL = 1'b1;
+assign RD0_SEL = 1'b1;
+assign WD1_SEL = 1'b1;
+assign RD1_SEL = 1'b1;
+
+assign WClk0_Sel = 1'b0;
+assign RClk0_Sel = 1'b0;
+
+assign WClk1_Sel = 1'b0;
+assign RClk1_Sel = 1'b0;
+
+assign LS = 1'b0;
+assign DS = 1'b0;
+assign SD = 1'b0;
+assign LS_RB1 = 1'b0;
+assign DS_RB1 = 1'b0;
+assign SD_RB1 = 1'b0;
+
+assign reg_rd0 =reg_rd_int;
+assign WS_GND = 2'b00;
+
+assign reg_rd1 = 1'b0;
+
+assign wen_reg0[4:wr_enable_int]=0;
+assign wen_reg0[wr_enable_int-1:0]=WEN;
+
+assign addr_wr1=11'b0000000000;
+assign addr_rd1=11'b0000000000;
+
+generate
+
+ if(addr_int == 11)
+ begin
+ assign addr_wr0[10:0]=WA;
+ assign addr_rd0[10:0]=RA;
+ end
+ else
+ begin
+ assign addr_wr0[10:addr_int]=0;
+ assign addr_wr0[addr_int-1:0]=WA;
+ assign addr_rd0[10:addr_int]=0;
+ assign addr_rd0[addr_int-1:0]=RA;
+ end
+
+ if (data_width_int == 32)
+ begin
+ assign in_reg0[data_width_int-1:0] =WD[data_width_int-1:0];
+ end
+ else if (data_width_int > 8 && data_width_int < 32)
+ begin
+ assign in_reg0[31:data_width_int] =0;
+ assign in_reg0[data_width_int-1:0] =WD[data_width_int-1:0];
+ end
+ else if (data_width_int <= 8)
+ begin
+ assign in_reg0[31:data_width_int] =0;
+ assign in_reg0[data_width_int-1:0] =WD[data_width_int-1:0];
+ end
+
+ if(data_width_int <=8)
+ begin
+ assign WS1_0 = 2'b00;
+ assign WS2_0 = 2'b00;
+ end
+ else if(data_width_int >8 && data_width_int <=16)
+ begin
+ assign WS1_0 = 2'b01;
+ assign WS2_0 = 2'b01;
+ end
+ else if(data_width_int > 16)
+ begin
+ assign WS1_0 = 2'b10;
+ assign WS2_0 = 2'b10;
+ end
+
+ if (data_width_int <=16) begin
+
+ ram8k_2x1_cell_macro # (
+ `include "pp3_bram_init_8_16.vh"
+ .INIT_FILE(INIT_FILE),
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int)
+ )
+ U1 (
+ .A1_0(addr_wr0) ,
+ .A1_1(addr_wr1),
+ .A2_0(addr_rd0),
+ .A2_1(addr_rd1),
+ .ASYNC_FLUSH_0(GND),
+ .ASYNC_FLUSH_1(GND),
+ .ASYNC_FLUSH_S0(GND),
+ .ASYNC_FLUSH_S1(GND),
+ .CLK1_0(WClk),
+ .CLK1_1(WClk),
+ .CLK1S_0(WClk0_Sel),
+ .CLK1S_1(WClk0_Sel),
+ .CLK1EN_0(WClk_En),
+ .CLK1EN_1(WClk_En),
+ .CLK2_0(RClk),
+ .CLK2_1(RClk),
+ .CLK2S_0(RClk0_Sel),
+ .CLK2S_1(RClk0_Sel),
+ .CLK2EN_0(RClk_En),
+ .CLK2EN_1(RClk_En),
+ .CONCAT_EN_0(VCC),
+ .CONCAT_EN_1(GND),
+ .CS1_0(WD0_SEL),
+ .CS1_1(GND),
+ .CS2_0(RD0_SEL),
+ .CS2_1(GND),
+ .DIR_0(GND),
+ .DIR_1(GND),
+ .FIFO_EN_0(GND),
+ .FIFO_EN_1(GND),
+ .P1_0(GND),
+ .P1_1(GND),
+ .P2_0(GND),
+ .P2_1(GND),
+ .PIPELINE_RD_0(reg_rd0),
+ .PIPELINE_RD_1(GND),
+ .SYNC_FIFO_0(GND),
+ .SYNC_FIFO_1(GND),
+ .WD_1({18{GND}}),
+ .WD_0({1'b0,in_reg0[15:8],1'b0,in_reg0[7:0]}),
+ .WIDTH_SELECT1_0(WS1_0),
+ .WIDTH_SELECT1_1(WS_GND),
+ .WIDTH_SELECT2_0(WS2_0),
+ .WIDTH_SELECT2_1(WS_GND),
+ .WEN1_0(wen_reg0[1:0]),
+ .WEN1_1(wen_reg0[3:2]),
+ .Almost_Empty_0(),
+ .Almost_Empty_1(),
+ .Almost_Full_0(),
+ .Almost_Full_1(),
+ .POP_FLAG_0(),
+ .POP_FLAG_1(),
+ .PUSH_FLAG_0(),
+ .PUSH_FLAG_1(),
+ .RD_0({out_par0[1],out_reg0[15:8],out_par0[0],out_reg0[7:0]}),
+ .RD_1(),
+ .SD(SD),
+ .SD_RB1(SD_RB1),
+ .LS(LS),
+ .LS_RB1(LS_RB1),
+ .DS(DS),
+ .DS_RB1(DS_RB1),
+ .TEST1A(GND),
+ .TEST1B(GND),
+ .RMA(4'd0),
+ .RMB(4'd0),
+ .RMEA(GND),
+ .RMEB(GND)
+ );
+ end
+ else if (data_width_int > 16) begin
+
+ ram8k_2x1_cell_macro # (
+ `include "pp3_bram_init_32.vh"
+ .INIT_FILE(INIT_FILE),
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int)
+ )
+ U2 (
+ .A1_0(addr_wr0) ,
+ .A1_1(addr_wr1),
+ .A2_0(addr_rd0),
+ .A2_1(addr_rd1),
+ .ASYNC_FLUSH_0(GND),
+ .ASYNC_FLUSH_1(GND),
+ .ASYNC_FLUSH_S0(GND),
+ .ASYNC_FLUSH_S1(GND),
+ .CLK1_0(WClk),
+ .CLK1_1(WClk),
+ .CLK1S_0(WClk0_Sel),
+ .CLK1S_1(WClk0_Sel),
+ .CLK1EN_0(WClk_En),
+ .CLK1EN_1(WClk_En),
+ .CLK2_0(RClk),
+ .CLK2_1(RClk),
+ .CLK2S_0(RClk0_Sel),
+ .CLK2S_1(RClk0_Sel),
+ .CLK2EN_0(RClk_En),
+ .CLK2EN_1(RClk_En),
+ .CONCAT_EN_0(VCC),
+ .CONCAT_EN_1(GND),
+ .CS1_0(WD0_SEL),
+ .CS1_1(GND),
+ .CS2_0(RD0_SEL),
+ .CS2_1(GND),
+ .DIR_0(GND),
+ .DIR_1(GND),
+ .FIFO_EN_0(GND),
+ .FIFO_EN_1(GND),
+ .P1_0(GND),
+ .P1_1(GND),
+ .P2_0(GND),
+ .P2_1(GND),
+ .PIPELINE_RD_0(reg_rd0),
+ .PIPELINE_RD_1(GND),
+ .SYNC_FIFO_0(GND),
+ .SYNC_FIFO_1(GND),
+ .WD_1({1'b0,in_reg0[31:24],1'b0,in_reg0[23:16]}),
+ .WD_0({1'b0,in_reg0[15:8],1'b0,in_reg0[7:0]}),
+ .WIDTH_SELECT1_0(WS1_0),
+ .WIDTH_SELECT1_1(WS_GND),
+ .WIDTH_SELECT2_0(WS2_0),
+ .WIDTH_SELECT2_1(WS_GND),
+ .WEN1_0(wen_reg0[1:0]),
+ .WEN1_1(wen_reg0[3:2]),
+ .Almost_Empty_0(),
+ .Almost_Empty_1(),
+ .Almost_Full_0(),
+ .Almost_Full_1(),
+ .POP_FLAG_0(),
+ .POP_FLAG_1(),
+ .PUSH_FLAG_0(),
+ .PUSH_FLAG_1(),
+ .RD_0({out_par0[1],out_reg0[15:8],out_par0[0],out_reg0[7:0]}),
+ .RD_1({out_par0[3],out_reg0[31:24],out_par0[2],out_reg0[23:16]}),
+ .SD(SD),
+ .SD_RB1(SD_RB1),
+ .LS(LS),
+ .LS_RB1(LS_RB1),
+ .DS(DS),
+ .DS_RB1(DS_RB1),
+ .TEST1A(GND),
+ .TEST1B(GND),
+ .RMA(4'd0),
+ .RMB(4'd0),
+ .RMEA(GND),
+ .RMEB(GND)
+ );
+ end
+
+endgenerate
+
+assign RD[data_width_int-1 :0]= out_reg0[data_width_int-1 :0];
+
+endmodule
+
+
+module FIFO_8K_BLK(DIN,Fifo_Push_Flush,Fifo_Pop_Flush,PUSH,POP,Push_Clk,Pop_Clk,Push_Clk_En,Pop_Clk_En,Fifo_Dir,Async_Flush,Almost_Full,Almost_Empty,PUSH_FLAG,POP_FLAG,DOUT);
+
+parameter data_depth_int = 512,
+ data_width_int = 36,
+ reg_rd_int = 0,
+ sync_fifo_int = 0;
+
+input Fifo_Push_Flush,Fifo_Pop_Flush;
+input Push_Clk,Pop_Clk;
+input PUSH,POP;
+input [data_width_int-1:0] DIN;
+input Push_Clk_En,Pop_Clk_En,Fifo_Dir,Async_Flush;
+output [data_width_int-1:0] DOUT;
+output [3:0] PUSH_FLAG,POP_FLAG;
+output Almost_Full,Almost_Empty;
+
+wire LS,DS,SD,LS_RB1,DS_RB1,SD_RB1;
+wire VCC,GND;
+
+wire [10:0] addr_wr,addr_rd;
+wire clk1_sig0, clk2_sig0, clk1_sig_en0, clk2_sig_en0, fifo_clk1_flush_sig0, fifo_clk2_flush_sig0, p1_sig0, p2_sig0,clk1_sig_sel0,clk2_sig_sel0;
+wire reg_rd0,sync_fifo0;
+wire [15:0] in_reg0;
+wire [15:0] out_reg0;
+wire [1:0] WS1_0;
+wire [1:0] WS2_0;
+wire Push_Clk0_Sel,Pop_Clk0_Sel;
+wire Async_Flush_Sel0;
+
+wire [1:0] out_par0;
+
+assign LS = 1'b0;
+assign DS = 1'b0;
+assign SD = 1'b0;
+assign LS_RB1 = 1'b0;
+assign DS_RB1 = 1'b0;
+assign SD_RB1 = 1'b0;
+
+assign VCC = 1'b1;
+assign GND = 1'b0;
+
+assign Push_Clk0_Sel = 1'b0;
+assign Pop_Clk0_Sel = 1'b0;
+assign Async_Flush_Sel0 = 1'b0;
+
+assign reg_rd0 = reg_rd_int;
+assign sync_fifo0 = sync_fifo_int;
+
+assign addr_wr=11'b00000000000;
+assign addr_rd=11'b00000000000;
+
+assign clk1_sig0 = Fifo_Dir ? Pop_Clk : Push_Clk;
+assign clk2_sig0 = Fifo_Dir ? Push_Clk : Pop_Clk ;
+assign clk1_sig_en0 = Fifo_Dir ? Pop_Clk_En : Push_Clk_En;
+assign clk2_sig_en0 = Fifo_Dir ? Push_Clk_En : Pop_Clk_En ;
+assign clk1_sig_sel0 = Push_Clk0_Sel;
+assign clk2_sig_sel0 = Pop_Clk0_Sel ;
+assign fifo_clk1_flush_sig0 = Fifo_Dir ? Fifo_Pop_Flush : Fifo_Push_Flush;
+assign fifo_clk2_flush_sig0 = Fifo_Dir ? Fifo_Push_Flush : Fifo_Pop_Flush ;
+assign p1_sig0 = Fifo_Dir ? POP : PUSH;
+assign p2_sig0 = Fifo_Dir ? PUSH : POP ;
+
+generate
+
+ if (data_width_int == 16)
+ begin
+ assign in_reg0[data_width_int-1:0] =DIN[data_width_int-1:0];
+ end
+ else if (data_width_int > 8 && data_width_int < 16)
+ begin
+ assign in_reg0[15:data_width_int] =0;
+ assign in_reg0[data_width_int-1:0] =DIN[data_width_int-1:0];
+ end
+ else if (data_width_int <= 8)
+ begin
+ assign in_reg0[15:data_width_int] =0;
+ assign in_reg0[data_width_int-1:0] =DIN[data_width_int-1:0];
+ end
+
+ if(data_width_int <=8)
+ begin
+ assign WS1_0 = 2'b00;
+ assign WS2_0 = 2'b00;
+ end
+ else if(data_width_int >8 && data_width_int <=16)
+ begin
+ assign WS1_0 = 2'b01;
+ assign WS2_0 = 2'b01;
+ end
+ else if(data_width_int > 16)
+ begin
+ assign WS1_0 = 2'b10;
+ assign WS2_0 = 2'b10;
+ end
+
+endgenerate
+
+ ram8k_2x1_cell_macro # (
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int)
+ )
+ U1 (.A1_0(addr_wr) ,
+ .A1_1(addr_wr),
+ .A2_0(addr_rd),
+ .A2_1(addr_rd),
+ .ASYNC_FLUSH_0(Async_Flush),
+ .ASYNC_FLUSH_1(GND),
+ .ASYNC_FLUSH_S0(Async_Flush_Sel0),
+ .ASYNC_FLUSH_S1(GND),
+ .CLK1_0(clk1_sig0),
+ .CLK1_1(GND),
+ .CLK1EN_0(clk1_sig_en0),
+ .CLK1EN_1(GND),
+ .CLK2_0(clk2_sig0),
+ .CLK2_1(GND),
+ .CLK1S_0(clk1_sig_sel0),
+ .CLK1S_1(GND),
+ .CLK2S_0(clk2_sig_sel0),
+ .CLK2S_1(GND),
+ .CLK2EN_0(clk2_sig_en0),
+ .CLK2EN_1(GND),
+ .CONCAT_EN_0(GND),
+ .CONCAT_EN_1(GND),
+ .CS1_0(fifo_clk1_flush_sig0),
+ .CS1_1(GND),
+ .CS2_0(fifo_clk2_flush_sig0),
+ .CS2_1(GND),
+ .DIR_0(Fifo_Dir),
+ .DIR_1(GND),
+ .FIFO_EN_0(VCC),
+ .FIFO_EN_1(GND),
+ .P1_0(p1_sig0),
+ .P1_1(GND),
+ .P2_0(p2_sig0),
+ .P2_1(GND),
+ .PIPELINE_RD_0(reg_rd0),
+ .PIPELINE_RD_1(GND),
+ .SYNC_FIFO_0(sync_fifo0),
+ .SYNC_FIFO_1(GND),
+ .WD_1({18{GND}}),
+ .WD_0({1'b0,in_reg0[15:8],1'b0,in_reg0[7:0]}),
+ .WIDTH_SELECT1_0(WS1_0),
+ .WIDTH_SELECT1_1({GND,GND}),
+ .WIDTH_SELECT2_0(WS2_0),
+ .WIDTH_SELECT2_1({GND,GND}),
+ .WEN1_0({GND,GND}),
+ .WEN1_1({GND,GND}),
+ .Almost_Empty_0(Almost_Empty),
+ .Almost_Empty_1(),
+ .Almost_Full_0(Almost_Full),
+ .Almost_Full_1(),
+ .POP_FLAG_0(POP_FLAG),
+ .POP_FLAG_1(),
+ .PUSH_FLAG_0(PUSH_FLAG),
+ .PUSH_FLAG_1(),
+ .RD_0({out_par0[1],out_reg0[15:8],out_par0[0],out_reg0[7:0]}),
+ .RD_1(),
+ .SD(SD),
+ .SD_RB1(SD_RB1),
+ .LS(LS),
+ .LS_RB1(LS_RB1),
+ .DS(DS),
+ .DS_RB1(DS_RB1),
+ .TEST1A(GND),
+ .TEST1B(GND),
+ .RMA(4'd0),
+ .RMB(4'd0),
+ .RMEA(GND),
+ .RMEB(GND)
+ );
+
+ assign DOUT[data_width_int-1 :0]= out_reg0[data_width_int-1 :0];
+
+endmodule
+
+
+module FIFO_16K_BLK(DIN,Fifo_Push_Flush,Fifo_Pop_Flush,PUSH,POP,Push_Clk,Pop_Clk,Push_Clk_En,Pop_Clk_En,Fifo_Dir,Async_Flush,Almost_Full,Almost_Empty,PUSH_FLAG,POP_FLAG,DOUT);
+
+parameter data_depth_int = 512,
+ data_width_int = 36,
+ reg_rd_int = 0,
+ sync_fifo_int = 0;
+
+input Fifo_Push_Flush,Fifo_Pop_Flush;
+input Push_Clk,Pop_Clk;
+input PUSH,POP;
+input [data_width_int-1:0] DIN;
+input Push_Clk_En,Pop_Clk_En,Fifo_Dir,Async_Flush;
+output [data_width_int-1:0] DOUT;
+output [3:0] PUSH_FLAG,POP_FLAG;
+output Almost_Full,Almost_Empty;
+
+wire LS,DS,SD,LS_RB1,DS_RB1,SD_RB1;
+wire VCC,GND;
+
+wire [10:0] addr_wr,addr_rd;
+wire clk1_sig0, clk2_sig0, clk1_sig_en0, clk2_sig_en0, fifo_clk1_flush_sig0, fifo_clk2_flush_sig0, p1_sig0, p2_sig0,clk1_sig_sel0,clk2_sig_sel0;
+wire reg_rd0,sync_fifo0;
+wire [31:0] in_reg0;
+wire [31:0] out_reg0;
+wire [1:0] WS1_0;
+wire [1:0] WS2_0;
+wire Push_Clk0_Sel,Pop_Clk0_Sel;
+wire Async_Flush_Sel0;
+
+wire [3:0] out_par0;
+wire [1:0] out_par1;
+
+assign LS = 1'b0;
+assign DS = 1'b0;
+assign SD = 1'b0;
+assign LS_RB1 = 1'b0;
+assign DS_RB1 = 1'b0;
+assign SD_RB1 = 1'b0;
+
+assign VCC = 1'b1;
+assign GND = 1'b0;
+
+assign Push_Clk0_Sel = 1'b0;
+assign Pop_Clk0_Sel = 1'b0;
+assign Async_Flush_Sel0 = 1'b0;
+
+assign reg_rd0 = reg_rd_int;
+assign sync_fifo0 = sync_fifo_int;
+
+assign addr_wr=11'b00000000000;
+assign addr_rd=11'b00000000000;
+
+assign clk1_sig0 = Fifo_Dir ? Pop_Clk : Push_Clk;
+assign clk2_sig0 = Fifo_Dir ? Push_Clk : Pop_Clk ;
+assign clk1_sig_en0 = Fifo_Dir ? Pop_Clk_En : Push_Clk_En;
+assign clk2_sig_en0 = Fifo_Dir ? Push_Clk_En : Pop_Clk_En ;
+assign clk1_sig_sel0 = Push_Clk0_Sel;
+assign clk2_sig_sel0 = Pop_Clk0_Sel ;
+assign fifo_clk1_flush_sig0 = Fifo_Dir ? Fifo_Pop_Flush : Fifo_Push_Flush;
+assign fifo_clk2_flush_sig0 = Fifo_Dir ? Fifo_Push_Flush : Fifo_Pop_Flush ;
+assign p1_sig0 = Fifo_Dir ? POP : PUSH;
+assign p2_sig0 = Fifo_Dir ? PUSH : POP ;
+
+generate
+ if (data_width_int == 32)
+ begin
+ assign in_reg0[data_width_int-1:0] =DIN[data_width_int-1:0];
+ end
+ else if (data_width_int > 8 && data_width_int < 32)
+ begin
+ assign in_reg0[31:data_width_int] =0;
+ assign in_reg0[data_width_int-1:0] =DIN[data_width_int-1:0];
+ end
+ else if (data_width_int <= 8)
+ begin
+ assign in_reg0[31:data_width_int] =0;
+ assign in_reg0[data_width_int-1:0] =DIN[data_width_int-1:0];
+ end
+
+ if(data_width_int <=8)
+ begin
+ assign WS1_0 = 2'b00;
+ assign WS2_0 = 2'b00;
+ end
+ else if(data_width_int >8 && data_width_int <=16)
+ begin
+ assign WS1_0 = 2'b01;
+ assign WS2_0 = 2'b01;
+ end
+ else if(data_width_int > 16)
+ begin
+ assign WS1_0 = 2'b10;
+ assign WS2_0 = 2'b10;
+ end
+
+ if (data_width_int <=16) begin
+
+ ram8k_2x1_cell_macro #(
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int)
+ )
+ U1 (.A1_0(addr_wr) ,
+ .A1_1(addr_wr),
+ .A2_0(addr_rd),
+ .A2_1(addr_rd),
+ .ASYNC_FLUSH_0(Async_Flush),
+ .ASYNC_FLUSH_1(GND),
+ .ASYNC_FLUSH_S0(Async_Flush_Sel0),
+ .ASYNC_FLUSH_S1(Async_Flush_Sel0),
+ .CLK1_0(clk1_sig0),
+ .CLK1_1(clk1_sig0),
+ .CLK1EN_0(clk1_sig_en0),
+ .CLK1EN_1(clk1_sig_en0),
+ .CLK2_0(clk2_sig0),
+ .CLK2_1(clk2_sig0),
+ .CLK1S_0(clk1_sig_sel0),
+ .CLK1S_1(clk1_sig_sel0),
+ .CLK2S_0(clk2_sig_sel0),
+ .CLK2S_1(clk2_sig_sel0),
+ .CLK2EN_0(clk2_sig_en0),
+ .CLK2EN_1(clk2_sig_en0),
+ .CONCAT_EN_0(VCC),
+ .CONCAT_EN_1(GND),
+ .CS1_0(fifo_clk1_flush_sig0),
+ .CS1_1(GND),
+ .CS2_0(fifo_clk2_flush_sig0),
+ .CS2_1(GND),
+ .DIR_0(Fifo_Dir),
+ .DIR_1(GND),
+ .FIFO_EN_0(VCC),
+ .FIFO_EN_1(GND),
+ .P1_0(p1_sig0),
+ .P1_1(GND),
+ .P2_0(p2_sig0),
+ .P2_1(GND),
+ .PIPELINE_RD_0(reg_rd0),
+ .PIPELINE_RD_1(GND),
+ .SYNC_FIFO_0(sync_fifo0),
+ .SYNC_FIFO_1(GND),
+ .WD_1({18{GND}}),
+ .WD_0({1'b0,in_reg0[15:8],1'b0,in_reg0[7:0]}),
+ .WIDTH_SELECT1_0(WS1_0),
+ .WIDTH_SELECT1_1({GND,GND}),
+ .WIDTH_SELECT2_0(WS2_0),
+ .WIDTH_SELECT2_1({GND,GND}),
+ .WEN1_0({GND,GND}),
+ .WEN1_1({GND,GND}),
+ .Almost_Empty_0(Almost_Empty),
+ .Almost_Empty_1(),
+ .Almost_Full_0(Almost_Full),
+ .Almost_Full_1(),
+ .POP_FLAG_0(POP_FLAG),
+ .POP_FLAG_1(),
+ .PUSH_FLAG_0(PUSH_FLAG),
+ .PUSH_FLAG_1(),
+ .RD_0({out_par0[1],out_reg0[15:8],out_par0[0],out_reg0[7:0]}),
+ .RD_1(),
+ .SD(SD),
+ .SD_RB1(SD_RB1),
+ .LS(LS),
+ .LS_RB1(LS_RB1),
+ .DS(DS),
+ .DS_RB1(DS_RB1),
+ .TEST1A(GND),
+ .TEST1B(GND),
+ .RMA(4'd0),
+ .RMB(4'd0),
+ .RMEA(GND),
+ .RMEB(GND)
+ );
+
+ end
+ else if (data_width_int > 16) begin
+
+ ram8k_2x1_cell_macro #(
+ .data_width_int(data_width_int),
+ .data_depth_int(data_depth_int)
+ )
+ U2 (
+ .A1_0(addr_wr) ,
+ .A1_1(addr_wr),
+ .A2_0(addr_rd),
+ .A2_1(addr_rd),
+ .ASYNC_FLUSH_0(Async_Flush),
+ .ASYNC_FLUSH_1(GND),
+ .ASYNC_FLUSH_S0(Async_Flush_Sel0),
+ .ASYNC_FLUSH_S1(Async_Flush_Sel0),
+ .CLK1_0(clk1_sig0),
+ .CLK1_1(clk1_sig0),
+ .CLK1EN_0(clk1_sig_en0),
+ .CLK1EN_1(clk1_sig_en0),
+ .CLK2_0(clk2_sig0),
+ .CLK2_1(clk2_sig0),
+ .CLK1S_0(clk1_sig_sel0),
+ .CLK1S_1(clk1_sig_sel0),
+ .CLK2S_0(clk2_sig_sel0),
+ .CLK2S_1(clk2_sig_sel0),
+ .CLK2EN_0(clk2_sig_en0),
+ .CLK2EN_1(clk2_sig_en0),
+ .CONCAT_EN_0(VCC),
+ .CONCAT_EN_1(GND),
+ .CS1_0(fifo_clk1_flush_sig0),
+ .CS1_1(GND),
+ .CS2_0(fifo_clk2_flush_sig0),
+ .CS2_1(GND),
+ .DIR_0(Fifo_Dir),
+ .DIR_1(GND),
+ .FIFO_EN_0(VCC),
+ .FIFO_EN_1(GND),
+ .P1_0(p1_sig0),
+ .P1_1(GND),
+ .P2_0(p2_sig0),
+ .P2_1(GND),
+ .PIPELINE_RD_0(reg_rd0),
+ .PIPELINE_RD_1(GND),
+ .SYNC_FIFO_0(sync_fifo0),
+ .SYNC_FIFO_1(GND),
+ .WD_1({1'b0,in_reg0[31:24],1'b0,in_reg0[23:16]}),
+ .WD_0({1'b0,in_reg0[15:8],1'b0,in_reg0[7:0]}),
+ .WIDTH_SELECT1_0(WS1_0),
+ .WIDTH_SELECT1_1({GND,GND}),
+ .WIDTH_SELECT2_0(WS2_0),
+ .WIDTH_SELECT2_1({GND,GND}),
+ .WEN1_0({GND,GND}),
+ .WEN1_1({GND,GND}),
+ .Almost_Empty_0(Almost_Empty),
+ .Almost_Empty_1(),
+ .Almost_Full_0(Almost_Full),
+ .Almost_Full_1(),
+ .POP_FLAG_0(POP_FLAG),
+ .POP_FLAG_1(),
+ .PUSH_FLAG_0(PUSH_FLAG),
+ .PUSH_FLAG_1(),
+ .RD_0({out_par0[1],out_reg0[15:8],out_par0[0],out_reg0[7:0]}),
+ .RD_1({out_par0[3],out_reg0[31:24],out_par0[2],out_reg0[23:16]}),
+ .SD(SD),
+ .SD_RB1(SD_RB1),
+ .LS(LS),
+ .LS_RB1(LS_RB1),
+ .DS(DS),
+ .DS_RB1(DS_RB1),
+ .TEST1A(GND),
+ .TEST1B(GND),
+ .RMA(4'd0),
+ .RMB(4'd0),
+ .RMEA(GND),
+ .RMEB(GND)
+ );
+ end
+
+endgenerate
+
+ assign DOUT[data_width_int-1 :0]= out_reg0[data_width_int-1 :0];
+
+endmodule
+
diff --git a/ql-qlf-plugin/pp3/pp3_cells_sim.v b/ql-qlf-plugin/pp3/pp3_cells_sim.v
index 3922912..37c1788 100644
--- a/ql-qlf-plugin/pp3/pp3_cells_sim.v
+++ b/ql-qlf-plugin/pp3/pp3_cells_sim.v
@@ -292,79 +292,6 @@
assign Q = S2 ? (S1 ? (S0 ? H : G) : (S0 ? F : E)) : (S1 ? (S0 ? D : C) : (S0 ? B : A));
endmodule
-(* blackbox *)
-(* keep *)
-module qlal4s3b_cell_macro (
- input WB_CLK,
- input WBs_ACK,
- input [31:0] WBs_RD_DAT,
- output [3:0] WBs_BYTE_STB,
- output WBs_CYC,
- output WBs_WE,
- output WBs_RD,
- output WBs_STB,
- output [16:0] WBs_ADR,
- input [3:0] SDMA_Req,
- input [3:0] SDMA_Sreq,
- output [3:0] SDMA_Done,
- output [3:0] SDMA_Active,
- input [3:0] FB_msg_out,
- input [7:0] FB_Int_Clr,
- output FB_Start,
- input FB_Busy,
- output WB_RST,
- output Sys_PKfb_Rst,
- output Clk16,
- output Clk16_Rst,
- output Clk21,
- output Clk21_Rst,
- output Sys_Pclk,
- output Sys_Pclk_Rst,
- input Sys_PKfb_Clk,
- input [31:0] FB_PKfbData,
- output [31:0] WBs_WR_DAT,
- input [3:0] FB_PKfbPush,
- input FB_PKfbSOF,
- input FB_PKfbEOF,
- output [7:0] Sensor_Int,
- output FB_PKfbOverflow,
- output [23:0] TimeStamp,
- input Sys_PSel,
- input [15:0] SPIm_Paddr,
- input SPIm_PEnable,
- input SPIm_PWrite,
- input [31:0] SPIm_PWdata,
- output SPIm_PReady,
- output SPIm_PSlvErr,
- output [31:0] SPIm_Prdata,
- input [15:0] Device_ID,
- input [13:0] FBIO_In_En,
- input [13:0] FBIO_Out,
- input [13:0] FBIO_Out_En,
- output [13:0] FBIO_In,
- inout [13:0] SFBIO,
- input Device_ID_6S,
- input Device_ID_4S,
- input SPIm_PWdata_26S,
- input SPIm_PWdata_24S,
- input SPIm_PWdata_14S,
- input SPIm_PWdata_11S,
- input SPIm_PWdata_0S,
- input SPIm_Paddr_8S,
- input SPIm_Paddr_6S,
- input FB_PKfbPush_1S,
- input FB_PKfbData_31S,
- input FB_PKfbData_21S,
- input FB_PKfbData_19S,
- input FB_PKfbData_9S,
- input FB_PKfbData_6S,
- input Sys_PKfb_ClkS,
- input FB_BusyS,
- input WB_CLKS
-);
-
-endmodule
-
(* abc9_lut=1, lib_whitebox *)
module LUT1 (
output O,
@@ -442,3 +369,90 @@
assign O = I0 ? s1[1] : s1[0];
endmodule
+module logic_cell_macro(
+ input BA1,
+ input BA2,
+ input BAB,
+ input BAS1,
+ input BAS2,
+ input BB1,
+ input BB2,
+ input BBS1,
+ input BBS2,
+ input BSL,
+ input F1,
+ input F2,
+ input FS,
+ input QCK,
+ input QCKS,
+ input QDI,
+ input QDS,
+ input QEN,
+ input QRT,
+ input QST,
+ input TA1,
+ input TA2,
+ input TAB,
+ input TAS1,
+ input TAS2,
+ input TB1,
+ input TB2,
+ input TBS,
+ input TBS1,
+ input TBS2,
+ input TSL,
+ output CZ,
+ output FZ,
+ output QZ,
+ output TZ
+);
+
+ wire TAP1,TAP2,TBP1,TBP2,BAP1,BAP2,BBP1,BBP2,QCKP,TAI,TBI,BAI,BBI,TZI,BZI,CZI,QZI;
+ reg QZ_r;
+
+ initial
+ begin
+ QZ_r=1'b0;
+ end
+ assign QZ = QZ_r;
+ assign TAP1 = TAS1 ? ~TA1 : TA1;
+ assign TAP2 = TAS2 ? ~TA2 : TA2;
+ assign TBP1 = TBS1 ? ~TB1 : TB1;
+ assign TBP2 = TBS2 ? ~TB2 : TB2;
+ assign BAP1 = BAS1 ? ~BA1 : BA1;
+ assign BAP2 = BAS2 ? ~BA2 : BA2;
+ assign BBP1 = BBS1 ? ~BB1 : BB1;
+ assign BBP2 = BBS2 ? ~BB2 : BB2;
+
+ assign TAI = TSL ? TAP2 : TAP1;
+ assign TBI = TSL ? TBP2 : TBP1;
+ assign BAI = BSL ? BAP2 : BAP1;
+ assign BBI = BSL ? BBP2 : BBP1;
+ assign TZI = TAB ? TBI : TAI;
+ assign BZI = BAB ? BBI : BAI;
+ assign CZI = TBS ? BZI : TZI;
+ assign QZI = QDS ? QDI : CZI ;
+ assign FZ = FS ? F2 : F1;
+ assign TZ = TZI;
+ assign CZ = CZI;
+ assign QCKP = QCKS ? QCK : ~QCK;
+
+
+ always @(posedge QCKP)
+ if(~QRT && ~QST)
+ if(QEN)
+ QZ_r = QZI;
+ always @(QRT or QST)
+ if(QRT)
+ QZ_r = 1'b0;
+ else if (QST)
+ QZ_r = 1'b1;
+
+endmodule
+
+// Include simulation models of QLAL4S3B eFPGA interface
+`include "pp3_qlal4s3b_sim.v"
+// Include BRAM and FIFO simulation models
+`include "pp3_brams_sim.v"
+// Include MULT simulation models
+`include "pp3_mult_sim.v"
diff --git a/ql-qlf-plugin/pp3/pp3_mult_sim.v b/ql-qlf-plugin/pp3/pp3_mult_sim.v
new file mode 100644
index 0000000..3596219
--- /dev/null
+++ b/ql-qlf-plugin/pp3/pp3_mult_sim.v
@@ -0,0 +1,114 @@
+(* blackbox *)
+module qlal4s3_mult_32x32_cell (
+ input [31:0] Amult,
+ input [31:0] Bmult,
+ input [1:0] Valid_mult,
+ output [63:0] Cmult);
+
+endmodule /* qlal4s3_32x32_mult_cell */
+
+(* blackbox *)
+module qlal4s3_mult_16x16_cell (
+ input [15:0] Amult,
+ input [15:0] Bmult,
+ input [1:0] Valid_mult,
+ output [31:0] Cmult);
+
+endmodule /* qlal4s3_16x16_mult_cell */
+
+
+/* Verilog model of QLAL4S3 Multiplier */
+/*qlal4s3_mult_cell*/
+module signed_mult(
+ A,
+ B,
+ Valid,
+ C
+);
+
+parameter WIDTH = 32;
+parameter CWIDTH = 2*WIDTH;
+
+input [WIDTH-1:0] A, B;
+input Valid;
+output[CWIDTH-1:0] C;
+
+reg signed [WIDTH-1:0] A_q, B_q;
+wire signed [CWIDTH-1:0] C_int;
+
+assign C_int = A_q * B_q;
+assign valid_int = Valid;
+assign C = C_int;
+
+always @(*)
+ if(valid_int == 1'b1)
+ A_q <= A;
+
+always @(*)
+ if(valid_int == 1'b1)
+ B_q <= B;
+
+endmodule
+
+
+module qlal4s3_mult_cell_macro ( Amult, Bmult, Valid_mult, sel_mul_32x32, Cmult);
+
+input [31:0] Amult;
+input [31:0] Bmult;
+input [1:0] Valid_mult;
+input sel_mul_32x32;
+output [63:0] Cmult;
+
+wire [15:0] A_mult_16_0;
+wire [15:0] B_mult_16_0;
+wire [31:0] C_mult_16_0;
+wire [15:0] A_mult_16_1;
+wire [15:0] B_mult_16_1;
+wire [31:0] C_mult_16_1;
+wire [31:0] A_mult_32;
+wire [31:0] B_mult_32;
+wire [63:0] C_mult_32;
+wire Valid_mult_16_0;
+wire Valid_mult_16_1;
+wire Valid_mult_32;
+
+
+assign Cmult = sel_mul_32x32 ? C_mult_32 : {C_mult_16_1, C_mult_16_0};
+
+assign A_mult_16_0 = sel_mul_32x32 ? 16'h0 : Amult[15:0];
+assign B_mult_16_0 = sel_mul_32x32 ? 16'h0 : Bmult[15:0];
+assign A_mult_16_1 = sel_mul_32x32 ? 16'h0 : Amult[31:16];
+assign B_mult_16_1 = sel_mul_32x32 ? 16'h0 : Bmult[31:16];
+
+assign A_mult_32 = sel_mul_32x32 ? Amult : 32'h0;
+assign B_mult_32 = sel_mul_32x32 ? Bmult : 32'h0;
+
+assign Valid_mult_16_0 = sel_mul_32x32 ? 1'b0 : Valid_mult[0];
+assign Valid_mult_16_1 = sel_mul_32x32 ? 1'b0 : Valid_mult[1];
+assign Valid_mult_32 = sel_mul_32x32 ? Valid_mult[0] : 1'b0;
+
+signed_mult #(.WIDTH(16)) u_signed_mult_16_0(
+.A (A_mult_16_0), //I: 16 bits
+.B (B_mult_16_0), //I: 16 bits
+.Valid (Valid_mult_16_0), //I
+.C (C_mult_16_0) //O: 32 bits
+);
+
+signed_mult #(.WIDTH(16)) u_signed_mult_16_1(
+.A (A_mult_16_1), //I: 16 bits
+.B (B_mult_16_1), //I: 16 bits
+.Valid (Valid_mult_16_1), //I
+.C (C_mult_16_1) //O: 32 bits
+);
+
+signed_mult #(.WIDTH(32)) u_signed_mult_32(
+.A (A_mult_32), //I: 32 bits
+.B (B_mult_32), //I: 32 bits
+.Valid (Valid_mult_32), //I
+.C (C_mult_32) //O: 64 bits
+);
+
+endmodule
+/*qlal4s3_mult_cell*/
+
+
diff --git a/ql-qlf-plugin/pp3/pp3_qlal4s3b_sim.v b/ql-qlf-plugin/pp3/pp3_qlal4s3b_sim.v
new file mode 100644
index 0000000..fd849f6
--- /dev/null
+++ b/ql-qlf-plugin/pp3/pp3_qlal4s3b_sim.v
@@ -0,0 +1,2509 @@
+`timescale 1ns/10ps
+module ahb_gen_bfm (
+
+ // AHB Slave Interface to AHB Bus Matrix
+ //
+ A2F_HCLK,
+ A2F_HRESET,
+
+ A2F_HADDRS,
+ A2F_HSEL,
+ A2F_HTRANSS,
+ A2F_HSIZES,
+ A2F_HWRITES,
+ A2F_HREADYS,
+ A2F_HWDATAS,
+
+ A2F_HREADYOUTS,
+ A2F_HRESPS,
+ A2F_HRDATAS
+
+ );
+
+//------Port Parameters----------------
+//
+
+parameter ADDRWIDTH = 32;
+parameter DATAWIDTH = 32;
+
+//
+// Define the default address between transfers
+//
+parameter DEFAULT_AHB_ADDRESS = {(ADDRWIDTH){1'b1}};
+
+//
+// Define the standard delay from clock
+//
+parameter STD_CLK_DLY = 2;
+
+//
+// Define Debug Message Controls
+//
+parameter ENABLE_AHB_REG_WR_DEBUG_MSG = 1'b1;
+parameter ENABLE_AHB_REG_RD_DEBUG_MSG = 1'b1;
+
+//
+// Define the size of the message arrays
+//
+parameter TEST_MSG_ARRAY_SIZE = (64 * 8);
+
+
+//------Port Signals-------------------
+//
+
+ // AHB connection to master
+ //
+input A2F_HCLK;
+input A2F_HRESET;
+
+output [ADDRWIDTH-1:0] A2F_HADDRS;
+output A2F_HSEL;
+output [1:0] A2F_HTRANSS;
+output [2:0] A2F_HSIZES;
+output A2F_HWRITES;
+output A2F_HREADYS;
+output [DATAWIDTH-1:0] A2F_HWDATAS;
+
+input A2F_HREADYOUTS;
+input A2F_HRESPS;
+input [DATAWIDTH-1:0] A2F_HRDATAS;
+
+
+wire A2F_HCLK;
+wire A2F_HRESET;
+
+reg [ADDRWIDTH-1:0] A2F_HADDRS;
+reg A2F_HSEL;
+reg [1:0] A2F_HTRANSS;
+reg [2:0] A2F_HSIZES;
+reg A2F_HWRITES;
+reg A2F_HREADYS;
+reg [DATAWIDTH-1:0] A2F_HWDATAS;
+
+wire A2F_HREADYOUTS;
+wire A2F_HRESPS;
+wire [DATAWIDTH-1:0] A2F_HRDATAS;
+
+
+//------Define Parameters--------------
+//
+
+//
+// None at this time
+//
+
+//------Internal Signals---------------
+//
+
+// Define internal signals
+//
+reg [TEST_MSG_ARRAY_SIZE-1:0] ahb_bfm_msg1; // Bus used for depositing test messages in ASCI
+reg [TEST_MSG_ARRAY_SIZE-1:0] ahb_bfm_msg2; // Bus used for depositing test messages in ASCI
+reg [TEST_MSG_ARRAY_SIZE-1:0] ahb_bfm_msg3; // Bus used for depositing test messages in ASCI
+reg [TEST_MSG_ARRAY_SIZE-1:0] ahb_bfm_msg4; // Bus used for depositing test messages in ASCI
+reg [TEST_MSG_ARRAY_SIZE-1:0] ahb_bfm_msg5; // Bus used for depositing test messages in ASCI
+reg [TEST_MSG_ARRAY_SIZE-1:0] ahb_bfm_msg6; // Bus used for depositing test messages in ASCI
+
+
+//------Logic Operations---------------
+//
+
+// Define the intial state of key signals
+//
+initial
+begin
+
+ A2F_HADDRS <= DEFAULT_AHB_ADDRESS; // Default Address
+ A2F_HSEL <= 1'b0; // Bridge not selected
+ A2F_HTRANSS <= 2'h0; // "IDLE" State
+ A2F_HSIZES <= 3'h0; // "Byte" Transfer Size
+ A2F_HWRITES <= 1'b0; // "Read" operation
+ A2F_HREADYS <= 1'b0; // Slave is not ready
+ A2F_HWDATAS <= {(DATAWIDTH){1'b0}}; // Write Data Value of "0"
+
+ ahb_bfm_msg1 <= "NO ACTIVITY"; // Bus used for depositing test messages in ASCI
+ ahb_bfm_msg2 <= "NO ACTIVITY"; // Bus used for depositing test messages in ASCI
+ ahb_bfm_msg3 <= "NO ACTIVITY"; // Bus used for depositing test messages in ASCI
+ ahb_bfm_msg4 <= "NO ACTIVITY"; // Bus used for depositing test messages in ASCI
+ ahb_bfm_msg5 <= "NO ACTIVITY"; // Bus used for depositiog test messages in ASCI
+ ahb_bfm_msg6 <= "NO ACTIVITY"; // Bus used for depositiog test messages in ASCI
+end
+
+
+//------Instantiate Modules------------
+//
+
+//
+// None at this time
+//
+
+
+//------BFM Routines-------------------
+//
+`ifndef YOSYS
+task ahb_read_al4s3b_fabric;
+input [ADDRWIDTH-1:0] TARGET_ADDRESS; // Address to be written on the SPI bus
+input [2:0] TARGET_XFR_SIZE; // Transfer Size for AHB bus
+output [DATAWIDTH-1:0] TARGET_DATA; // Data to be written on the SPI bus
+
+reg [DATAWIDTH-1:0] read_data;
+
+integer i, j, k;
+
+begin
+ // Read Command Bit
+ //
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ // Issue Diagnostic Messages
+ //
+ ahb_bfm_msg1 = "AHB Single Read";
+ ahb_bfm_msg2 = "Address Phase";
+ ahb_bfm_msg3 = "SEQ";
+
+ A2F_HADDRS = TARGET_ADDRESS; // Transfer Address
+
+ // Define the Transfer Request
+ //
+ // Transfer decode of: A2F_HTRANS[1] A2F_HTRANS[0] Description
+ // ------------- ------------- ------------------------------------
+ // 0 0 IDLE (No Transfer)
+ // 0 1 BUSY (No Transfer)
+ // 1 0 NONSEQ (Do Transfer)
+ // 1 1 SEQ (Do Transfer)
+ //
+ // Transfer decode of: A2F_HREADYS Description
+ // ----------- ------------------------------------
+ // 0 Slave is not ready (No Transfer)
+ // 1 Slave is ready (Do Transfer)
+ //
+ A2F_HSEL = 1'b1; // Bridge selected
+ A2F_HREADYS = 1'b1; // Slave is ready
+ A2F_HTRANSS = 2'h2; // "NONSEQ" State
+
+ //
+ // Define "Transfer Size Encoding" is based on the following:
+ //
+ // HSIZE[2] HSIZE[1] HSIZE[0] Bits Description
+ // -------- -------- -------- ---- -----------
+ // 0 0 0 8 Byte
+ // 0 0 1 16 Halfword
+ // 0 1 0 32 Word
+ // 0 1 1 64 Doublword
+ // 1 0 0 128 4-word line
+ // 1 0 1 256 8-word line
+ // 1 1 0 512 -
+ // 1 1 1 1024 -
+ //
+ // The fabric design only supports up to 32 bits at a time.
+ //
+ A2F_HSIZES = TARGET_XFR_SIZE; // Transfer Size
+
+ A2F_HWRITES = 1'b0; // "Read" operation
+ A2F_HWDATAS = {(DATAWIDTH){1'b0}}; // Write Data Value of "0"
+
+ //
+ // Wait for next clock to sampe the slave's response
+ //
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ ahb_bfm_msg2 = "Data Phase";
+ ahb_bfm_msg3 = "IDLE";
+ ahb_bfm_msg4 = "Waiting for Slave";
+
+ // Set the next transfer cycle to "IDLE"
+ A2F_HADDRS = DEFAULT_AHB_ADDRESS; // Default Address
+ A2F_HSEL = 1'b0; // Bridge not selected
+ A2F_HTRANSS = 2'h0; // "IDLE" State
+ A2F_HSIZES = 3'h0; // "Byte" Transfer Size
+
+ //
+ // Check if the slave has returend data
+ //
+ while (A2F_HREADYOUTS == 1'b0)
+ begin
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+ end
+
+ A2F_HREADYS = 1'b0; // Slave is not ready
+ TARGET_DATA = A2F_HRDATAS; // Read slave data value
+
+ // Clear Diagnostic Messages
+ //
+ ahb_bfm_msg1 <= "NO ACTIVITY";
+ ahb_bfm_msg2 <= "NO ACTIVITY";
+ ahb_bfm_msg3 <= "NO ACTIVITY";
+ ahb_bfm_msg4 <= "NO ACTIVITY";
+ ahb_bfm_msg5 <= "NO ACTIVITY";
+ ahb_bfm_msg6 <= "NO ACTIVITY";
+
+end
+endtask
+
+
+task ahb_write_al4s3b_fabric;
+input [ADDRWIDTH-1:0] TARGET_ADDRESS; // Address to be written on the SPI bus
+input [2:0] TARGET_XFR_SIZE; // Transfer Size for AHB bus
+input [DATAWIDTH-1:0] TARGET_DATA; // Data to be written on the SPI bus
+
+reg [DATAWIDTH-1:0] read_data;
+
+integer i, j, k;
+
+begin
+ // Read Command Bit
+ //
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ // Issue Diagnostic Messages
+ //
+ ahb_bfm_msg1 = "AHB Single Write";
+ ahb_bfm_msg2 = "Address Phase";
+ ahb_bfm_msg3 = "SEQ";
+
+ A2F_HADDRS = TARGET_ADDRESS; // Transfer Address
+
+ // Define the Transfer Request
+ //
+ // Transfer decode of: A2F_HTRANS[1] A2F_HTRANS[0] Description
+ // ------------- ------------- ------------------------------------
+ // 0 0 IDLE (No Transfer)
+ // 0 1 BUSY (No Transfer)
+ // 1 0 NONSEQ (Do Transfer)
+ // 1 1 SEQ (Do Transfer)
+ //
+ // Transfer decode of: A2F_HREADYS Description
+ // ----------- ------------------------------------
+ // 0 Slave is not ready (No Transfer)
+ // 1 Slave is ready (Do Transfer)
+ //
+ A2F_HSEL = 1'b1; // Bridge selected
+ A2F_HREADYS = 1'b1; // Slave is ready
+ A2F_HTRANSS = 2'h2; // "NONSEQ" State
+
+ //
+ // Define "Transfer Size Encoding" is based on the following:
+ //
+ // HSIZE[2] HSIZE[1] HSIZE[0] Bits Description
+ // -------- -------- -------- ---- -----------
+ // 0 0 0 8 Byte
+ // 0 0 1 16 Halfword
+ // 0 1 0 32 Word
+ // 0 1 1 64 Doublword
+ // 1 0 0 128 4-word line
+ // 1 0 1 256 8-word line
+ // 1 1 0 512 -
+ // 1 1 1 1024 -
+ //
+ // The fabric design only supports up to 32 bits at a time.
+ //
+ A2F_HSIZES = TARGET_XFR_SIZE; // Transfer Size
+
+ A2F_HWRITES = 1'b1; // "Write" operation
+ A2F_HWDATAS = {(DATAWIDTH){1'b0}}; // Write Data Value of "0"
+
+ //
+ // Wait for next clock to sampe the slave's response
+ //
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ ahb_bfm_msg2 = "Data Phase";
+ ahb_bfm_msg3 = "IDLE";
+ ahb_bfm_msg4 = "Waiting for Slave";
+
+ // Set the next transfer cycle to "IDLE"
+ A2F_HADDRS = DEFAULT_AHB_ADDRESS; // Default Address
+ A2F_HSEL = 1'b0; // Bridge not selected
+ A2F_HTRANSS = 2'h0; // "IDLE" State
+ A2F_HSIZES = 3'h0; // "Byte" Transfer Size
+ A2F_HWDATAS = TARGET_DATA; // Write From test routine
+ A2F_HWRITES = 1'b0; // "Read" operation
+
+ //
+ // Check if the slave has returend data
+ //
+ while (A2F_HREADYOUTS == 1'b0)
+ begin
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+ end
+
+ A2F_HREADYS = 1'b0; // Slave is not ready
+ TARGET_DATA = A2F_HRDATAS; // Read slave data value
+
+ // Clear Diagnostic Messages
+ //
+ ahb_bfm_msg1 <= "NO ACTIVITY";
+ ahb_bfm_msg2 <= "NO ACTIVITY";
+ ahb_bfm_msg3 <= "NO ACTIVITY";
+ ahb_bfm_msg4 <= "NO ACTIVITY";
+ ahb_bfm_msg5 <= "NO ACTIVITY";
+ ahb_bfm_msg6 <= "NO ACTIVITY";
+
+end
+endtask
+
+task ahb_read_word_al4s3b_fabric;
+input [ADDRWIDTH-1:0] TARGET_ADDRESS; // Address to be written on the SPI bus
+output [DATAWIDTH-1:0] TARGET_DATA; // Data to be written on the SPI bus
+
+reg [DATAWIDTH-1:0] read_data;
+
+integer i, j, k;
+
+begin
+ // Read Command Bit
+ //
+
+ wait (A2F_HRESET == 0);
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ // Issue Diagnostic Messages
+ //
+ ahb_bfm_msg1 = "AHB Single Read";
+ ahb_bfm_msg2 = "Address Phase";
+ ahb_bfm_msg3 = "SEQ";
+
+ A2F_HADDRS = TARGET_ADDRESS; // Transfer Address
+
+ // Define the Transfer Request
+ //
+ // Transfer decode of: A2F_HTRANS[1] A2F_HTRANS[0] Description
+ // ------------- ------------- ------------------------------------
+ // 0 0 IDLE (No Transfer)
+ // 0 1 BUSY (No Transfer)
+ // 1 0 NONSEQ (Do Transfer)
+ // 1 1 SEQ (Do Transfer)
+ //
+ // Transfer decode of: A2F_HREADYS Description
+ // ----------- ------------------------------------
+ // 0 Slave is not ready (No Transfer)
+ // 1 Slave is ready (Do Transfer)
+ //
+ A2F_HSEL = 1'b1; // Bridge selected
+ A2F_HREADYS = 1'b1; // Slave is ready
+ A2F_HTRANSS = 2'h2; // "NONSEQ" State
+
+ //
+ // Define "Transfer Size Encoding" is based on the following:
+ //
+ // HSIZE[2] HSIZE[1] HSIZE[0] Bits Description
+ // -------- -------- -------- ---- -----------
+ // 0 0 0 8 Byte
+ // 0 0 1 16 Halfword
+ // 0 1 0 32 Word
+ // 0 1 1 64 Doublword
+ // 1 0 0 128 4-word line
+ // 1 0 1 256 8-word line
+ // 1 1 0 512 -
+ // 1 1 1 1024 -
+ //
+ // The fabric design only supports up to 32 bits at a time.
+ //
+ A2F_HSIZES = 3'b010; // Transfer Size
+
+ A2F_HWRITES = 1'b0; // "Read" operation
+ A2F_HWDATAS = {(DATAWIDTH){1'b0}}; // Write Data Value of "0"
+
+ //
+ // Wait for next clock to sampe the slave's response
+ //
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ ahb_bfm_msg2 = "Data Phase";
+ ahb_bfm_msg3 = "IDLE";
+ ahb_bfm_msg4 = "Waiting for Slave";
+
+ // Set the next transfer cycle to "IDLE"
+ A2F_HADDRS = DEFAULT_AHB_ADDRESS; // Default Address
+ A2F_HSEL = 1'b0; // Bridge not selected
+ A2F_HTRANSS = 2'h0; // "IDLE" State
+ A2F_HSIZES = 3'h0; // "Byte" Transfer Size
+
+ //
+ // Check if the slave has returend data
+ //
+ while (A2F_HREADYOUTS == 1'b0)
+ begin
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+ end
+
+ A2F_HREADYS = 1'b0; // Slave is not ready
+ TARGET_DATA = A2F_HRDATAS; // Read slave data value
+
+ // Clear Diagnostic Messages
+ //
+ ahb_bfm_msg1 <= "NO ACTIVITY";
+ ahb_bfm_msg2 <= "NO ACTIVITY";
+ ahb_bfm_msg3 <= "NO ACTIVITY";
+ ahb_bfm_msg4 <= "NO ACTIVITY";
+ ahb_bfm_msg5 <= "NO ACTIVITY";
+ ahb_bfm_msg6 <= "NO ACTIVITY";
+
+end
+endtask
+
+
+task ahb_write_word_al4s3b_fabric;
+input [ADDRWIDTH-1:0] TARGET_ADDRESS; // Address to be written on the SPI bus
+input [DATAWIDTH-1:0] TARGET_DATA; // Data to be written on the SPI bus
+
+reg [DATAWIDTH-1:0] read_data;
+
+integer i, j, k;
+
+begin
+ // Read Command Bit
+ //
+ wait (A2F_HRESET == 0);
+
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ // Issue Diagnostic Messages
+ //
+ ahb_bfm_msg1 = "AHB Single Write";
+ ahb_bfm_msg2 = "Address Phase";
+ ahb_bfm_msg3 = "SEQ";
+
+ A2F_HADDRS = TARGET_ADDRESS; // Transfer Address
+
+ // Define the Transfer Request
+ //
+ // Transfer decode of: A2F_HTRANS[1] A2F_HTRANS[0] Description
+ // ------------- ------------- ------------------------------------
+ // 0 0 IDLE (No Transfer)
+ // 0 1 BUSY (No Transfer)
+ // 1 0 NONSEQ (Do Transfer)
+ // 1 1 SEQ (Do Transfer)
+ //
+ // Transfer decode of: A2F_HREADYS Description
+ // ----------- ------------------------------------
+ // 0 Slave is not ready (No Transfer)
+ // 1 Slave is ready (Do Transfer)
+ //
+ A2F_HSEL = 1'b1; // Bridge selected
+ A2F_HREADYS = 1'b1; // Slave is ready
+ A2F_HTRANSS = 2'h2; // "NONSEQ" State
+
+ //
+ // Define "Transfer Size Encoding" is based on the following:
+ //
+ // HSIZE[2] HSIZE[1] HSIZE[0] Bits Description
+ // -------- -------- -------- ---- -----------
+ // 0 0 0 8 Byte
+ // 0 0 1 16 Halfword
+ // 0 1 0 32 Word
+ // 0 1 1 64 Doublword
+ // 1 0 0 128 4-word line
+ // 1 0 1 256 8-word line
+ // 1 1 0 512 -
+ // 1 1 1 1024 -
+ //
+ // The fabric design only supports up to 32 bits at a time.
+ //
+ A2F_HSIZES = 3'b010; // Transfer Size
+
+ A2F_HWRITES = 1'b1; // "Write" operation
+ A2F_HWDATAS = {(DATAWIDTH){1'b0}}; // Write Data Value of "0"
+
+ //
+ // Wait for next clock to sampe the slave's response
+ //
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ ahb_bfm_msg2 = "Data Phase";
+ ahb_bfm_msg3 = "IDLE";
+ ahb_bfm_msg4 = "Waiting for Slave";
+
+ // Set the next transfer cycle to "IDLE"
+ A2F_HADDRS = DEFAULT_AHB_ADDRESS; // Default Address
+ A2F_HSEL = 1'b0; // Bridge not selected
+ A2F_HTRANSS = 2'h0; // "IDLE" State
+ A2F_HSIZES = 3'h0; // "Byte" Transfer Size
+ A2F_HWDATAS = TARGET_DATA; // Write From test routine
+ A2F_HWRITES = 1'b0; // "Read" operation
+
+ //
+ // Check if the slave has returend data
+ //
+ while (A2F_HREADYOUTS == 1'b0)
+ begin
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+ end
+
+ A2F_HREADYS = 1'b0; // Slave is not ready
+ TARGET_DATA = A2F_HRDATAS; // Read slave data value
+
+ // Clear Diagnostic Messages
+ //
+ ahb_bfm_msg1 <= "NO ACTIVITY";
+ ahb_bfm_msg2 <= "NO ACTIVITY";
+ ahb_bfm_msg3 <= "NO ACTIVITY";
+ ahb_bfm_msg4 <= "NO ACTIVITY";
+ ahb_bfm_msg5 <= "NO ACTIVITY";
+ ahb_bfm_msg6 <= "NO ACTIVITY";
+
+ //$stop();
+
+end
+endtask
+
+task ahb_write_al4s3b_fabric_mod;
+input [ADDRWIDTH-1:0] TARGET_ADDRESS; // Address to be written on the SPI bus
+input [2:0] TARGET_XFR_SIZE; // Transfer Size for AHB bus
+input [DATAWIDTH-1:0] TARGET_DATA; // Data to be written on the SPI bus
+
+reg [DATAWIDTH-1:0] read_data;
+
+integer i, j, k;
+
+begin
+ // Read Command Bit
+ //
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ // Issue Diagnostic Messages
+ //
+ ahb_bfm_msg1 = "AHB Single Write";
+ ahb_bfm_msg2 = "Address Phase";
+ ahb_bfm_msg3 = "SEQ";
+
+ //A2F_HADDRS = TARGET_ADDRESS; // Transfer Address
+ A2F_HADDRS = {TARGET_ADDRESS[ADDRWIDTH-1:11],(TARGET_ADDRESS[10:0] << 2)} ; // Transfer Address
+
+ // Define the Transfer Request
+ //
+ // Transfer decode of: A2F_HTRANS[1] A2F_HTRANS[0] Description
+ // ------------- ------------- ------------------------------------
+ // 0 0 IDLE (No Transfer)
+ // 0 1 BUSY (No Transfer)
+ // 1 0 NONSEQ (Do Transfer)
+ // 1 1 SEQ (Do Transfer)
+ //
+ // Transfer decode of: A2F_HREADYS Description
+ // ----------- ------------------------------------
+ // 0 Slave is not ready (No Transfer)
+ // 1 Slave is ready (Do Transfer)
+ //
+ A2F_HSEL = 1'b1; // Bridge selected
+ A2F_HREADYS = 1'b1; // Slave is ready
+ A2F_HTRANSS = 2'h2; // "NONSEQ" State
+
+ //
+ // Define "Transfer Size Encoding" is based on the following:
+ //
+ // HSIZE[2] HSIZE[1] HSIZE[0] Bits Description
+ // -------- -------- -------- ---- -----------
+ // 0 0 0 8 Byte
+ // 0 0 1 16 Halfword
+ // 0 1 0 32 Word
+ // 0 1 1 64 Doublword
+ // 1 0 0 128 4-word line
+ // 1 0 1 256 8-word line
+ // 1 1 0 512 -
+ // 1 1 1 1024 -
+ //
+ // The fabric design only supports up to 32 bits at a time.
+ //
+ A2F_HSIZES = TARGET_XFR_SIZE; // Transfer Size
+
+ A2F_HWRITES = 1'b1; // "Write" operation
+ A2F_HWDATAS = {(DATAWIDTH){1'b0}}; // Write Data Value of "0"
+
+ //
+ // Wait for next clock to sampe the slave's response
+ //
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ ahb_bfm_msg2 = "Data Phase";
+ ahb_bfm_msg3 = "IDLE";
+ ahb_bfm_msg4 = "Waiting for Slave";
+
+ // Set the next transfer cycle to "IDLE"
+ A2F_HADDRS = DEFAULT_AHB_ADDRESS; // Default Address
+ A2F_HSEL = 1'b0; // Bridge not selected
+ A2F_HTRANSS = 2'h0; // "IDLE" State
+ A2F_HSIZES = 3'h0; // "Byte" Transfer Size
+ A2F_HWDATAS = TARGET_DATA; // Write From test routine
+ A2F_HWRITES = 1'b0; // "Read" operation
+
+ //
+ // Check if the slave has returend data
+ //
+ while (A2F_HREADYOUTS == 1'b0)
+ begin
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+ end
+
+ A2F_HREADYS = 1'b0; // Slave is not ready
+ TARGET_DATA = A2F_HRDATAS; // Read slave data value
+
+ // Clear Diagnostic Messages
+ //
+ ahb_bfm_msg1 <= "NO ACTIVITY";
+ ahb_bfm_msg2 <= "NO ACTIVITY";
+ ahb_bfm_msg3 <= "NO ACTIVITY";
+ ahb_bfm_msg4 <= "NO ACTIVITY";
+ ahb_bfm_msg5 <= "NO ACTIVITY";
+ ahb_bfm_msg6 <= "NO ACTIVITY";
+
+end
+endtask
+
+
+task ahb_read_al4s3b_fabric_mod;
+input [ADDRWIDTH-1:0] TARGET_ADDRESS; // Address to be written on the SPI bus
+input [2:0] TARGET_XFR_SIZE; // Transfer Size for AHB bus
+output [DATAWIDTH-1:0] TARGET_DATA; // Data to be written on the SPI bus
+
+reg [DATAWIDTH-1:0] read_data;
+
+integer i, j, k;
+
+begin
+ // Read Command Bit
+ //
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ // Issue Diagnostic Messages
+ //
+ ahb_bfm_msg1 = "AHB Single Read";
+ ahb_bfm_msg2 = "Address Phase";
+ ahb_bfm_msg3 = "SEQ";
+
+ //A2F_HADDRS = TARGET_ADDRESS; // Transfer Address
+ A2F_HADDRS = {TARGET_ADDRESS[ADDRWIDTH-1:11],(TARGET_ADDRESS[10:0] << 2)} ; // Transfer Address
+
+ // Define the Transfer Request
+ //
+ // Transfer decode of: A2F_HTRANS[1] A2F_HTRANS[0] Description
+ // ------------- ------------- ------------------------------------
+ // 0 0 IDLE (No Transfer)
+ // 0 1 BUSY (No Transfer)
+ // 1 0 NONSEQ (Do Transfer)
+ // 1 1 SEQ (Do Transfer)
+ //
+ // Transfer decode of: A2F_HREADYS Description
+ // ----------- ------------------------------------
+ // 0 Slave is not ready (No Transfer)
+ // 1 Slave is ready (Do Transfer)
+ //
+ A2F_HSEL = 1'b1; // Bridge selected
+ A2F_HREADYS = 1'b1; // Slave is ready
+ A2F_HTRANSS = 2'h2; // "NONSEQ" State
+
+ //
+ // Define "Transfer Size Encoding" is based on the following:
+ //
+ // HSIZE[2] HSIZE[1] HSIZE[0] Bits Description
+ // -------- -------- -------- ---- -----------
+ // 0 0 0 8 Byte
+ // 0 0 1 16 Halfword
+ // 0 1 0 32 Word
+ // 0 1 1 64 Doublword
+ // 1 0 0 128 4-word line
+ // 1 0 1 256 8-word line
+ // 1 1 0 512 -
+ // 1 1 1 1024 -
+ //
+ // The fabric design only supports up to 32 bits at a time.
+ //
+ A2F_HSIZES = TARGET_XFR_SIZE; // Transfer Size
+
+ A2F_HWRITES = 1'b0; // "Read" operation
+ A2F_HWDATAS = {(DATAWIDTH){1'b0}}; // Write Data Value of "0"
+
+ //
+ // Wait for next clock to sampe the slave's response
+ //
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+
+ ahb_bfm_msg2 = "Data Phase";
+ ahb_bfm_msg3 = "IDLE";
+ ahb_bfm_msg4 = "Waiting for Slave";
+
+ // Set the next transfer cycle to "IDLE"
+ A2F_HADDRS = DEFAULT_AHB_ADDRESS; // Default Address
+ A2F_HSEL = 1'b0; // Bridge not selected
+ A2F_HTRANSS = 2'h0; // "IDLE" State
+ A2F_HSIZES = 3'h0; // "Byte" Transfer Size
+
+ //
+ // Check if the slave has returend data
+ //
+ while (A2F_HREADYOUTS == 1'b0)
+ begin
+ @(posedge A2F_HCLK) #STD_CLK_DLY;
+ end
+
+ A2F_HREADYS = 1'b0; // Slave is not ready
+ TARGET_DATA = A2F_HRDATAS; // Read slave data value
+
+ // Clear Diagnostic Messages
+ //
+ ahb_bfm_msg1 <= "NO ACTIVITY";
+ ahb_bfm_msg2 <= "NO ACTIVITY";
+ ahb_bfm_msg3 <= "NO ACTIVITY";
+ ahb_bfm_msg4 <= "NO ACTIVITY";
+ ahb_bfm_msg5 <= "NO ACTIVITY";
+ ahb_bfm_msg6 <= "NO ACTIVITY";
+
+end
+endtask
+`endif
+
+endmodule
+
+`timescale 1ns/10ps
+
+module oscillator_s1
+ (
+
+ OSC_CLK_EN,
+ OSC_CLK
+
+ );
+
+// Define the oscillator's frequency
+//
+// Note: The parameter above assumes that values are calculated in units of nS.
+//
+parameter T_CYCLE_CLK = (1000.0/19.2);
+
+input OSC_CLK_EN;
+output OSC_CLK;
+
+wire OSC_CLK_EN;
+wire OSC_CLK;
+
+reg osc_int_clk;
+
+// Define the output enable
+//
+assign OSC_CLK = OSC_CLK_EN ? osc_int_clk : 1'bZ;
+
+// Define the clock oscillator section
+//
+initial
+begin
+ osc_int_clk = 0; // Intialize the clock at time 0ns.
+`ifndef YOSYS
+ forever // Generate a clock with an expected frequency.
+ begin
+ #(T_CYCLE_CLK/2) osc_int_clk = 1;
+ #(T_CYCLE_CLK/2) osc_int_clk = 0;
+ end
+`endif
+end
+
+endmodule
+
+`timescale 1ns/10ps
+
+module sdma_bfm (
+
+ // SDMA Interface Signals
+ //
+ sdma_req_i,
+ sdma_sreq_i,
+ sdma_done_o,
+ sdma_active_o
+
+ );
+
+input [3:0] sdma_req_i;
+input [3:0] sdma_sreq_i;
+output [3:0] sdma_done_o;
+output [3:0] sdma_active_o;
+
+reg [3:0] sdma_done_sig;
+reg [3:0] sdma_active_sig;
+
+assign sdma_done_o = sdma_done_sig;
+assign sdma_active_o = sdma_active_sig;
+
+initial
+begin
+sdma_done_sig <= 4'h0;
+sdma_active_sig <= 4'h0;
+
+end
+
+`ifndef YOSYS
+task drive_dma_active;
+input [3:0] dma_active_i;
+begin
+ sdma_active_sig <= dma_active_i;
+ #100;
+ //sdma_active_sig <= 4'h0;
+
+end
+endtask
+`endif
+endmodule
+
+`timescale 1ns / 10ps
+module ahb2fb_asynbrig_if (
+
+ A2F_HCLK, // clock
+ A2F_HRESET, // reset
+
+ // AHB connection to master
+ //
+ A2F_HSEL,
+ A2F_HADDRS,
+ A2F_HTRANSS,
+ A2F_HSIZES,
+ A2F_HWRITES,
+ A2F_HREADYS,
+
+ A2F_HREADYOUTS,
+ A2F_HRESPS,
+
+ // Fabric Interface
+ //
+ AHB_ASYNC_ADDR_O,
+ AHB_ASYNC_READ_EN_O,
+ AHB_ASYNC_WRITE_EN_O,
+ AHB_ASYNC_BYTE_STROBE_O,
+
+ AHB_ASYNC_STB_TOGGLE_O,
+
+ FABRIC_ASYNC_ACK_TOGGLE_I
+
+ );
+
+
+ //-----Port Parameters-----------------
+ //
+
+ parameter DATAWIDTH = 32;
+ parameter APERWIDTH = 17;
+
+ parameter STATE_WIDTH = 1;
+
+ parameter AHB_ASYNC_IDLE = 0;
+ parameter AHB_ASYNC_WAIT = 1;
+
+
+ //-----Port Signals--------------------
+ //
+
+
+ //------------------------------------------
+ // AHB connection to master
+ //
+ input A2F_HCLK; // clock
+ input A2F_HRESET; // reset
+
+ input [APERWIDTH-1:0] A2F_HADDRS;
+ input A2F_HSEL;
+ input [1:0] A2F_HTRANSS;
+ input [2:0] A2F_HSIZES;
+ input A2F_HWRITES;
+ input A2F_HREADYS;
+
+ output A2F_HREADYOUTS;
+ output A2F_HRESPS;
+
+
+ //------------------------------------------
+ // Fabric Interface
+ //
+ output [APERWIDTH-1:0] AHB_ASYNC_ADDR_O;
+ output AHB_ASYNC_READ_EN_O;
+ output AHB_ASYNC_WRITE_EN_O;
+ output [3:0] AHB_ASYNC_BYTE_STROBE_O;
+
+ output AHB_ASYNC_STB_TOGGLE_O;
+
+ input FABRIC_ASYNC_ACK_TOGGLE_I;
+
+
+ //------------------------------------------
+ // AHB connection to master
+ //
+ wire A2F_HCLK; // clock
+ wire A2F_HRESET; // reset
+
+ wire [APERWIDTH-1:0] A2F_HADDRS;
+ wire A2F_HSEL;
+ wire [1:0] A2F_HTRANSS;
+ wire [2:0] A2F_HSIZES;
+ wire A2F_HWRITES;
+ wire A2F_HREADYS;
+
+ reg A2F_HREADYOUTS;
+ reg A2F_HREADYOUTS_nxt;
+
+ wire A2F_HRESPS;
+
+
+ //------------------------------------------
+ // Fabric Interface
+ //
+ reg [APERWIDTH-1:0] AHB_ASYNC_ADDR_O;
+ reg AHB_ASYNC_READ_EN_O;
+ reg AHB_ASYNC_WRITE_EN_O;
+
+ reg [3:0] AHB_ASYNC_BYTE_STROBE_O;
+ reg [3:0] AHB_ASYNC_BYTE_STROBE_O_nxt;
+
+
+
+ reg AHB_ASYNC_STB_TOGGLE_O;
+ reg AHB_ASYNC_STB_TOGGLE_O_nxt;
+
+ wire FABRIC_ASYNC_ACK_TOGGLE_I;
+
+
+ //------Define Parameters---------
+ //
+
+ //
+ // None at this time
+ //
+
+
+ //-----Internal Signals--------------------
+ //
+
+ wire trans_req; // transfer request
+
+ reg [STATE_WIDTH-1:0] ahb_to_fabric_state;
+ reg [STATE_WIDTH-1:0] ahb_to_fabric_state_nxt;
+
+ reg fabric_async_ack_toggle_i_1ff;
+ reg fabric_async_ack_toggle_i_2ff;
+ reg fabric_async_ack_toggle_i_3ff;
+
+ wire fabric_async_ack;
+
+ //------Logic Operations----------
+ //
+
+
+ // Define the Transfer Request
+ //
+ // Transfer decode of: A2F_HTRANS[1] A2F_HTRANS[0] Description
+ // ------------- ------------- ------------------------------------
+ // 0 0 IDLE (No Transfer)
+ // 0 1 BUSY (No Transfer)
+ // 1 0 NONSEQ (Do Transfer)
+ // 1 1 SEQ (Do Transfer)
+ //
+ // Transfer decode of: A2F_HREADYS Description
+ // ----------- ------------------------------------
+ // 0 Slave is not ready (No Transfer)
+ // 1 Slave is ready (Do Transfer)
+ //
+ assign trans_req = A2F_HSEL
+ & A2F_HREADYS
+ & A2F_HTRANSS[1]; // transfer request issued only in SEQ and NONSEQ status and slave is
+ // selected and last transfer finish
+
+
+ // Check for acknowldge from the fabric
+ //
+ // Note: The fabric is on a different and potentially asynchronous clock.
+ // Therefore, acknowledge is passed as a toggle signal.
+ //
+ assign fabric_async_ack = fabric_async_ack_toggle_i_2ff ^ fabric_async_ack_toggle_i_3ff;
+
+
+ // Issue transfer status
+ //
+ // Note: All transfers are considered to have completed successfully.
+ //
+ assign A2F_HRESPS = 1'b0; // OKAY response from slave
+
+
+ // Address signal registering, to make the address and data active at the same cycle
+ //
+ always @(posedge A2F_HCLK or posedge A2F_HRESET)
+ begin
+ if (A2F_HRESET)
+ begin
+ ahb_to_fabric_state <= AHB_ASYNC_IDLE;
+
+ AHB_ASYNC_ADDR_O <= {(APERWIDTH){1'b0}}; //default address 0 is selected
+ AHB_ASYNC_READ_EN_O <= 1'b0;
+ AHB_ASYNC_WRITE_EN_O <= 1'b0;
+ AHB_ASYNC_BYTE_STROBE_O <= 4'b0;
+
+ AHB_ASYNC_STB_TOGGLE_O <= 1'b0;
+
+ fabric_async_ack_toggle_i_1ff <= 1'b0;
+ fabric_async_ack_toggle_i_2ff <= 1'b0;
+ fabric_async_ack_toggle_i_3ff <= 1'b0;
+
+ A2F_HREADYOUTS <= 1'b0;
+ end
+ else
+ begin
+ ahb_to_fabric_state <= ahb_to_fabric_state_nxt;
+
+ if (trans_req)
+ begin
+ AHB_ASYNC_ADDR_O <= A2F_HADDRS[APERWIDTH-1:0];
+ AHB_ASYNC_READ_EN_O <= ~A2F_HWRITES ;
+ AHB_ASYNC_WRITE_EN_O <= A2F_HWRITES ;
+ AHB_ASYNC_BYTE_STROBE_O <= AHB_ASYNC_BYTE_STROBE_O_nxt;
+ end
+
+ AHB_ASYNC_STB_TOGGLE_O <= AHB_ASYNC_STB_TOGGLE_O_nxt;
+
+ fabric_async_ack_toggle_i_1ff <= FABRIC_ASYNC_ACK_TOGGLE_I;
+ fabric_async_ack_toggle_i_2ff <= fabric_async_ack_toggle_i_1ff;
+ fabric_async_ack_toggle_i_3ff <= fabric_async_ack_toggle_i_2ff;
+
+ A2F_HREADYOUTS <= A2F_HREADYOUTS_nxt;
+ end
+ end
+
+
+ // Byte Strobe Signal Decode
+ //
+ // Note: The "Transfer Size Encoding" is defined as follows:
+ //
+ // HSIZE[2] HSIZE[1] HSIZE[0] Bits Description
+ // -------- -------- -------- ---- -----------
+ // 0 0 0 8 Byte
+ // 0 0 1 16 Halfword
+ // 0 1 0 32 Word
+ // 0 1 1 64 Doublword
+ // 1 0 0 128 4-word line
+ // 1 0 1 256 8-word line
+ // 1 1 0 512 -
+ // 1 1 1 1024 -
+ //
+ // The fabric design only supports up to 32 bits at a time.
+ //
+ always @(A2F_HSIZES or A2F_HADDRS)
+ begin
+ case(A2F_HSIZES)
+ 3'b000: //byte
+ begin
+ case(A2F_HADDRS[1:0])
+ 2'b00: AHB_ASYNC_BYTE_STROBE_O_nxt <= 4'b0001;
+ 2'b01: AHB_ASYNC_BYTE_STROBE_O_nxt <= 4'b0010;
+ 2'b10: AHB_ASYNC_BYTE_STROBE_O_nxt <= 4'b0100;
+ 2'b11: AHB_ASYNC_BYTE_STROBE_O_nxt <= 4'b1000;
+ default: AHB_ASYNC_BYTE_STROBE_O_nxt <= 4'b0000;
+ endcase
+ end
+ 3'b001: //half word
+ begin
+ case(A2F_HADDRS[1])
+ 1'b0: AHB_ASYNC_BYTE_STROBE_O_nxt <= 4'b0011;
+ 1'b1: AHB_ASYNC_BYTE_STROBE_O_nxt <= 4'b1100;
+ default: AHB_ASYNC_BYTE_STROBE_O_nxt <= 4'b0000;
+ endcase
+ end
+ default: AHB_ASYNC_BYTE_STROBE_O_nxt <= 4'b1111; // default 32 bits, word
+ endcase
+ end
+
+
+ // Define the AHB Interface Statemachine
+ //
+ always @(
+ trans_req or
+ fabric_async_ack or
+ AHB_ASYNC_STB_TOGGLE_O or
+ ahb_to_fabric_state
+ )
+ begin
+ case(ahb_to_fabric_state)
+ AHB_ASYNC_IDLE:
+ begin
+ case(trans_req)
+ 1'b0: // Wait for an AHB Transfer
+ begin
+ ahb_to_fabric_state_nxt <= AHB_ASYNC_IDLE;
+ A2F_HREADYOUTS_nxt <= 1'b1;
+ AHB_ASYNC_STB_TOGGLE_O_nxt <= AHB_ASYNC_STB_TOGGLE_O;
+ end
+ 1'b1: // AHB Transfer Detected
+ begin
+ ahb_to_fabric_state_nxt <= AHB_ASYNC_WAIT;
+ A2F_HREADYOUTS_nxt <= 1'b0;
+ AHB_ASYNC_STB_TOGGLE_O_nxt <= ~AHB_ASYNC_STB_TOGGLE_O;
+ end
+ endcase
+ end
+ AHB_ASYNC_WAIT:
+ begin
+ AHB_ASYNC_STB_TOGGLE_O_nxt <= AHB_ASYNC_STB_TOGGLE_O;
+
+ case(fabric_async_ack)
+ 1'b0: // Wait for Acknowledge from Fabric Interface
+ begin
+ ahb_to_fabric_state_nxt <= AHB_ASYNC_WAIT;
+ A2F_HREADYOUTS_nxt <= 1'b0;
+ end
+ 1'b1: // Received Acknowledge from Fabric Interface
+ begin
+ ahb_to_fabric_state_nxt <= AHB_ASYNC_IDLE;
+ A2F_HREADYOUTS_nxt <= 1'b1;
+ end
+ endcase
+ end
+ default:
+ begin
+ ahb_to_fabric_state_nxt <= AHB_ASYNC_IDLE;
+ A2F_HREADYOUTS_nxt <= 1'b0;
+ AHB_ASYNC_STB_TOGGLE_O_nxt <= AHB_ASYNC_STB_TOGGLE_O;
+ end
+ endcase
+ end
+
+endmodule
+
+`timescale 1ns / 10ps
+
+module fb2ahb_asynbrig_if (
+
+ A2F_HRDATAS,
+
+ // AHB Interface
+ //
+ AHB_ASYNC_READ_EN_I,
+ AHB_ASYNC_WRITE_EN_I,
+ AHB_ASYNC_BYTE_STROBE_I,
+
+ AHB_ASYNC_STB_TOGGLE_I,
+
+ // Fabric Interface
+ //
+ WB_CLK_I,
+ WB_RST_I,
+ WB_ACK_I,
+ WB_DAT_I,
+
+ WB_CYC_O,
+ WB_BYTE_STB_O,
+ WB_WE_O,
+ WB_RD_O,
+ WB_STB_O,
+
+ FABRIC_ASYNC_ACK_TOGGLE_O
+
+ );
+
+
+ //-----Port Parameters-----------------
+ //
+
+ parameter DATAWIDTH = 32;
+
+ parameter STATE_WIDTH = 1;
+
+ parameter FAB_ASYNC_IDLE = 0;
+ parameter FAB_ASYNC_WAIT = 1;
+
+
+ //-----Port Signals--------------------
+ //
+
+
+ //------------------------------------------
+ // AHB connection to master
+ //
+ output [DATAWIDTH-1:0] A2F_HRDATAS;
+
+
+ //------------------------------------------
+ // Fabric Interface
+ //
+ input AHB_ASYNC_READ_EN_I;
+ input AHB_ASYNC_WRITE_EN_I;
+ input [3:0] AHB_ASYNC_BYTE_STROBE_I;
+
+ input AHB_ASYNC_STB_TOGGLE_I;
+
+
+ input WB_CLK_I;
+ input WB_RST_I;
+ input WB_ACK_I;
+ input [DATAWIDTH-1:0] WB_DAT_I;
+
+ output WB_CYC_O;
+ output [3:0] WB_BYTE_STB_O;
+ output WB_WE_O;
+ output WB_RD_O;
+ output WB_STB_O;
+
+ output FABRIC_ASYNC_ACK_TOGGLE_O;
+
+
+ //------------------------------------------
+ // AHB connection to master
+ //
+
+ reg [DATAWIDTH-1:0] A2F_HRDATAS;
+ reg [DATAWIDTH-1:0] A2F_HRDATAS_nxt;
+
+
+ //------------------------------------------
+ // Fabric Interface
+ //
+ wire AHB_ASYNC_READ_EN_I;
+ wire AHB_ASYNC_WRITE_EN_I;
+
+ wire [3:0] AHB_ASYNC_BYTE_STROBE_I;
+
+ wire AHB_ASYNC_STB_TOGGLE_I;
+
+
+ wire WB_CLK_I;
+ wire WB_RST_I;
+ wire WB_ACK_I;
+
+ reg WB_CYC_O;
+ reg WB_CYC_O_nxt;
+
+ reg [3:0] WB_BYTE_STB_O;
+ reg [3:0] WB_BYTE_STB_O_nxt;
+
+ reg WB_WE_O;
+ reg WB_WE_O_nxt;
+
+ reg WB_RD_O;
+ reg WB_RD_O_nxt;
+
+ reg WB_STB_O;
+ reg WB_STB_O_nxt;
+
+ reg FABRIC_ASYNC_ACK_TOGGLE_O;
+ reg FABRIC_ASYNC_ACK_TOGGLE_O_nxt;
+
+
+ //------Define Parameters---------
+ //
+
+ //
+ // None at this time
+ //
+
+
+ //-----Internal Signals--------------------
+ //
+
+ reg [STATE_WIDTH-1:0] fabric_to_ahb_state;
+ reg [STATE_WIDTH-1:0] fabric_to_ahb_state_nxt;
+
+ reg ahb_async_stb_toggle_i_1ff;
+ reg ahb_async_stb_toggle_i_2ff;
+ reg ahb_async_stb_toggle_i_3ff;
+
+ wire ahb_async_stb;
+
+
+ //------Logic Operations----------
+ //
+
+
+ // Check for transfer from the AHB
+ //
+ // Note: The AHB is on a different and potentially asynchronous clock.
+ // Therefore, strobe is passed as a toggle signal.
+ //
+ assign ahb_async_stb = ahb_async_stb_toggle_i_2ff ^ ahb_async_stb_toggle_i_3ff;
+
+
+ // Address signal registering, to make the address and data active at the same cycle
+ //
+ always @(posedge WB_CLK_I or posedge WB_RST_I)
+ begin
+ if (WB_RST_I)
+ begin
+ fabric_to_ahb_state <= FAB_ASYNC_IDLE;
+
+ A2F_HRDATAS <= {(DATAWIDTH){1'b0}};
+
+ WB_CYC_O <= 1'b0;
+ WB_BYTE_STB_O <= 4'b0;
+ WB_WE_O <= 1'b0;
+ WB_RD_O <= 1'b0;
+ WB_STB_O <= 1'b0;
+
+ FABRIC_ASYNC_ACK_TOGGLE_O <= 1'b0;
+
+ ahb_async_stb_toggle_i_1ff <= 1'b0;
+ ahb_async_stb_toggle_i_2ff <= 1'b0;
+ ahb_async_stb_toggle_i_3ff <= 1'b0;
+
+ end
+ else
+ begin
+
+ fabric_to_ahb_state <= fabric_to_ahb_state_nxt;
+
+ A2F_HRDATAS <= A2F_HRDATAS_nxt;
+
+ WB_CYC_O <= WB_CYC_O_nxt;
+ WB_BYTE_STB_O <= WB_BYTE_STB_O_nxt;
+ WB_WE_O <= WB_WE_O_nxt;
+ WB_RD_O <= WB_RD_O_nxt;
+ WB_STB_O <= WB_STB_O_nxt;
+
+ FABRIC_ASYNC_ACK_TOGGLE_O <= FABRIC_ASYNC_ACK_TOGGLE_O_nxt;
+
+ ahb_async_stb_toggle_i_1ff <= AHB_ASYNC_STB_TOGGLE_I;
+ ahb_async_stb_toggle_i_2ff <= ahb_async_stb_toggle_i_1ff;
+ ahb_async_stb_toggle_i_3ff <= ahb_async_stb_toggle_i_2ff;
+
+ end
+ end
+
+
+ // Define the Fabric Interface Statemachine
+ //
+ always @(
+ ahb_async_stb or
+ AHB_ASYNC_READ_EN_I or
+ AHB_ASYNC_WRITE_EN_I or
+ AHB_ASYNC_BYTE_STROBE_I or
+ A2F_HRDATAS or
+ WB_ACK_I or
+ WB_DAT_I or
+ WB_CYC_O or
+ WB_BYTE_STB_O or
+ WB_WE_O or
+ WB_RD_O or
+ WB_STB_O or
+ FABRIC_ASYNC_ACK_TOGGLE_O or
+ fabric_to_ahb_state
+ )
+ begin
+ case(fabric_to_ahb_state)
+ FAB_ASYNC_IDLE:
+ begin
+ FABRIC_ASYNC_ACK_TOGGLE_O_nxt <= FABRIC_ASYNC_ACK_TOGGLE_O;
+ A2F_HRDATAS_nxt <= A2F_HRDATAS;
+
+ case(ahb_async_stb)
+ 1'b0: // Wait for an AHB Transfer
+ begin
+ fabric_to_ahb_state_nxt <= FAB_ASYNC_IDLE;
+
+ WB_CYC_O_nxt <= 1'b0;
+ WB_BYTE_STB_O_nxt <= 4'b0;
+ WB_WE_O_nxt <= 1'b0;
+ WB_RD_O_nxt <= 1'b0;
+ WB_STB_O_nxt <= 1'b0;
+
+ end
+ 1'b1: // AHB Transfer Detected
+ begin
+ fabric_to_ahb_state_nxt <= FAB_ASYNC_WAIT;
+
+ WB_CYC_O_nxt <= 1'b1;
+ WB_BYTE_STB_O_nxt <= AHB_ASYNC_BYTE_STROBE_I;
+ WB_WE_O_nxt <= AHB_ASYNC_WRITE_EN_I;
+ WB_RD_O_nxt <= AHB_ASYNC_READ_EN_I;
+ WB_STB_O_nxt <= 1'b1;
+
+ end
+ endcase
+ end
+ FAB_ASYNC_WAIT:
+ begin
+
+ case(WB_ACK_I)
+ 1'b0: // Wait for Acknowledge from Fabric Interface
+ begin
+ fabric_to_ahb_state_nxt <= FAB_ASYNC_WAIT;
+
+ A2F_HRDATAS_nxt <= A2F_HRDATAS;
+
+ WB_CYC_O_nxt <= WB_CYC_O;
+ WB_BYTE_STB_O_nxt <= WB_BYTE_STB_O;
+ WB_WE_O_nxt <= WB_WE_O;
+ WB_RD_O_nxt <= WB_RD_O;
+ WB_STB_O_nxt <= WB_STB_O;
+
+ FABRIC_ASYNC_ACK_TOGGLE_O_nxt <= FABRIC_ASYNC_ACK_TOGGLE_O;
+ end
+ 1'b1: // Received Acknowledge from Fabric Interface
+ begin
+ fabric_to_ahb_state_nxt <= FAB_ASYNC_IDLE;
+
+ A2F_HRDATAS_nxt <= WB_DAT_I;
+
+ WB_CYC_O_nxt <= 1'b0;
+ WB_BYTE_STB_O_nxt <= 4'b0;
+ WB_WE_O_nxt <= 1'b0;
+ WB_RD_O_nxt <= 1'b0;
+ WB_STB_O_nxt <= 1'b0;
+
+ FABRIC_ASYNC_ACK_TOGGLE_O_nxt <= ~FABRIC_ASYNC_ACK_TOGGLE_O;
+ end
+ endcase
+ end
+ default:
+ begin
+ fabric_to_ahb_state_nxt <= FAB_ASYNC_IDLE;
+
+ A2F_HRDATAS_nxt <= A2F_HRDATAS;
+
+ WB_CYC_O_nxt <= 1'b0;
+ WB_BYTE_STB_O_nxt <= 4'b0;
+ WB_WE_O_nxt <= 1'b0;
+ WB_RD_O_nxt <= 1'b0;
+ WB_STB_O_nxt <= 1'b0;
+
+ FABRIC_ASYNC_ACK_TOGGLE_O_nxt <= FABRIC_ASYNC_ACK_TOGGLE_O;
+ end
+ endcase
+ end
+
+endmodule
+
+`timescale 1ns / 10ps
+
+module ahb2fb_asynbrig (
+
+ // AHB Slave Interface to AHB Bus Matrix
+ //
+ A2F_HCLK,
+ A2F_HRESET,
+
+ A2F_HADDRS,
+ A2F_HSEL,
+ A2F_HTRANSS,
+ A2F_HSIZES,
+ A2F_HWRITES,
+ A2F_HREADYS,
+ A2F_HWDATAS,
+
+ A2F_HREADYOUTS,
+ A2F_HRESPS,
+ A2F_HRDATAS,
+
+ // Fabric Wishbone Bus
+ //
+ WB_CLK_I,
+ WB_RST_I,
+ WB_DAT_I,
+ WB_ACK_I,
+
+ WB_ADR_O,
+ WB_CYC_O,
+ WB_BYTE_STB_O,
+ WB_WE_O,
+ WB_RD_O,
+ WB_STB_O,
+ WB_DAT_O
+
+ );
+
+
+ //-----Port Parameters-----------------
+ //
+
+ parameter ADDRWIDTH = 32;
+ parameter DATAWIDTH = 32;
+ parameter APERWIDTH = 17;
+
+
+ //-----Port Signals--------------------
+ //
+
+ input A2F_HCLK; // Clock
+ input A2F_HRESET; // Reset
+
+ // AHB connection to master
+ //
+ input [ADDRWIDTH-1:0] A2F_HADDRS;
+ input A2F_HSEL;
+ input [1:0] A2F_HTRANSS;
+ input [2:0] A2F_HSIZES;
+ input A2F_HWRITES;
+ input A2F_HREADYS;
+ input [DATAWIDTH-1:0] A2F_HWDATAS;
+
+ output A2F_HREADYOUTS;
+ output A2F_HRESPS;
+ output [DATAWIDTH-1:0] A2F_HRDATAS;
+
+ // Wishbone connection to Fabric IP
+ //
+ input WB_CLK_I; // Fabric Clock Input from Fabric
+ input WB_RST_I; // Fabric Reset Input from Fabric
+ input [DATAWIDTH-1:0] WB_DAT_I; // Read Data Bus from Fabric
+ input WB_ACK_I; // Transfer Cycle Acknowledge from Fabric
+
+ output [APERWIDTH-1:0] WB_ADR_O; // Address Bus to Fabric
+ output WB_CYC_O; // Cycle Chip Select to Fabric
+ output [3:0] WB_BYTE_STB_O; // Byte Select to Fabric
+ output WB_WE_O; // Write Enable to Fabric
+ output WB_RD_O; // Read Enable to Fabric
+ output WB_STB_O; // Strobe Signal to Fabric
+ output [DATAWIDTH-1:0] WB_DAT_O; // Write Data Bus to Fabric
+
+
+ wire A2F_HCLK; // Clock
+ wire A2F_HRESET; // Reset
+
+ // AHB connection to master
+ //
+ wire [ADDRWIDTH-1:0] A2F_HADDRS;
+ wire A2F_HSEL;
+ wire [1:0] A2F_HTRANSS;
+ wire [2:0] A2F_HSIZES;
+ wire A2F_HWRITES;
+ wire A2F_HREADYS;
+ wire [DATAWIDTH-1:0] A2F_HWDATAS;
+
+ wire A2F_HREADYOUTS;
+ wire A2F_HRESPS;
+ wire [DATAWIDTH-1:0] A2F_HRDATAS;
+
+
+ // Wishbone connection to Fabric IP
+ //
+ wire WB_CLK_I; // Fabric Clock Input from Fabric
+ wire WB_RST_I; // Fabric Reset Input from Fabric
+ wire [DATAWIDTH-1:0] WB_DAT_I; // Read Data Bus from Fabric
+ wire WB_ACK_I; // Transfer Cycle Acknowledge from Fabric
+
+ wire [APERWIDTH-1:0] WB_ADR_O; // Address Bus (128KB) to Fabric
+ wire WB_CYC_O; // Cycle Chip Select to Fabric
+ wire [3:0] WB_BYTE_STB_O; // Byte Select to Fabric
+ wire WB_WE_O; // Write Enable to Fabric
+ wire WB_RD_O; // Read Enable to Fabric
+ wire WB_STB_O; // Strobe Signal to Fabric
+ wire [DATAWIDTH-1:0] WB_DAT_O; // Write Data Bus to Fabric
+
+
+
+ //------Define Parameters---------
+ //
+
+ //
+ // None at this time
+ //
+
+
+ //-----Internal Signals--------------------
+ //
+
+ // Register module interface signals
+ wire [APERWIDTH-1:0] ahb_async_addr;
+ wire ahb_async_read_en;
+ wire ahb_async_write_en;
+ wire [3:0] ahb_async_byte_strobe;
+
+ wire ahb_async_stb_toggle;
+
+ wire fabric_async_ack_toggle;
+
+
+ //------Logic Operations----------
+ //
+
+ // Define the data input from the AHB and output to the fabric
+ //
+ // Note: Due to the nature of the bus timing, there is no need to register
+ // this value locally.
+ //
+ assign WB_DAT_O = A2F_HWDATAS;
+
+ // Define the Address bus output from the AHB and output to the fabric
+ //
+ // Note: Due to the nature of the bus timing, there is no need to register
+ // this value locally.
+ //
+ assign WB_ADR_O = ahb_async_addr;
+
+
+ //------Instantiate Modules----------------
+ //
+
+ // Interface block to convert AHB transfers to simple read/write
+ // controls.
+ ahb2fb_asynbrig_if
+ #(
+
+ .DATAWIDTH ( DATAWIDTH ),
+ .APERWIDTH ( APERWIDTH )
+
+ )
+ u_FFE_ahb_to_fabric_async_bridge_interface
+ (
+ .A2F_HCLK ( A2F_HCLK ),
+ .A2F_HRESET ( A2F_HRESET ),
+
+ // Input slave port: 32 bit data bus interface
+ .A2F_HSEL ( A2F_HSEL ),
+ .A2F_HADDRS ( A2F_HADDRS[APERWIDTH-1:0] ),
+ .A2F_HTRANSS ( A2F_HTRANSS ),
+ .A2F_HSIZES ( A2F_HSIZES ),
+ .A2F_HWRITES ( A2F_HWRITES ),
+ .A2F_HREADYS ( A2F_HREADYS ),
+
+ .A2F_HREADYOUTS ( A2F_HREADYOUTS ),
+ .A2F_HRESPS ( A2F_HRESPS ),
+
+ // Register interface
+ .AHB_ASYNC_ADDR_O ( ahb_async_addr ),
+ .AHB_ASYNC_READ_EN_O ( ahb_async_read_en ),
+ .AHB_ASYNC_WRITE_EN_O ( ahb_async_write_en ),
+ .AHB_ASYNC_BYTE_STROBE_O ( ahb_async_byte_strobe ),
+ .AHB_ASYNC_STB_TOGGLE_O ( ahb_async_stb_toggle ),
+
+ .FABRIC_ASYNC_ACK_TOGGLE_I (fabric_async_ack_toggle )
+
+ );
+
+
+ fb2ahb_asynbrig_if
+// #(
+// )
+
+ u_FFE_fabric_to_ahb_async_bridge_interface
+ (
+ .A2F_HRDATAS ( A2F_HRDATAS ),
+
+ .AHB_ASYNC_READ_EN_I ( ahb_async_read_en ),
+ .AHB_ASYNC_WRITE_EN_I ( ahb_async_write_en ),
+ .AHB_ASYNC_BYTE_STROBE_I ( ahb_async_byte_strobe ),
+ .AHB_ASYNC_STB_TOGGLE_I ( ahb_async_stb_toggle ),
+
+ .WB_CLK_I ( WB_CLK_I ), // Fabric Clock Input from Fabric
+ .WB_RST_I ( WB_RST_I ), // Fabric Reset Input from Fabric
+ .WB_ACK_I ( WB_ACK_I ), // Transfer Cycle Acknowledge from Fabric
+ .WB_DAT_I ( WB_DAT_I ), // Data Bus Input from Fabric
+
+ .WB_CYC_O ( WB_CYC_O ), // Cycle Chip Select to Fabric
+ .WB_BYTE_STB_O ( WB_BYTE_STB_O ), // Byte Select to Fabric
+ .WB_WE_O ( WB_WE_O ), // Write Enable to Fabric
+ .WB_RD_O ( WB_RD_O ), // Read Enable to Fabric
+ .WB_STB_O ( WB_STB_O ), // Strobe Signal to Fabric
+
+ .FABRIC_ASYNC_ACK_TOGGLE_O (fabric_async_ack_toggle )
+
+ );
+endmodule
+
+
+`timescale 1ns/10ps
+module qlal4s3b_cell_macro_bfm (
+
+ // AHB-To-Fabric Bridge
+ //
+ WBs_ADR,
+ WBs_CYC,
+ WBs_BYTE_STB,
+ WBs_WE,
+ WBs_RD,
+ WBs_STB,
+ WBs_WR_DAT,
+ WB_CLK,
+ WB_RST,
+ WBs_RD_DAT,
+ WBs_ACK,
+ //
+ // SDMA Signals
+ //
+ SDMA_Req,
+ SDMA_Sreq,
+ SDMA_Done,
+ SDMA_Active,
+ //
+ // FB Interrupts
+ //
+ FB_msg_out,
+ FB_Int_Clr,
+ FB_Start,
+ FB_Busy,
+ //
+ // FB Clocks
+ //
+ Sys_Clk0,
+ Sys_Clk0_Rst,
+ Sys_Clk1,
+ Sys_Clk1_Rst,
+ //
+ // Packet FIFO
+ //
+ Sys_PKfb_Clk,
+ Sys_PKfb_Rst,
+ FB_PKfbData,
+ FB_PKfbPush,
+ FB_PKfbSOF,
+ FB_PKfbEOF,
+ FB_PKfbOverflow,
+ //
+ // Sensor Interface
+ //
+ Sensor_Int,
+ TimeStamp,
+ //
+ // SPI Master APB Bus
+ //
+ Sys_Pclk,
+ Sys_Pclk_Rst,
+ Sys_PSel,
+ SPIm_Paddr,
+ SPIm_PEnable,
+ SPIm_PWrite,
+ SPIm_PWdata,
+ SPIm_Prdata,
+ SPIm_PReady,
+ SPIm_PSlvErr,
+ //
+ // Misc
+ //
+ Device_ID,
+ //
+ // FBIO Signals
+ //
+ FBIO_In,
+ FBIO_In_En,
+ FBIO_Out,
+ FBIO_Out_En,
+ //
+ // ???
+ //
+ SFBIO,
+ Device_ID_6S,
+ Device_ID_4S,
+ SPIm_PWdata_26S,
+ SPIm_PWdata_24S,
+ SPIm_PWdata_14S,
+ SPIm_PWdata_11S,
+ SPIm_PWdata_0S,
+ SPIm_Paddr_8S,
+ SPIm_Paddr_6S,
+ FB_PKfbPush_1S,
+ FB_PKfbData_31S,
+ FB_PKfbData_21S,
+ FB_PKfbData_19S,
+ FB_PKfbData_9S,
+ FB_PKfbData_6S,
+ Sys_PKfb_ClkS,
+ FB_BusyS,
+ WB_CLKS
+ );
+//------Port Parameters----------------
+//
+
+//
+// None at this time
+//
+
+//------Port Signals-------------------
+//
+
+ //
+ // AHB-To-Fabric Bridge
+ //
+output [16:0] WBs_ADR;
+output WBs_CYC;
+output [3:0] WBs_BYTE_STB;
+output WBs_WE;
+output WBs_RD;
+output WBs_STB;
+output [31:0] WBs_WR_DAT;
+input WB_CLK;
+output WB_RST;
+input [31:0] WBs_RD_DAT;
+input WBs_ACK;
+ //
+ // SDMA Signals
+ //
+input [3:0] SDMA_Req;
+input [3:0] SDMA_Sreq;
+output [3:0] SDMA_Done;
+output [3:0] SDMA_Active;
+ //
+ // FB Interrupts
+ //
+input [3:0] FB_msg_out;
+input [7:0] FB_Int_Clr;
+output FB_Start;
+input FB_Busy;
+ //
+ // FB Clocks
+ //
+output Sys_Clk0;
+output Sys_Clk0_Rst;
+output Sys_Clk1;
+output Sys_Clk1_Rst;
+ //
+ // Packet FIFO
+ //
+input Sys_PKfb_Clk;
+output Sys_PKfb_Rst;
+input [31:0] FB_PKfbData;
+input [3:0] FB_PKfbPush;
+input FB_PKfbSOF;
+input FB_PKfbEOF;
+output FB_PKfbOverflow;
+ //
+ // Sensor Interface
+ //
+output [7:0] Sensor_Int;
+output [23:0] TimeStamp;
+ //
+ // SPI Master APB Bus
+ //
+output Sys_Pclk;
+output Sys_Pclk_Rst;
+input Sys_PSel;
+input [15:0] SPIm_Paddr;
+input SPIm_PEnable;
+input SPIm_PWrite;
+input [31:0] SPIm_PWdata;
+output [31:0] SPIm_Prdata;
+output SPIm_PReady;
+output SPIm_PSlvErr;
+ //
+ // Misc
+ //
+input [15:0] Device_ID;
+ //
+ // FBIO Signals
+ //
+output [13:0] FBIO_In;
+input [13:0] FBIO_In_En;
+input [13:0] FBIO_Out;
+input [13:0] FBIO_Out_En;
+ //
+ // ???
+ //
+inout [13:0] SFBIO;
+input Device_ID_6S;
+input Device_ID_4S;
+input SPIm_PWdata_26S;
+input SPIm_PWdata_24S;
+input SPIm_PWdata_14S;
+input SPIm_PWdata_11S;
+input SPIm_PWdata_0S;
+input SPIm_Paddr_8S;
+input SPIm_Paddr_6S;
+input FB_PKfbPush_1S;
+input FB_PKfbData_31S;
+input FB_PKfbData_21S;
+input FB_PKfbData_19S;
+input FB_PKfbData_9S;
+input FB_PKfbData_6S;
+input Sys_PKfb_ClkS;
+input FB_BusyS;
+input WB_CLKS;
+
+
+wire [16:0] WBs_ADR;
+wire WBs_CYC;
+wire [3:0] WBs_BYTE_STB;
+wire WBs_WE;
+wire WBs_RD;
+wire WBs_STB;
+wire [31:0] WBs_WR_DAT;
+wire WB_CLK;
+reg WB_RST;
+wire [31:0] WBs_RD_DAT;
+wire WBs_ACK;
+
+wire [3:0] SDMA_Req;
+wire [3:0] SDMA_Sreq;
+//reg [3:0] SDMA_Done;//SDMA BFM
+//reg [3:0] SDMA_Active;//SDMA BFM
+wire [3:0] SDMA_Done;
+wire [3:0] SDMA_Active;
+
+wire [3:0] FB_msg_out;
+wire [7:0] FB_Int_Clr;
+reg FB_Start;
+wire FB_Busy;
+
+wire Sys_Clk0;
+reg Sys_Clk0_Rst;
+wire Sys_Clk1;
+reg Sys_Clk1_Rst;
+
+wire Sys_PKfb_Clk;
+reg Sys_PKfb_Rst;
+wire [31:0] FB_PKfbData;
+wire [3:0] FB_PKfbPush;
+wire FB_PKfbSOF;
+wire FB_PKfbEOF;
+reg FB_PKfbOverflow;
+
+reg [7:0] Sensor_Int;
+reg [23:0] TimeStamp;
+
+reg Sys_Pclk;
+reg Sys_Pclk_Rst;
+wire Sys_PSel;
+
+wire [15:0] SPIm_Paddr;
+wire SPIm_PEnable;
+wire SPIm_PWrite;
+wire [31:0] SPIm_PWdata;
+reg [31:0] SPIm_Prdata;
+reg SPIm_PReady;
+reg SPIm_PSlvErr;
+
+wire [15:0] Device_ID;
+
+reg [13:0] FBIO_In;
+wire [13:0] FBIO_In_En;
+wire [13:0] FBIO_Out;
+wire [13:0] FBIO_Out_En;
+
+wire [13:0] SFBIO;
+wire Device_ID_6S;
+wire Device_ID_4S;
+
+wire SPIm_PWdata_26S;
+wire SPIm_PWdata_24S;
+wire SPIm_PWdata_14S;
+wire SPIm_PWdata_11S;
+wire SPIm_PWdata_0S;
+wire SPIm_Paddr_8S;
+wire SPIm_Paddr_6S;
+
+wire FB_PKfbPush_1S;
+wire FB_PKfbData_31S;
+wire FB_PKfbData_21S;
+wire FB_PKfbData_19S;
+wire FB_PKfbData_9S;
+wire FB_PKfbData_6S;
+wire Sys_PKfb_ClkS;
+
+wire FB_BusyS;
+wire WB_CLKS;
+
+
+//------Define Parameters--------------
+//
+
+parameter ADDRWIDTH = 32;
+parameter DATAWIDTH = 32;
+parameter APERWIDTH = 17;
+
+parameter ENABLE_AHB_REG_WR_DEBUG_MSG = 1'b1;
+parameter ENABLE_AHB_REG_RD_DEBUG_MSG = 1'b1;
+
+parameter T_CYCLE_CLK_SYS_CLK0 = 200;//230;//ACSLIPTEST-230;//100;//180;//(1000.0/(80.0/16)) ; // Default EOS S3B Clock Rate
+parameter T_CYCLE_CLK_SYS_CLK1 = 650;//3906;//650;////83.33;//250;//30517;//(1000.0/(80.0/16)) ; // Default EOS S3B Clock Rate
+parameter T_CYCLE_CLK_A2F_HCLK = (1000.0/(80.0/12)) ; // Default EOS S3B Clock Rate
+
+parameter SYS_CLK0_RESET_LOOP = 5;//4.34;//5;
+parameter SYS_CLK1_RESET_LOOP = 5;
+parameter WB_CLK_RESET_LOOP = 5;
+parameter A2F_HCLK_RESET_LOOP = 5;
+
+
+//------Internal Signals---------------
+//
+
+integer Sys_Clk0_Reset_Loop_Cnt;
+integer Sys_Clk1_Reset_Loop_Cnt;
+integer WB_CLK_Reset_Loop_Cnt;
+integer A2F_HCLK_Reset_Loop_Cnt;
+
+
+wire A2F_HCLK;
+reg A2F_HRESET;
+
+wire [31:0] A2F_HADDRS;
+wire A2F_HSEL;
+wire [1:0] A2F_HTRANSS;
+wire [2:0] A2F_HSIZES;
+wire A2F_HWRITES;
+wire A2F_HREADYS;
+wire [31:0] A2F_HWDATAS;
+
+wire A2F_HREADYOUTS;
+wire A2F_HRESPS;
+wire [31:0] A2F_HRDATAS;
+
+
+//------Logic Operations---------------
+//
+
+// Apply Reset to Sys_Clk0 domain
+//
+initial
+begin
+
+ Sys_Clk0_Rst <= 1'b1;
+`ifndef YOSYS
+ for (Sys_Clk0_Reset_Loop_Cnt = 0;
+ Sys_Clk0_Reset_Loop_Cnt < SYS_CLK0_RESET_LOOP;
+ Sys_Clk0_Reset_Loop_Cnt = Sys_Clk0_Reset_Loop_Cnt + 1)
+ begin
+ wait (Sys_Clk0 == 1'b1) #1;
+ wait (Sys_Clk0 == 1'b0) #1;
+ end
+
+ wait (Sys_Clk0 == 1'b1) #1;
+`endif
+ Sys_Clk0_Rst <= 1'b0;
+
+end
+
+// Apply Reset to Sys_Clk1 domain
+//
+initial
+begin
+
+ Sys_Clk1_Rst <= 1'b1;
+`ifndef YOSYS
+ for (Sys_Clk1_Reset_Loop_Cnt = 0;
+ Sys_Clk1_Reset_Loop_Cnt < SYS_CLK1_RESET_LOOP;
+ Sys_Clk1_Reset_Loop_Cnt = Sys_Clk1_Reset_Loop_Cnt + 1)
+ begin
+ wait (Sys_Clk1 == 1'b1) #1;
+ wait (Sys_Clk1 == 1'b0) #1;
+ end
+
+ wait (Sys_Clk1 == 1'b1) #1;
+`endif
+ Sys_Clk1_Rst <= 1'b0;
+
+end
+
+// Apply Reset to the Wishbone domain
+//
+// Note: In the ASSP, this reset is distict from the reset domains for Sys_Clk[1:0].
+//
+initial
+begin
+
+ WB_RST <= 1'b1;
+`ifndef YOSYS
+ for (WB_CLK_Reset_Loop_Cnt = 0;
+ WB_CLK_Reset_Loop_Cnt < WB_CLK_RESET_LOOP;
+ WB_CLK_Reset_Loop_Cnt = WB_CLK_Reset_Loop_Cnt + 1)
+ begin
+ wait (WB_CLK == 1'b1) #1;
+ wait (WB_CLK == 1'b0) #1;
+ end
+
+ wait (WB_CLK == 1'b1) #1;
+`endif
+ WB_RST <= 1'b0;
+
+end
+
+// Apply Reset to the AHB Bus domain
+//
+// Note: The AHB bus clock domain is separate from the Sys_Clk[1:0] domains
+initial
+begin
+
+ A2F_HRESET <= 1'b1;
+`ifndef YOSYS
+ for (A2F_HCLK_Reset_Loop_Cnt = 0;
+ A2F_HCLK_Reset_Loop_Cnt < A2F_HCLK_RESET_LOOP;
+ A2F_HCLK_Reset_Loop_Cnt = A2F_HCLK_Reset_Loop_Cnt + 1)
+ begin
+ wait (A2F_HCLK == 1'b1) #1;
+ wait (A2F_HCLK == 1'b0) #1;
+ end
+
+ wait (A2F_HCLK == 1'b1) #1;
+`endif
+ A2F_HRESET <= 1'b0;
+
+end
+
+// Initialize all outputs
+//
+// Note: These may be replaced in the future by BFMs as the become available.
+//
+// These registers allow test bench routines to drive these signals as needed.
+//
+initial
+begin
+
+ //
+ // SDMA Signals
+ //
+ //SDMA_Done <= 4'h0;//Added SDMA BFM
+ // SDMA_Active <= 4'h0;//Added SDMA BFM
+
+ //
+ // FB Interrupts
+ //
+ FB_Start <= 1'b0;
+
+ //
+ // Packet FIFO
+ //
+ Sys_PKfb_Rst <= 1'b0;
+ FB_PKfbOverflow <= 1'b0;
+
+ //
+ // Sensor Interface
+ //
+ Sensor_Int <= 8'h0;
+ TimeStamp <= 24'h0;
+
+ //
+ // SPI Master APB Bus
+ //
+ Sys_Pclk <= 1'b0;
+ Sys_Pclk_Rst <= 1'b0;
+
+ SPIm_Prdata <= 32'h0;
+ SPIm_PReady <= 1'b0;
+ SPIm_PSlvErr <= 1'b0;
+
+ //
+ // FBIO Signals
+ //
+ FBIO_In <= 14'h0;
+
+end
+
+
+//------Instantiate Modules------------
+//
+
+ahb2fb_asynbrig
+ #(
+ .ADDRWIDTH ( ADDRWIDTH ),
+ .DATAWIDTH ( DATAWIDTH ),
+ .APERWIDTH ( APERWIDTH )
+ )
+ u_ffe_ahb_to_fabric_async_bridge
+ (
+ // AHB Slave Interface to AHB Bus Matrix
+ //
+ .A2F_HCLK ( A2F_HCLK ),
+ .A2F_HRESET ( A2F_HRESET ),
+
+ .A2F_HADDRS ( A2F_HADDRS ),
+ .A2F_HSEL ( A2F_HSEL ),
+ .A2F_HTRANSS ( A2F_HTRANSS ),
+ .A2F_HSIZES ( A2F_HSIZES ),
+ .A2F_HWRITES ( A2F_HWRITES ),
+ .A2F_HREADYS ( A2F_HREADYS ),
+ .A2F_HWDATAS ( A2F_HWDATAS ),
+
+ .A2F_HREADYOUTS ( A2F_HREADYOUTS ),
+ .A2F_HRESPS ( A2F_HRESPS ),
+ .A2F_HRDATAS ( A2F_HRDATAS ),
+
+ // Fabric Wishbone Bus
+ //
+ .WB_CLK_I ( WB_CLK ),
+ .WB_RST_I ( WB_RST ),
+ .WB_DAT_I ( WBs_RD_DAT ),
+ .WB_ACK_I ( WBs_ACK ),
+
+ .WB_ADR_O ( WBs_ADR ),
+ .WB_CYC_O ( WBs_CYC ),
+ .WB_BYTE_STB_O ( WBs_BYTE_STB ),
+ .WB_WE_O ( WBs_WE ),
+ .WB_RD_O ( WBs_RD ),
+ .WB_STB_O ( WBs_STB ),
+ .WB_DAT_O ( WBs_WR_DAT )
+
+ );
+
+
+ahb_gen_bfm
+ #(
+ .ADDRWIDTH ( ADDRWIDTH ),
+ .DATAWIDTH ( DATAWIDTH ),
+ .DEFAULT_AHB_ADDRESS ( {(ADDRWIDTH){1'b1}} ),
+ .STD_CLK_DLY ( 2 ),
+ .ENABLE_AHB_REG_WR_DEBUG_MSG ( ENABLE_AHB_REG_WR_DEBUG_MSG ),
+ .ENABLE_AHB_REG_RD_DEBUG_MSG ( ENABLE_AHB_REG_RD_DEBUG_MSG )
+ )
+ u_ahb_gen_bfm
+ (
+ // AHB Slave Interface to AHB Bus Matrix
+ //
+ .A2F_HCLK ( A2F_HCLK ),
+ .A2F_HRESET ( A2F_HRESET ),
+
+ .A2F_HADDRS ( A2F_HADDRS ),
+ .A2F_HSEL ( A2F_HSEL ),
+ .A2F_HTRANSS ( A2F_HTRANSS ),
+ .A2F_HSIZES ( A2F_HSIZES ),
+ .A2F_HWRITES ( A2F_HWRITES ),
+ .A2F_HREADYS ( A2F_HREADYS ),
+ .A2F_HWDATAS ( A2F_HWDATAS ),
+
+ .A2F_HREADYOUTS ( A2F_HREADYOUTS ),
+ .A2F_HRESPS ( A2F_HRESPS ),
+ .A2F_HRDATAS ( A2F_HRDATAS )
+
+ );
+
+// Define the clock cycle times.
+//
+// Note: Values are calculated to output in units of nS.
+//
+oscillator_s1 #(.T_CYCLE_CLK (T_CYCLE_CLK_SYS_CLK0)) u_osc_sys_clk0 (.OSC_CLK_EN (1'b1), .OSC_CLK (Sys_Clk0));
+oscillator_s1 #(.T_CYCLE_CLK (T_CYCLE_CLK_SYS_CLK1)) u_osc_sys_clk1 (.OSC_CLK_EN (1'b1), .OSC_CLK (Sys_Clk1));
+oscillator_s1 #(.T_CYCLE_CLK (T_CYCLE_CLK_A2F_HCLK)) u_osc_a2f_hclk (.OSC_CLK_EN (1'b1), .OSC_CLK (A2F_HCLK));
+
+
+//SDMA bfm
+sdma_bfm sdma_bfm_inst0 (
+ .sdma_req_i ( SDMA_Req),
+ .sdma_sreq_i ( SDMA_Sreq),
+ .sdma_done_o ( SDMA_Done),
+ .sdma_active_o ( SDMA_Active)
+ );
+
+
+
+endmodule /* qlal4s3b_cell_macro_bfm*/
+
+(* keep *)
+module qlal4s3b_cell_macro(
+ input WB_CLK,
+ input WBs_ACK,
+ input [31:0]WBs_RD_DAT,
+ output [3:0]WBs_BYTE_STB,
+ output WBs_CYC,
+ output WBs_WE,
+ output WBs_RD,
+ output WBs_STB,
+ output [16:0]WBs_ADR,
+ input [3:0]SDMA_Req,
+ input [3:0]SDMA_Sreq,
+ output [3:0]SDMA_Done,
+ output [3:0]SDMA_Active,
+ input [3:0]FB_msg_out,
+ input [7:0]FB_Int_Clr,
+ output FB_Start,
+ input FB_Busy,
+ output WB_RST,
+ output Sys_PKfb_Rst,
+ output Clk_C16,
+ output Clk_C16_Rst,
+ output Clk_C21,
+ output Clk_C21_Rst,
+ output Sys_Pclk,
+ output Sys_Pclk_Rst,
+ input Sys_PKfb_Clk,
+ input [31:0]FB_PKfbData,
+ output [31:0]WBs_WR_DAT,
+ input [3:0]FB_PKfbPush,
+ input FB_PKfbSOF,
+ input FB_PKfbEOF,
+ output [7:0]Sensor_Int,
+ output FB_PKfbOverflow,
+ output [23:0]TimeStamp,
+ input Sys_PSel,
+ input [15:0]SPIm_Paddr,
+ input SPIm_PEnable,
+ input SPIm_PWrite,
+ input [31:0]SPIm_PWdata,
+ output SPIm_PReady,
+ output SPIm_PSlvErr,
+ output [31:0]SPIm_Prdata,
+ input [15:0]Device_ID,
+ input [13:0]FBIO_In_En,
+ input [13:0]FBIO_Out,
+ input [13:0]FBIO_Out_En,
+ output [13:0]FBIO_In,
+ inout [13:0]SFBIO,
+ input Device_ID_6S,
+ input Device_ID_4S,
+ input SPIm_PWdata_26S,
+ input SPIm_PWdata_24S,
+ input SPIm_PWdata_14S,
+ input SPIm_PWdata_11S,
+ input SPIm_PWdata_0S,
+ input SPIm_Paddr_8S,
+ input SPIm_Paddr_6S,
+ input FB_PKfbPush_1S,
+ input FB_PKfbData_31S,
+ input FB_PKfbData_21S,
+ input FB_PKfbData_19S,
+ input FB_PKfbData_9S,
+ input FB_PKfbData_6S,
+ input Sys_PKfb_ClkS,
+ input FB_BusyS,
+ input WB_CLKS);
+
+
+qlal4s3b_cell_macro_bfm u_ASSP_bfm_inst(
+ .WBs_ADR (WBs_ADR),
+ .WBs_CYC (WBs_CYC),
+ .WBs_BYTE_STB(WBs_BYTE_STB),
+ .WBs_WE (WBs_WE),
+ .WBs_RD (WBs_RD),
+ .WBs_STB (WBs_STB),
+ .WBs_WR_DAT (WBs_WR_DAT),
+ .WB_CLK (WB_CLK),
+ .WB_RST (WB_RST),
+ .WBs_RD_DAT (WBs_RD_DAT),
+ .WBs_ACK (WBs_ACK),
+ //
+ // SDMA Signals
+ //
+ .SDMA_Req (SDMA_Req),
+ .SDMA_Sreq (SDMA_Sreq),
+ .SDMA_Done (SDMA_Done),
+ .SDMA_Active (SDMA_Active),
+ //
+ // FB Interrupts
+ //
+ .FB_msg_out (FB_msg_out),
+ .FB_Int_Clr (FB_Int_Clr),
+ .FB_Start (FB_Start),
+ .FB_Busy (FB_Busy),
+ //
+ // FB Clocks
+ //
+ .Sys_Clk0 (Clk_C16),
+ .Sys_Clk0_Rst (Clk_C16_Rst),
+ .Sys_Clk1 (Clk_C21),
+ .Sys_Clk1_Rst (Clk_C21_Rst),
+ //
+ // Packet FIFO
+ //
+ .Sys_PKfb_Clk (Sys_PKfb_Clk),
+ .Sys_PKfb_Rst (Sys_PKfb_Rst),
+ .FB_PKfbData (FB_PKfbData),
+ .FB_PKfbPush (FB_PKfbPush),
+ .FB_PKfbSOF (FB_PKfbSOF),
+ .FB_PKfbEOF (FB_PKfbEOF),
+ .FB_PKfbOverflow (FB_PKfbOverflow),
+ //
+ // Sensor Interface
+ //
+ .Sensor_Int (Sensor_Int),
+ .TimeStamp (TimeStamp),
+ //
+ // SPI Master APB Bus
+ //
+ .Sys_Pclk (Sys_Pclk),
+ .Sys_Pclk_Rst (Sys_Pclk_Rst),
+ .Sys_PSel (Sys_PSel),
+ .SPIm_Paddr (SPIm_Paddr),
+ .SPIm_PEnable (SPIm_PEnable),
+ .SPIm_PWrite (SPIm_PWrite),
+ .SPIm_PWdata (SPIm_PWdata),
+ .SPIm_Prdata (SPIm_Prdata),
+ .SPIm_PReady (SPIm_PReady),
+ .SPIm_PSlvErr (SPIm_PSlvErr),
+ //
+ // Misc
+ //
+ .Device_ID (Device_ID),
+ //
+ // FBIO Signals
+ //
+ .FBIO_In (FBIO_In),
+ .FBIO_In_En (FBIO_In_En),
+ .FBIO_Out (FBIO_Out),
+ .FBIO_Out_En (FBIO_Out_En),
+ //
+ // ???
+ //
+ .SFBIO (SFBIO),
+ .Device_ID_6S (Device_ID_6S),
+ .Device_ID_4S (Device_ID_4S),
+ .SPIm_PWdata_26S (SPIm_PWdata_26S),
+ .SPIm_PWdata_24S (SPIm_PWdata_24S),
+ .SPIm_PWdata_14S (SPIm_PWdata_14S),
+ .SPIm_PWdata_11S (SPIm_PWdata_11S),
+ .SPIm_PWdata_0S (SPIm_PWdata_0S),
+ .SPIm_Paddr_8S (SPIm_Paddr_8S),
+ .SPIm_Paddr_6S (SPIm_Paddr_6S),
+ .FB_PKfbPush_1S (FB_PKfbPush_1S),
+ .FB_PKfbData_31S (FB_PKfbData_31S),
+ .FB_PKfbData_21S (FB_PKfbData_21S),
+ .FB_PKfbData_19S (FB_PKfbData_19S),
+ .FB_PKfbData_9S (FB_PKfbData_9S),
+ .FB_PKfbData_6S (FB_PKfbData_6S),
+ .Sys_PKfb_ClkS (Sys_PKfb_ClkS),
+ .FB_BusyS (FB_BusyS),
+ .WB_CLKS (WB_CLKS)
+ );
+
+endmodule /* qlal4s3b_cell_macro */
+
+
+(* keep *)
+module gpio_cell_macro (
+
+ ESEL,
+ IE,
+ OSEL,
+ OQI,
+ OQE,
+ DS,
+ FIXHOLD,
+ IZ,
+ IQZ,
+ IQE,
+ IQC,
+ IQCS,
+ IQR,
+ WPD,
+ INEN,
+ IP
+ );
+
+input ESEL;
+input IE;
+input OSEL;
+input OQI;
+input OQE;
+input DS;
+input FIXHOLD;
+output IZ;
+output IQZ;
+input IQE;
+input IQC;
+input IQCS;
+input INEN;
+input IQR;
+input WPD;
+inout IP;
+
+reg EN_reg, OQ_reg, IQZ;
+wire AND_OUT;
+
+assign rstn = ~IQR;
+assign IQCP = IQCS ? ~IQC : IQC;
+
+always @(posedge IQCP or negedge rstn)
+ if (~rstn)
+ EN_reg <= 1'b0;
+ else
+ EN_reg <= IE;
+
+always @(posedge IQCP or negedge rstn)
+ if (~rstn)
+ OQ_reg <= 1'b0;
+ else
+ if (OQE)
+ OQ_reg <= OQI;
+
+
+always @(posedge IQCP or negedge rstn)
+ if (~rstn)
+ IQZ <= 1'b0;
+ else
+ if (IQE)
+ IQZ <= AND_OUT;
+
+assign IZ = AND_OUT;
+
+assign AND_OUT = INEN ? IP : 1'b0;
+
+assign EN = ESEL ? IE : EN_reg ;
+
+assign OQ = OSEL ? OQI : OQ_reg ;
+
+assign IP = EN ? OQ : 1'bz;
+
+endmodule
+
+