@@ -2326,8 +2326,14 @@ module dsp_t1_sim_cfg_params # (
23262326 wire [2 :0 ] feedback = REGISTER_INPUTS ? r_feedback : feedback_i;
23272327 wire load_acc = REGISTER_INPUTS ? r_load_acc : load_acc_i;
23282328 wire subtract = REGISTER_INPUTS ? r_subtract : subtract_i;
2329- wire sat = REGISTER_INPUTS ? r_sat : SATURATE_ENABLE;
2330- wire rnd = REGISTER_INPUTS ? r_rnd : ROUND;
2329+ wire sat = REGISTER_INPUTS ? r_sat : SATURATE_ENABLE;
2330+ wire rnd = REGISTER_INPUTS ? r_rnd : ROUND;
2331+
2332+ wire sat_d1 = REGISTER_INPUTS ? r_sat_d1 : SATURATE_ENABLE;
2333+ wire sat_d2 = OUTPUT_SELECT[1 ] ? r_sat_d1 : r_sat_d2;
2334+
2335+ wire rnd_d1 = REGISTER_INPUTS ? r_rnd_d1 : ROUND;
2336+ wire rnd_d2 = OUTPUT_SELECT[1 ] ? rnd_d1 : r_rnd_d2;
23312337
23322338 // Shift right control
23332339 wire [5 :0 ] shift_d1 = REGISTER_INPUTS ? r_shift_d1 : SHIFT_RIGHT;
@@ -2364,12 +2370,14 @@ module dsp_t1_sim_cfg_params # (
23642370 {{(NBITS_ACC- NBITS_A- NBITS_B){mult[NBITS_A+ NBITS_B- 1 ]}}, mult[NBITS_A+ NBITS_B- 1 :0 ]};
23652371
23662372 // Adder
2367- wire [NBITS_ACC- 1 :0 ] acc_fir_int = unsigned_a ? {{(NBITS_ACC- NBITS_A){1'b0 }}, a} :
2373+ wire [NBITS_ACC- 1 :0 ] acc_fir_int = unsigned_a ? {{(NBITS_ACC- NBITS_A){1'b0 }}, a} :
23682374 {{(NBITS_ACC- NBITS_A){a[NBITS_A- 1 ]}}, a} ;
23692375
23702376 wire [NBITS_ACC- 1 :0 ] add_a = (subtract) ? (~ mult_xtnd + 1 ) : mult_xtnd;
2371- wire [NBITS_ACC- 1 :0 ] add_b = (feedback_i == 3'h0 ) ? acc :
2372- (feedback_i == 3'h1 ) ? {{NBITS_ACC}{1'b0 }} : (acc_fir_int << acc_fir);
2377+ wire [NBITS_ACC- 1 :0 ] add_b = (feedback == 3'h0 ) ? acc :
2378+ (feedback == 3'h1 ) ? {{NBITS_ACC}{1'b0 }} :
2379+ (acc_fir < 6'd44 ? acc_fir_int << acc_fir :
2380+ acc_fir_int << 6'd44 );
23732381
23742382 wire [NBITS_ACC- 1 :0 ] add_o = add_a + add_b;
23752383
@@ -2389,47 +2397,47 @@ module dsp_t1_sim_cfg_params # (
23892397 wire [NBITS_ACC- 1 :0 ] acc_out = (OUTPUT_SELECT[1 ]) ? add_o : acc;
23902398
23912399 // Round, shift, saturate
2392- wire [NBITS_ACC- 1 :0 ] acc_rnd = (rnd && (SHIFT_RIGHT != 0 )) ? (acc_out + ({{(NBITS_ACC- 1 ){1'b0 }}, 1'b1 } << (SHIFT_RIGHT - 1 ))) :
2400+ wire [NBITS_ACC- 1 :0 ] acc_rnd = (rnd_d2 && (shift_d2 != 0 )) ? (acc_out + ({{(NBITS_ACC- 1 ){1'b0 }}, 1'b1 } << (shift_d2 - 1 ))) :
23932401 acc_out;
23942402
2395- wire [NBITS_ACC- 1 :0 ] acc_shr = (unsigned_mode) ? (acc_rnd >> SHIFT_RIGHT) :
2396- (acc_rnd >>> SHIFT_RIGHT);
2403+ wire [NBITS_ACC- 1 :0 ] acc_shr = acc_rnd >>> shift_d2;
23972404
2398- wire [NBITS_ACC- 1 :0 ] acc_sat_u = (acc_shr[NBITS_ACC- 1 :NBITS_Z] != 0 ) ? {{(NBITS_ACC- NBITS_Z){1'b0 }},{NBITS_Z{1'b1 }}} :
2399- {{(NBITS_ACC- NBITS_Z){1'b0 }},{acc_shr[NBITS_Z- 1 :0 ]}};
2405+ wire [NBITS_ACC- 1 :0 ] acc_sat_u = (& acc_shr[NBITS_ACC- 1 :NBITS_Z- 1 ] == 1'b1 ) ? {NBITS_ACC{1'b0 }} :
2406+ (| acc_shr[NBITS_ACC- 1 :NBITS_Z- 1 ] == 1'b0 ? {{(NBITS_ACC- NBITS_Z){1'b0 }},{acc_shr[NBITS_Z- 1 :0 ]}}:
2407+ {{(NBITS_ACC- NBITS_Z){1'b0 }},{NBITS_Z{1'b1 }}});
24002408
24012409 wire [NBITS_ACC- 1 :0 ] acc_sat_s = ((| acc_shr[NBITS_ACC- 1 :NBITS_Z- 1 ] == 1'b0 ) ||
24022410 (& acc_shr[NBITS_ACC- 1 :NBITS_Z- 1 ] == 1'b1 )) ? {{(NBITS_ACC- NBITS_Z){1'b0 }},{acc_shr[NBITS_Z- 1 :0 ]}} :
24032411 {{(NBITS_ACC- NBITS_Z){1'b0 }},{acc_shr[NBITS_ACC- 1 ],{NBITS_Z- 1 {~ acc_shr[NBITS_ACC- 1 ]}}}};
24042412
2405- wire [NBITS_ACC- 1 :0 ] acc_sat = (sat) ? (( unsigned_mode) ? acc_sat_u : acc_sat_s) : acc_shr;
2413+ wire [NBITS_ACC- 1 :0 ] acc_sat = sat_d2 ? (unsigned_mode ? acc_sat_u : acc_sat_s) : acc_shr;
24062414
24072415 // Output signals
2408- wire [NBITS_Z - 1 :0 ] z0 ;
2409- reg [NBITS_Z - 1 :0 ] z1 ;
2410- wire [NBITS_Z - 1 :0 ] z2;
2416+ wire [NBITS_ACC - 1 :0 ] z0 ;
2417+ reg [NBITS_ACC - 1 :0 ] z1 ;
2418+ wire [NBITS_ACC - 1 :0 ] z2;
24112419
2412- assign z0 = mult_xtnd[NBITS_Z - 1 : 0 ] ;
2413- assign z2 = acc_sat[NBITS_Z - 1 : 0 ] ;
2420+ assign z0 = unsigned_mode ? mult_xtnd >> shift_d2 : mult_xtnd >>> shift_d2 ;
2421+ assign z2 = acc_sat;
24142422
24152423 initial z1 <= 0 ;
24162424
24172425 always @(posedge clock_i or posedge s_reset)
24182426 if (s_reset)
24192427 z1 <= 0 ;
24202428 else begin
2421- z1 <= (OUTPUT_SELECT == 3'b100 ) ? z0 : z2;
2429+ z1 <= (OUTPUT_SELECT == 3'b100 ) ? mult_xtnd : z2;
24222430 end
24232431
24242432 // Output mux
2425- assign z_o = (OUTPUT_SELECT == 3'h0 ) ? z0 :
2426- (OUTPUT_SELECT == 3'h1 ) ? z2 :
2427- (OUTPUT_SELECT == 3'h2 ) ? z2 :
2428- (OUTPUT_SELECT == 3'h3 ) ? z2 :
2429- (OUTPUT_SELECT == 3'h4 ) ? z1 :
2430- (OUTPUT_SELECT == 3'h5 ) ? z1 :
2431- (OUTPUT_SELECT == 3'h6 ) ? z1 :
2432- z1 ; // if OUTPUT_SELECT == 3'h7
2433+ assign z_o = (OUTPUT_SELECT == 3'h0 ) ? mult_xtnd[NBITS_Z - 1 : 0 ] :
2434+ (OUTPUT_SELECT == 3'h1 ) ? z2[NBITS_Z - 1 : 0 ] :
2435+ (OUTPUT_SELECT == 3'h2 ) ? z2[NBITS_Z - 1 : 0 ] :
2436+ (OUTPUT_SELECT == 3'h3 ) ? z2[NBITS_Z - 1 : 0 ] :
2437+ (OUTPUT_SELECT == 3'h4 ) ? z1 [NBITS_Z - 1 : 0 ] :
2438+ (OUTPUT_SELECT == 3'h5 ) ? z1 [NBITS_Z - 1 : 0 ] :
2439+ (OUTPUT_SELECT == 3'h6 ) ? z1 [NBITS_Z - 1 : 0 ] :
2440+ z1 [NBITS_Z - 1 : 0 ] ; // if OUTPUT_SELECT == 3'h7
24332441
24342442 // B input delayed passthrough
24352443 initial dly_b_o <= 0 ;
0 commit comments