| // Copyright 2020-2022 F4PGA Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| `timescale 1ps/1ps |
| |
| `default_nettype none |
| |
| (* blackbox *) |
| module QL_DSP1 ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| (* clkbuf_sink *) |
| input wire clk0, |
| (* clkbuf_sink *) |
| input wire clk1, |
| input wire [ 1:0] feedback0, |
| input wire [ 1:0] feedback1, |
| input wire load_acc0, |
| input wire load_acc1, |
| input wire reset0, |
| input wire reset1, |
| output reg [37:0] z |
| ); |
| parameter MODE_BITS = 27'b00000000000000000000000000; |
| endmodule /* QL_DSP1 */ |
| |
| |
| |
| // ---------------------------------------- // |
| // ----- DSP cells simulation modules ----- // |
| // --------- Control bits in ports -------- // |
| // ---------------------------------------- // |
| |
| module QL_DSP2 ( // TODO: Name subject to change |
| input wire [19:0] a, |
| input wire [17:0] b, |
| input wire [ 5:0] acc_fir, |
| output wire [37:0] z, |
| output wire [17:0] dly_b, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [2:0] feedback, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [2:0] output_select, |
| input wire saturate_enable, |
| input wire [5:0] shift_right, |
| input wire round, |
| input wire subtract, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam NBITS_ACC = 64; |
| localparam NBITS_A = 20; |
| localparam NBITS_B = 18; |
| localparam NBITS_Z = 38; |
| |
| wire [NBITS_Z-1:0] dsp_full_z; |
| wire [(NBITS_Z/2)-1:0] dsp_frac0_z; |
| wire [(NBITS_Z/2)-1:0] dsp_frac1_z; |
| |
| wire [NBITS_B-1:0] dsp_full_dly_b; |
| wire [(NBITS_B/2)-1:0] dsp_frac0_dly_b; |
| wire [(NBITS_B/2)-1:0] dsp_frac1_dly_b; |
| |
| assign z = f_mode ? {dsp_frac1_z, dsp_frac0_z} : dsp_full_z; |
| assign dly_b = f_mode ? {dsp_frac1_dly_b, dsp_frac0_dly_b} : dsp_full_dly_b; |
| |
| // Output used when fmode == 1 |
| dsp_t1_sim_cfg_ports #( |
| .NBITS_A(NBITS_A/2), |
| .NBITS_B(NBITS_B/2), |
| .NBITS_ACC(NBITS_ACC/2), |
| .NBITS_Z(NBITS_Z/2) |
| ) dsp_frac0 ( |
| .a_i(a[(NBITS_A/2)-1:0]), |
| .b_i(b[(NBITS_B/2)-1:0]), |
| .z_o(dsp_frac0_z), |
| .dly_b_o(dsp_frac0_dly_b), |
| |
| .acc_fir_i(acc_fir), |
| .feedback_i(feedback), |
| .load_acc_i(load_acc), |
| |
| .unsigned_a_i(unsigned_a), |
| .unsigned_b_i(unsigned_b), |
| |
| .clock_i(clk), |
| .s_reset(reset), |
| |
| .saturate_enable_i(saturate_enable), |
| .output_select_i(output_select), |
| .round_i(round), |
| .shift_right_i(shift_right), |
| .subtract_i(subtract), |
| .register_inputs_i(register_inputs), |
| .coef_0_i(COEFF_0[(NBITS_A/2)-1:0]), |
| .coef_1_i(COEFF_1[(NBITS_A/2)-1:0]), |
| .coef_2_i(COEFF_2[(NBITS_A/2)-1:0]), |
| .coef_3_i(COEFF_3[(NBITS_A/2)-1:0]) |
| ); |
| |
| // Output used when fmode == 1 |
| dsp_t1_sim_cfg_ports #( |
| .NBITS_A(NBITS_A/2), |
| .NBITS_B(NBITS_B/2), |
| .NBITS_ACC(NBITS_ACC/2), |
| .NBITS_Z(NBITS_Z/2) |
| ) dsp_frac1 ( |
| .a_i(a[NBITS_A-1:NBITS_A/2]), |
| .b_i(b[NBITS_B-1:NBITS_B/2]), |
| .z_o(dsp_frac1_z), |
| .dly_b_o(dsp_frac1_dly_b), |
| |
| .acc_fir_i(acc_fir), |
| .feedback_i(feedback), |
| .load_acc_i(load_acc), |
| |
| .unsigned_a_i(unsigned_a), |
| .unsigned_b_i(unsigned_b), |
| |
| .clock_i(clk), |
| .s_reset(reset), |
| |
| .saturate_enable_i(saturate_enable), |
| .output_select_i(output_select), |
| .round_i(round), |
| .shift_right_i(shift_right), |
| .subtract_i(subtract), |
| .register_inputs_i(register_inputs), |
| .coef_0_i(COEFF_0[NBITS_A-1:NBITS_A/2]), |
| .coef_1_i(COEFF_1[NBITS_A-1:NBITS_A/2]), |
| .coef_2_i(COEFF_2[NBITS_A-1:NBITS_A/2]), |
| .coef_3_i(COEFF_3[NBITS_A-1:NBITS_A/2]) |
| ); |
| |
| // Output used when fmode == 0 |
| dsp_t1_sim_cfg_ports #( |
| .NBITS_A(NBITS_A), |
| .NBITS_B(NBITS_B), |
| .NBITS_ACC(NBITS_ACC), |
| .NBITS_Z(NBITS_Z) |
| ) dsp_full ( |
| .a_i(a), |
| .b_i(b), |
| .z_o(dsp_full_z), |
| .dly_b_o(dsp_full_dly_b), |
| |
| .acc_fir_i(acc_fir), |
| .feedback_i(feedback), |
| .load_acc_i(load_acc), |
| |
| .unsigned_a_i(unsigned_a), |
| .unsigned_b_i(unsigned_b), |
| |
| .clock_i(clk), |
| .s_reset(reset), |
| |
| .saturate_enable_i(saturate_enable), |
| .output_select_i(output_select), |
| .round_i(round), |
| .shift_right_i(shift_right), |
| .subtract_i(subtract), |
| .register_inputs_i(register_inputs), |
| .coef_0_i(COEFF_0), |
| .coef_1_i(COEFF_1), |
| .coef_2_i(COEFF_2), |
| .coef_3_i(COEFF_3) |
| ); |
| endmodule |
| |
| module QL_DSP2_MULT ( // TODO: Name subject to change |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| input wire reset, |
| |
| input wire [2:0] feedback, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [2:0] output_select, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .acc_fir(6'b0), |
| .z(z), |
| .dly_b(), |
| |
| .clk(1'b0), |
| .reset(reset), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .load_acc(1'b0), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .output_select(output_select), // unregistered output: a * b (0) |
| .saturate_enable(1'b0), |
| .shift_right(6'b0), |
| .round(1'b0), |
| .subtract(1'b0), |
| .register_inputs(register_inputs) // unregistered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (a[0] => z[0]) = 0; |
| (a[1] => z[0]) = 0; |
| (a[2] => z[0]) = 0; |
| (a[3] => z[0]) = 0; |
| (a[4] => z[0]) = 0; |
| (a[5] => z[0]) = 0; |
| (a[6] => z[0]) = 0; |
| (a[7] => z[0]) = 0; |
| (a[8] => z[0]) = 0; |
| (a[9] => z[0]) = 0; |
| (a[10] => z[0]) = 0; |
| (a[11] => z[0]) = 0; |
| (a[12] => z[0]) = 0; |
| (a[13] => z[0]) = 0; |
| (a[14] => z[0]) = 0; |
| (a[15] => z[0]) = 0; |
| (a[16] => z[0]) = 0; |
| (a[17] => z[0]) = 0; |
| (a[18] => z[0]) = 0; |
| (a[19] => z[0]) = 0; |
| (b[0] => z[0]) = 0; |
| (b[1] => z[0]) = 0; |
| (b[2] => z[0]) = 0; |
| (b[3] => z[0]) = 0; |
| (b[4] => z[0]) = 0; |
| (b[5] => z[0]) = 0; |
| (b[6] => z[0]) = 0; |
| (b[7] => z[0]) = 0; |
| (b[8] => z[0]) = 0; |
| (b[9] => z[0]) = 0; |
| (b[10] => z[0]) = 0; |
| (b[11] => z[0]) = 0; |
| (b[12] => z[0]) = 0; |
| (b[13] => z[0]) = 0; |
| (b[14] => z[0]) = 0; |
| (b[15] => z[0]) = 0; |
| (b[16] => z[0]) = 0; |
| (b[17] => z[0]) = 0; |
| (a[0] => z[1]) = 0; |
| (a[1] => z[1]) = 0; |
| (a[2] => z[1]) = 0; |
| (a[3] => z[1]) = 0; |
| (a[4] => z[1]) = 0; |
| (a[5] => z[1]) = 0; |
| (a[6] => z[1]) = 0; |
| (a[7] => z[1]) = 0; |
| (a[8] => z[1]) = 0; |
| (a[9] => z[1]) = 0; |
| (a[10] => z[1]) = 0; |
| (a[11] => z[1]) = 0; |
| (a[12] => z[1]) = 0; |
| (a[13] => z[1]) = 0; |
| (a[14] => z[1]) = 0; |
| (a[15] => z[1]) = 0; |
| (a[16] => z[1]) = 0; |
| (a[17] => z[1]) = 0; |
| (a[18] => z[1]) = 0; |
| (a[19] => z[1]) = 0; |
| (b[0] => z[1]) = 0; |
| (b[1] => z[1]) = 0; |
| (b[2] => z[1]) = 0; |
| (b[3] => z[1]) = 0; |
| (b[4] => z[1]) = 0; |
| (b[5] => z[1]) = 0; |
| (b[6] => z[1]) = 0; |
| (b[7] => z[1]) = 0; |
| (b[8] => z[1]) = 0; |
| (b[9] => z[1]) = 0; |
| (b[10] => z[1]) = 0; |
| (b[11] => z[1]) = 0; |
| (b[12] => z[1]) = 0; |
| (b[13] => z[1]) = 0; |
| (b[14] => z[1]) = 0; |
| (b[15] => z[1]) = 0; |
| (b[16] => z[1]) = 0; |
| (b[17] => z[1]) = 0; |
| (a[0] => z[2]) = 0; |
| (a[1] => z[2]) = 0; |
| (a[2] => z[2]) = 0; |
| (a[3] => z[2]) = 0; |
| (a[4] => z[2]) = 0; |
| (a[5] => z[2]) = 0; |
| (a[6] => z[2]) = 0; |
| (a[7] => z[2]) = 0; |
| (a[8] => z[2]) = 0; |
| (a[9] => z[2]) = 0; |
| (a[10] => z[2]) = 0; |
| (a[11] => z[2]) = 0; |
| (a[12] => z[2]) = 0; |
| (a[13] => z[2]) = 0; |
| (a[14] => z[2]) = 0; |
| (a[15] => z[2]) = 0; |
| (a[16] => z[2]) = 0; |
| (a[17] => z[2]) = 0; |
| (a[18] => z[2]) = 0; |
| (a[19] => z[2]) = 0; |
| (b[0] => z[2]) = 0; |
| (b[1] => z[2]) = 0; |
| (b[2] => z[2]) = 0; |
| (b[3] => z[2]) = 0; |
| (b[4] => z[2]) = 0; |
| (b[5] => z[2]) = 0; |
| (b[6] => z[2]) = 0; |
| (b[7] => z[2]) = 0; |
| (b[8] => z[2]) = 0; |
| (b[9] => z[2]) = 0; |
| (b[10] => z[2]) = 0; |
| (b[11] => z[2]) = 0; |
| (b[12] => z[2]) = 0; |
| (b[13] => z[2]) = 0; |
| (b[14] => z[2]) = 0; |
| (b[15] => z[2]) = 0; |
| (b[16] => z[2]) = 0; |
| (b[17] => z[2]) = 0; |
| (a[0] => z[3]) = 0; |
| (a[1] => z[3]) = 0; |
| (a[2] => z[3]) = 0; |
| (a[3] => z[3]) = 0; |
| (a[4] => z[3]) = 0; |
| (a[5] => z[3]) = 0; |
| (a[6] => z[3]) = 0; |
| (a[7] => z[3]) = 0; |
| (a[8] => z[3]) = 0; |
| (a[9] => z[3]) = 0; |
| (a[10] => z[3]) = 0; |
| (a[11] => z[3]) = 0; |
| (a[12] => z[3]) = 0; |
| (a[13] => z[3]) = 0; |
| (a[14] => z[3]) = 0; |
| (a[15] => z[3]) = 0; |
| (a[16] => z[3]) = 0; |
| (a[17] => z[3]) = 0; |
| (a[18] => z[3]) = 0; |
| (a[19] => z[3]) = 0; |
| (b[0] => z[3]) = 0; |
| (b[1] => z[3]) = 0; |
| (b[2] => z[3]) = 0; |
| (b[3] => z[3]) = 0; |
| (b[4] => z[3]) = 0; |
| (b[5] => z[3]) = 0; |
| (b[6] => z[3]) = 0; |
| (b[7] => z[3]) = 0; |
| (b[8] => z[3]) = 0; |
| (b[9] => z[3]) = 0; |
| (b[10] => z[3]) = 0; |
| (b[11] => z[3]) = 0; |
| (b[12] => z[3]) = 0; |
| (b[13] => z[3]) = 0; |
| (b[14] => z[3]) = 0; |
| (b[15] => z[3]) = 0; |
| (b[16] => z[3]) = 0; |
| (b[17] => z[3]) = 0; |
| (a[0] => z[4]) = 0; |
| (a[1] => z[4]) = 0; |
| (a[2] => z[4]) = 0; |
| (a[3] => z[4]) = 0; |
| (a[4] => z[4]) = 0; |
| (a[5] => z[4]) = 0; |
| (a[6] => z[4]) = 0; |
| (a[7] => z[4]) = 0; |
| (a[8] => z[4]) = 0; |
| (a[9] => z[4]) = 0; |
| (a[10] => z[4]) = 0; |
| (a[11] => z[4]) = 0; |
| (a[12] => z[4]) = 0; |
| (a[13] => z[4]) = 0; |
| (a[14] => z[4]) = 0; |
| (a[15] => z[4]) = 0; |
| (a[16] => z[4]) = 0; |
| (a[17] => z[4]) = 0; |
| (a[18] => z[4]) = 0; |
| (a[19] => z[4]) = 0; |
| (b[0] => z[4]) = 0; |
| (b[1] => z[4]) = 0; |
| (b[2] => z[4]) = 0; |
| (b[3] => z[4]) = 0; |
| (b[4] => z[4]) = 0; |
| (b[5] => z[4]) = 0; |
| (b[6] => z[4]) = 0; |
| (b[7] => z[4]) = 0; |
| (b[8] => z[4]) = 0; |
| (b[9] => z[4]) = 0; |
| (b[10] => z[4]) = 0; |
| (b[11] => z[4]) = 0; |
| (b[12] => z[4]) = 0; |
| (b[13] => z[4]) = 0; |
| (b[14] => z[4]) = 0; |
| (b[15] => z[4]) = 0; |
| (b[16] => z[4]) = 0; |
| (b[17] => z[4]) = 0; |
| (a[0] => z[5]) = 0; |
| (a[1] => z[5]) = 0; |
| (a[2] => z[5]) = 0; |
| (a[3] => z[5]) = 0; |
| (a[4] => z[5]) = 0; |
| (a[5] => z[5]) = 0; |
| (a[6] => z[5]) = 0; |
| (a[7] => z[5]) = 0; |
| (a[8] => z[5]) = 0; |
| (a[9] => z[5]) = 0; |
| (a[10] => z[5]) = 0; |
| (a[11] => z[5]) = 0; |
| (a[12] => z[5]) = 0; |
| (a[13] => z[5]) = 0; |
| (a[14] => z[5]) = 0; |
| (a[15] => z[5]) = 0; |
| (a[16] => z[5]) = 0; |
| (a[17] => z[5]) = 0; |
| (a[18] => z[5]) = 0; |
| (a[19] => z[5]) = 0; |
| (b[0] => z[5]) = 0; |
| (b[1] => z[5]) = 0; |
| (b[2] => z[5]) = 0; |
| (b[3] => z[5]) = 0; |
| (b[4] => z[5]) = 0; |
| (b[5] => z[5]) = 0; |
| (b[6] => z[5]) = 0; |
| (b[7] => z[5]) = 0; |
| (b[8] => z[5]) = 0; |
| (b[9] => z[5]) = 0; |
| (b[10] => z[5]) = 0; |
| (b[11] => z[5]) = 0; |
| (b[12] => z[5]) = 0; |
| (b[13] => z[5]) = 0; |
| (b[14] => z[5]) = 0; |
| (b[15] => z[5]) = 0; |
| (b[16] => z[5]) = 0; |
| (b[17] => z[5]) = 0; |
| (a[0] => z[6]) = 0; |
| (a[1] => z[6]) = 0; |
| (a[2] => z[6]) = 0; |
| (a[3] => z[6]) = 0; |
| (a[4] => z[6]) = 0; |
| (a[5] => z[6]) = 0; |
| (a[6] => z[6]) = 0; |
| (a[7] => z[6]) = 0; |
| (a[8] => z[6]) = 0; |
| (a[9] => z[6]) = 0; |
| (a[10] => z[6]) = 0; |
| (a[11] => z[6]) = 0; |
| (a[12] => z[6]) = 0; |
| (a[13] => z[6]) = 0; |
| (a[14] => z[6]) = 0; |
| (a[15] => z[6]) = 0; |
| (a[16] => z[6]) = 0; |
| (a[17] => z[6]) = 0; |
| (a[18] => z[6]) = 0; |
| (a[19] => z[6]) = 0; |
| (b[0] => z[6]) = 0; |
| (b[1] => z[6]) = 0; |
| (b[2] => z[6]) = 0; |
| (b[3] => z[6]) = 0; |
| (b[4] => z[6]) = 0; |
| (b[5] => z[6]) = 0; |
| (b[6] => z[6]) = 0; |
| (b[7] => z[6]) = 0; |
| (b[8] => z[6]) = 0; |
| (b[9] => z[6]) = 0; |
| (b[10] => z[6]) = 0; |
| (b[11] => z[6]) = 0; |
| (b[12] => z[6]) = 0; |
| (b[13] => z[6]) = 0; |
| (b[14] => z[6]) = 0; |
| (b[15] => z[6]) = 0; |
| (b[16] => z[6]) = 0; |
| (b[17] => z[6]) = 0; |
| (a[0] => z[7]) = 0; |
| (a[1] => z[7]) = 0; |
| (a[2] => z[7]) = 0; |
| (a[3] => z[7]) = 0; |
| (a[4] => z[7]) = 0; |
| (a[5] => z[7]) = 0; |
| (a[6] => z[7]) = 0; |
| (a[7] => z[7]) = 0; |
| (a[8] => z[7]) = 0; |
| (a[9] => z[7]) = 0; |
| (a[10] => z[7]) = 0; |
| (a[11] => z[7]) = 0; |
| (a[12] => z[7]) = 0; |
| (a[13] => z[7]) = 0; |
| (a[14] => z[7]) = 0; |
| (a[15] => z[7]) = 0; |
| (a[16] => z[7]) = 0; |
| (a[17] => z[7]) = 0; |
| (a[18] => z[7]) = 0; |
| (a[19] => z[7]) = 0; |
| (b[0] => z[7]) = 0; |
| (b[1] => z[7]) = 0; |
| (b[2] => z[7]) = 0; |
| (b[3] => z[7]) = 0; |
| (b[4] => z[7]) = 0; |
| (b[5] => z[7]) = 0; |
| (b[6] => z[7]) = 0; |
| (b[7] => z[7]) = 0; |
| (b[8] => z[7]) = 0; |
| (b[9] => z[7]) = 0; |
| (b[10] => z[7]) = 0; |
| (b[11] => z[7]) = 0; |
| (b[12] => z[7]) = 0; |
| (b[13] => z[7]) = 0; |
| (b[14] => z[7]) = 0; |
| (b[15] => z[7]) = 0; |
| (b[16] => z[7]) = 0; |
| (b[17] => z[7]) = 0; |
| (a[0] => z[8]) = 0; |
| (a[1] => z[8]) = 0; |
| (a[2] => z[8]) = 0; |
| (a[3] => z[8]) = 0; |
| (a[4] => z[8]) = 0; |
| (a[5] => z[8]) = 0; |
| (a[6] => z[8]) = 0; |
| (a[7] => z[8]) = 0; |
| (a[8] => z[8]) = 0; |
| (a[9] => z[8]) = 0; |
| (a[10] => z[8]) = 0; |
| (a[11] => z[8]) = 0; |
| (a[12] => z[8]) = 0; |
| (a[13] => z[8]) = 0; |
| (a[14] => z[8]) = 0; |
| (a[15] => z[8]) = 0; |
| (a[16] => z[8]) = 0; |
| (a[17] => z[8]) = 0; |
| (a[18] => z[8]) = 0; |
| (a[19] => z[8]) = 0; |
| (b[0] => z[8]) = 0; |
| (b[1] => z[8]) = 0; |
| (b[2] => z[8]) = 0; |
| (b[3] => z[8]) = 0; |
| (b[4] => z[8]) = 0; |
| (b[5] => z[8]) = 0; |
| (b[6] => z[8]) = 0; |
| (b[7] => z[8]) = 0; |
| (b[8] => z[8]) = 0; |
| (b[9] => z[8]) = 0; |
| (b[10] => z[8]) = 0; |
| (b[11] => z[8]) = 0; |
| (b[12] => z[8]) = 0; |
| (b[13] => z[8]) = 0; |
| (b[14] => z[8]) = 0; |
| (b[15] => z[8]) = 0; |
| (b[16] => z[8]) = 0; |
| (b[17] => z[8]) = 0; |
| (a[0] => z[9]) = 0; |
| (a[1] => z[9]) = 0; |
| (a[2] => z[9]) = 0; |
| (a[3] => z[9]) = 0; |
| (a[4] => z[9]) = 0; |
| (a[5] => z[9]) = 0; |
| (a[6] => z[9]) = 0; |
| (a[7] => z[9]) = 0; |
| (a[8] => z[9]) = 0; |
| (a[9] => z[9]) = 0; |
| (a[10] => z[9]) = 0; |
| (a[11] => z[9]) = 0; |
| (a[12] => z[9]) = 0; |
| (a[13] => z[9]) = 0; |
| (a[14] => z[9]) = 0; |
| (a[15] => z[9]) = 0; |
| (a[16] => z[9]) = 0; |
| (a[17] => z[9]) = 0; |
| (a[18] => z[9]) = 0; |
| (a[19] => z[9]) = 0; |
| (b[0] => z[9]) = 0; |
| (b[1] => z[9]) = 0; |
| (b[2] => z[9]) = 0; |
| (b[3] => z[9]) = 0; |
| (b[4] => z[9]) = 0; |
| (b[5] => z[9]) = 0; |
| (b[6] => z[9]) = 0; |
| (b[7] => z[9]) = 0; |
| (b[8] => z[9]) = 0; |
| (b[9] => z[9]) = 0; |
| (b[10] => z[9]) = 0; |
| (b[11] => z[9]) = 0; |
| (b[12] => z[9]) = 0; |
| (b[13] => z[9]) = 0; |
| (b[14] => z[9]) = 0; |
| (b[15] => z[9]) = 0; |
| (b[16] => z[9]) = 0; |
| (b[17] => z[9]) = 0; |
| (a[0] => z[10]) = 0; |
| (a[1] => z[10]) = 0; |
| (a[2] => z[10]) = 0; |
| (a[3] => z[10]) = 0; |
| (a[4] => z[10]) = 0; |
| (a[5] => z[10]) = 0; |
| (a[6] => z[10]) = 0; |
| (a[7] => z[10]) = 0; |
| (a[8] => z[10]) = 0; |
| (a[9] => z[10]) = 0; |
| (a[10] => z[10]) = 0; |
| (a[11] => z[10]) = 0; |
| (a[12] => z[10]) = 0; |
| (a[13] => z[10]) = 0; |
| (a[14] => z[10]) = 0; |
| (a[15] => z[10]) = 0; |
| (a[16] => z[10]) = 0; |
| (a[17] => z[10]) = 0; |
| (a[18] => z[10]) = 0; |
| (a[19] => z[10]) = 0; |
| (b[0] => z[10]) = 0; |
| (b[1] => z[10]) = 0; |
| (b[2] => z[10]) = 0; |
| (b[3] => z[10]) = 0; |
| (b[4] => z[10]) = 0; |
| (b[5] => z[10]) = 0; |
| (b[6] => z[10]) = 0; |
| (b[7] => z[10]) = 0; |
| (b[8] => z[10]) = 0; |
| (b[9] => z[10]) = 0; |
| (b[10] => z[10]) = 0; |
| (b[11] => z[10]) = 0; |
| (b[12] => z[10]) = 0; |
| (b[13] => z[10]) = 0; |
| (b[14] => z[10]) = 0; |
| (b[15] => z[10]) = 0; |
| (b[16] => z[10]) = 0; |
| (b[17] => z[10]) = 0; |
| (a[0] => z[11]) = 0; |
| (a[1] => z[11]) = 0; |
| (a[2] => z[11]) = 0; |
| (a[3] => z[11]) = 0; |
| (a[4] => z[11]) = 0; |
| (a[5] => z[11]) = 0; |
| (a[6] => z[11]) = 0; |
| (a[7] => z[11]) = 0; |
| (a[8] => z[11]) = 0; |
| (a[9] => z[11]) = 0; |
| (a[10] => z[11]) = 0; |
| (a[11] => z[11]) = 0; |
| (a[12] => z[11]) = 0; |
| (a[13] => z[11]) = 0; |
| (a[14] => z[11]) = 0; |
| (a[15] => z[11]) = 0; |
| (a[16] => z[11]) = 0; |
| (a[17] => z[11]) = 0; |
| (a[18] => z[11]) = 0; |
| (a[19] => z[11]) = 0; |
| (b[0] => z[11]) = 0; |
| (b[1] => z[11]) = 0; |
| (b[2] => z[11]) = 0; |
| (b[3] => z[11]) = 0; |
| (b[4] => z[11]) = 0; |
| (b[5] => z[11]) = 0; |
| (b[6] => z[11]) = 0; |
| (b[7] => z[11]) = 0; |
| (b[8] => z[11]) = 0; |
| (b[9] => z[11]) = 0; |
| (b[10] => z[11]) = 0; |
| (b[11] => z[11]) = 0; |
| (b[12] => z[11]) = 0; |
| (b[13] => z[11]) = 0; |
| (b[14] => z[11]) = 0; |
| (b[15] => z[11]) = 0; |
| (b[16] => z[11]) = 0; |
| (b[17] => z[11]) = 0; |
| (a[0] => z[12]) = 0; |
| (a[1] => z[12]) = 0; |
| (a[2] => z[12]) = 0; |
| (a[3] => z[12]) = 0; |
| (a[4] => z[12]) = 0; |
| (a[5] => z[12]) = 0; |
| (a[6] => z[12]) = 0; |
| (a[7] => z[12]) = 0; |
| (a[8] => z[12]) = 0; |
| (a[9] => z[12]) = 0; |
| (a[10] => z[12]) = 0; |
| (a[11] => z[12]) = 0; |
| (a[12] => z[12]) = 0; |
| (a[13] => z[12]) = 0; |
| (a[14] => z[12]) = 0; |
| (a[15] => z[12]) = 0; |
| (a[16] => z[12]) = 0; |
| (a[17] => z[12]) = 0; |
| (a[18] => z[12]) = 0; |
| (a[19] => z[12]) = 0; |
| (b[0] => z[12]) = 0; |
| (b[1] => z[12]) = 0; |
| (b[2] => z[12]) = 0; |
| (b[3] => z[12]) = 0; |
| (b[4] => z[12]) = 0; |
| (b[5] => z[12]) = 0; |
| (b[6] => z[12]) = 0; |
| (b[7] => z[12]) = 0; |
| (b[8] => z[12]) = 0; |
| (b[9] => z[12]) = 0; |
| (b[10] => z[12]) = 0; |
| (b[11] => z[12]) = 0; |
| (b[12] => z[12]) = 0; |
| (b[13] => z[12]) = 0; |
| (b[14] => z[12]) = 0; |
| (b[15] => z[12]) = 0; |
| (b[16] => z[12]) = 0; |
| (b[17] => z[12]) = 0; |
| (a[0] => z[13]) = 0; |
| (a[1] => z[13]) = 0; |
| (a[2] => z[13]) = 0; |
| (a[3] => z[13]) = 0; |
| (a[4] => z[13]) = 0; |
| (a[5] => z[13]) = 0; |
| (a[6] => z[13]) = 0; |
| (a[7] => z[13]) = 0; |
| (a[8] => z[13]) = 0; |
| (a[9] => z[13]) = 0; |
| (a[10] => z[13]) = 0; |
| (a[11] => z[13]) = 0; |
| (a[12] => z[13]) = 0; |
| (a[13] => z[13]) = 0; |
| (a[14] => z[13]) = 0; |
| (a[15] => z[13]) = 0; |
| (a[16] => z[13]) = 0; |
| (a[17] => z[13]) = 0; |
| (a[18] => z[13]) = 0; |
| (a[19] => z[13]) = 0; |
| (b[0] => z[13]) = 0; |
| (b[1] => z[13]) = 0; |
| (b[2] => z[13]) = 0; |
| (b[3] => z[13]) = 0; |
| (b[4] => z[13]) = 0; |
| (b[5] => z[13]) = 0; |
| (b[6] => z[13]) = 0; |
| (b[7] => z[13]) = 0; |
| (b[8] => z[13]) = 0; |
| (b[9] => z[13]) = 0; |
| (b[10] => z[13]) = 0; |
| (b[11] => z[13]) = 0; |
| (b[12] => z[13]) = 0; |
| (b[13] => z[13]) = 0; |
| (b[14] => z[13]) = 0; |
| (b[15] => z[13]) = 0; |
| (b[16] => z[13]) = 0; |
| (b[17] => z[13]) = 0; |
| (a[0] => z[14]) = 0; |
| (a[1] => z[14]) = 0; |
| (a[2] => z[14]) = 0; |
| (a[3] => z[14]) = 0; |
| (a[4] => z[14]) = 0; |
| (a[5] => z[14]) = 0; |
| (a[6] => z[14]) = 0; |
| (a[7] => z[14]) = 0; |
| (a[8] => z[14]) = 0; |
| (a[9] => z[14]) = 0; |
| (a[10] => z[14]) = 0; |
| (a[11] => z[14]) = 0; |
| (a[12] => z[14]) = 0; |
| (a[13] => z[14]) = 0; |
| (a[14] => z[14]) = 0; |
| (a[15] => z[14]) = 0; |
| (a[16] => z[14]) = 0; |
| (a[17] => z[14]) = 0; |
| (a[18] => z[14]) = 0; |
| (a[19] => z[14]) = 0; |
| (b[0] => z[14]) = 0; |
| (b[1] => z[14]) = 0; |
| (b[2] => z[14]) = 0; |
| (b[3] => z[14]) = 0; |
| (b[4] => z[14]) = 0; |
| (b[5] => z[14]) = 0; |
| (b[6] => z[14]) = 0; |
| (b[7] => z[14]) = 0; |
| (b[8] => z[14]) = 0; |
| (b[9] => z[14]) = 0; |
| (b[10] => z[14]) = 0; |
| (b[11] => z[14]) = 0; |
| (b[12] => z[14]) = 0; |
| (b[13] => z[14]) = 0; |
| (b[14] => z[14]) = 0; |
| (b[15] => z[14]) = 0; |
| (b[16] => z[14]) = 0; |
| (b[17] => z[14]) = 0; |
| (a[0] => z[15]) = 0; |
| (a[1] => z[15]) = 0; |
| (a[2] => z[15]) = 0; |
| (a[3] => z[15]) = 0; |
| (a[4] => z[15]) = 0; |
| (a[5] => z[15]) = 0; |
| (a[6] => z[15]) = 0; |
| (a[7] => z[15]) = 0; |
| (a[8] => z[15]) = 0; |
| (a[9] => z[15]) = 0; |
| (a[10] => z[15]) = 0; |
| (a[11] => z[15]) = 0; |
| (a[12] => z[15]) = 0; |
| (a[13] => z[15]) = 0; |
| (a[14] => z[15]) = 0; |
| (a[15] => z[15]) = 0; |
| (a[16] => z[15]) = 0; |
| (a[17] => z[15]) = 0; |
| (a[18] => z[15]) = 0; |
| (a[19] => z[15]) = 0; |
| (b[0] => z[15]) = 0; |
| (b[1] => z[15]) = 0; |
| (b[2] => z[15]) = 0; |
| (b[3] => z[15]) = 0; |
| (b[4] => z[15]) = 0; |
| (b[5] => z[15]) = 0; |
| (b[6] => z[15]) = 0; |
| (b[7] => z[15]) = 0; |
| (b[8] => z[15]) = 0; |
| (b[9] => z[15]) = 0; |
| (b[10] => z[15]) = 0; |
| (b[11] => z[15]) = 0; |
| (b[12] => z[15]) = 0; |
| (b[13] => z[15]) = 0; |
| (b[14] => z[15]) = 0; |
| (b[15] => z[15]) = 0; |
| (b[16] => z[15]) = 0; |
| (b[17] => z[15]) = 0; |
| (a[0] => z[16]) = 0; |
| (a[1] => z[16]) = 0; |
| (a[2] => z[16]) = 0; |
| (a[3] => z[16]) = 0; |
| (a[4] => z[16]) = 0; |
| (a[5] => z[16]) = 0; |
| (a[6] => z[16]) = 0; |
| (a[7] => z[16]) = 0; |
| (a[8] => z[16]) = 0; |
| (a[9] => z[16]) = 0; |
| (a[10] => z[16]) = 0; |
| (a[11] => z[16]) = 0; |
| (a[12] => z[16]) = 0; |
| (a[13] => z[16]) = 0; |
| (a[14] => z[16]) = 0; |
| (a[15] => z[16]) = 0; |
| (a[16] => z[16]) = 0; |
| (a[17] => z[16]) = 0; |
| (a[18] => z[16]) = 0; |
| (a[19] => z[16]) = 0; |
| (b[0] => z[16]) = 0; |
| (b[1] => z[16]) = 0; |
| (b[2] => z[16]) = 0; |
| (b[3] => z[16]) = 0; |
| (b[4] => z[16]) = 0; |
| (b[5] => z[16]) = 0; |
| (b[6] => z[16]) = 0; |
| (b[7] => z[16]) = 0; |
| (b[8] => z[16]) = 0; |
| (b[9] => z[16]) = 0; |
| (b[10] => z[16]) = 0; |
| (b[11] => z[16]) = 0; |
| (b[12] => z[16]) = 0; |
| (b[13] => z[16]) = 0; |
| (b[14] => z[16]) = 0; |
| (b[15] => z[16]) = 0; |
| (b[16] => z[16]) = 0; |
| (b[17] => z[16]) = 0; |
| (a[0] => z[17]) = 0; |
| (a[1] => z[17]) = 0; |
| (a[2] => z[17]) = 0; |
| (a[3] => z[17]) = 0; |
| (a[4] => z[17]) = 0; |
| (a[5] => z[17]) = 0; |
| (a[6] => z[17]) = 0; |
| (a[7] => z[17]) = 0; |
| (a[8] => z[17]) = 0; |
| (a[9] => z[17]) = 0; |
| (a[10] => z[17]) = 0; |
| (a[11] => z[17]) = 0; |
| (a[12] => z[17]) = 0; |
| (a[13] => z[17]) = 0; |
| (a[14] => z[17]) = 0; |
| (a[15] => z[17]) = 0; |
| (a[16] => z[17]) = 0; |
| (a[17] => z[17]) = 0; |
| (a[18] => z[17]) = 0; |
| (a[19] => z[17]) = 0; |
| (b[0] => z[17]) = 0; |
| (b[1] => z[17]) = 0; |
| (b[2] => z[17]) = 0; |
| (b[3] => z[17]) = 0; |
| (b[4] => z[17]) = 0; |
| (b[5] => z[17]) = 0; |
| (b[6] => z[17]) = 0; |
| (b[7] => z[17]) = 0; |
| (b[8] => z[17]) = 0; |
| (b[9] => z[17]) = 0; |
| (b[10] => z[17]) = 0; |
| (b[11] => z[17]) = 0; |
| (b[12] => z[17]) = 0; |
| (b[13] => z[17]) = 0; |
| (b[14] => z[17]) = 0; |
| (b[15] => z[17]) = 0; |
| (b[16] => z[17]) = 0; |
| (b[17] => z[17]) = 0; |
| (a[0] => z[18]) = 0; |
| (a[1] => z[18]) = 0; |
| (a[2] => z[18]) = 0; |
| (a[3] => z[18]) = 0; |
| (a[4] => z[18]) = 0; |
| (a[5] => z[18]) = 0; |
| (a[6] => z[18]) = 0; |
| (a[7] => z[18]) = 0; |
| (a[8] => z[18]) = 0; |
| (a[9] => z[18]) = 0; |
| (a[10] => z[18]) = 0; |
| (a[11] => z[18]) = 0; |
| (a[12] => z[18]) = 0; |
| (a[13] => z[18]) = 0; |
| (a[14] => z[18]) = 0; |
| (a[15] => z[18]) = 0; |
| (a[16] => z[18]) = 0; |
| (a[17] => z[18]) = 0; |
| (a[18] => z[18]) = 0; |
| (a[19] => z[18]) = 0; |
| (b[0] => z[18]) = 0; |
| (b[1] => z[18]) = 0; |
| (b[2] => z[18]) = 0; |
| (b[3] => z[18]) = 0; |
| (b[4] => z[18]) = 0; |
| (b[5] => z[18]) = 0; |
| (b[6] => z[18]) = 0; |
| (b[7] => z[18]) = 0; |
| (b[8] => z[18]) = 0; |
| (b[9] => z[18]) = 0; |
| (b[10] => z[18]) = 0; |
| (b[11] => z[18]) = 0; |
| (b[12] => z[18]) = 0; |
| (b[13] => z[18]) = 0; |
| (b[14] => z[18]) = 0; |
| (b[15] => z[18]) = 0; |
| (b[16] => z[18]) = 0; |
| (b[17] => z[18]) = 0; |
| (a[0] => z[19]) = 0; |
| (a[1] => z[19]) = 0; |
| (a[2] => z[19]) = 0; |
| (a[3] => z[19]) = 0; |
| (a[4] => z[19]) = 0; |
| (a[5] => z[19]) = 0; |
| (a[6] => z[19]) = 0; |
| (a[7] => z[19]) = 0; |
| (a[8] => z[19]) = 0; |
| (a[9] => z[19]) = 0; |
| (a[10] => z[19]) = 0; |
| (a[11] => z[19]) = 0; |
| (a[12] => z[19]) = 0; |
| (a[13] => z[19]) = 0; |
| (a[14] => z[19]) = 0; |
| (a[15] => z[19]) = 0; |
| (a[16] => z[19]) = 0; |
| (a[17] => z[19]) = 0; |
| (a[18] => z[19]) = 0; |
| (a[19] => z[19]) = 0; |
| (b[0] => z[19]) = 0; |
| (b[1] => z[19]) = 0; |
| (b[2] => z[19]) = 0; |
| (b[3] => z[19]) = 0; |
| (b[4] => z[19]) = 0; |
| (b[5] => z[19]) = 0; |
| (b[6] => z[19]) = 0; |
| (b[7] => z[19]) = 0; |
| (b[8] => z[19]) = 0; |
| (b[9] => z[19]) = 0; |
| (b[10] => z[19]) = 0; |
| (b[11] => z[19]) = 0; |
| (b[12] => z[19]) = 0; |
| (b[13] => z[19]) = 0; |
| (b[14] => z[19]) = 0; |
| (b[15] => z[19]) = 0; |
| (b[16] => z[19]) = 0; |
| (b[17] => z[19]) = 0; |
| (a[0] => z[20]) = 0; |
| (a[1] => z[20]) = 0; |
| (a[2] => z[20]) = 0; |
| (a[3] => z[20]) = 0; |
| (a[4] => z[20]) = 0; |
| (a[5] => z[20]) = 0; |
| (a[6] => z[20]) = 0; |
| (a[7] => z[20]) = 0; |
| (a[8] => z[20]) = 0; |
| (a[9] => z[20]) = 0; |
| (a[10] => z[20]) = 0; |
| (a[11] => z[20]) = 0; |
| (a[12] => z[20]) = 0; |
| (a[13] => z[20]) = 0; |
| (a[14] => z[20]) = 0; |
| (a[15] => z[20]) = 0; |
| (a[16] => z[20]) = 0; |
| (a[17] => z[20]) = 0; |
| (a[18] => z[20]) = 0; |
| (a[19] => z[20]) = 0; |
| (b[0] => z[20]) = 0; |
| (b[1] => z[20]) = 0; |
| (b[2] => z[20]) = 0; |
| (b[3] => z[20]) = 0; |
| (b[4] => z[20]) = 0; |
| (b[5] => z[20]) = 0; |
| (b[6] => z[20]) = 0; |
| (b[7] => z[20]) = 0; |
| (b[8] => z[20]) = 0; |
| (b[9] => z[20]) = 0; |
| (b[10] => z[20]) = 0; |
| (b[11] => z[20]) = 0; |
| (b[12] => z[20]) = 0; |
| (b[13] => z[20]) = 0; |
| (b[14] => z[20]) = 0; |
| (b[15] => z[20]) = 0; |
| (b[16] => z[20]) = 0; |
| (b[17] => z[20]) = 0; |
| (a[0] => z[21]) = 0; |
| (a[1] => z[21]) = 0; |
| (a[2] => z[21]) = 0; |
| (a[3] => z[21]) = 0; |
| (a[4] => z[21]) = 0; |
| (a[5] => z[21]) = 0; |
| (a[6] => z[21]) = 0; |
| (a[7] => z[21]) = 0; |
| (a[8] => z[21]) = 0; |
| (a[9] => z[21]) = 0; |
| (a[10] => z[21]) = 0; |
| (a[11] => z[21]) = 0; |
| (a[12] => z[21]) = 0; |
| (a[13] => z[21]) = 0; |
| (a[14] => z[21]) = 0; |
| (a[15] => z[21]) = 0; |
| (a[16] => z[21]) = 0; |
| (a[17] => z[21]) = 0; |
| (a[18] => z[21]) = 0; |
| (a[19] => z[21]) = 0; |
| (b[0] => z[21]) = 0; |
| (b[1] => z[21]) = 0; |
| (b[2] => z[21]) = 0; |
| (b[3] => z[21]) = 0; |
| (b[4] => z[21]) = 0; |
| (b[5] => z[21]) = 0; |
| (b[6] => z[21]) = 0; |
| (b[7] => z[21]) = 0; |
| (b[8] => z[21]) = 0; |
| (b[9] => z[21]) = 0; |
| (b[10] => z[21]) = 0; |
| (b[11] => z[21]) = 0; |
| (b[12] => z[21]) = 0; |
| (b[13] => z[21]) = 0; |
| (b[14] => z[21]) = 0; |
| (b[15] => z[21]) = 0; |
| (b[16] => z[21]) = 0; |
| (b[17] => z[21]) = 0; |
| (a[0] => z[22]) = 0; |
| (a[1] => z[22]) = 0; |
| (a[2] => z[22]) = 0; |
| (a[3] => z[22]) = 0; |
| (a[4] => z[22]) = 0; |
| (a[5] => z[22]) = 0; |
| (a[6] => z[22]) = 0; |
| (a[7] => z[22]) = 0; |
| (a[8] => z[22]) = 0; |
| (a[9] => z[22]) = 0; |
| (a[10] => z[22]) = 0; |
| (a[11] => z[22]) = 0; |
| (a[12] => z[22]) = 0; |
| (a[13] => z[22]) = 0; |
| (a[14] => z[22]) = 0; |
| (a[15] => z[22]) = 0; |
| (a[16] => z[22]) = 0; |
| (a[17] => z[22]) = 0; |
| (a[18] => z[22]) = 0; |
| (a[19] => z[22]) = 0; |
| (b[0] => z[22]) = 0; |
| (b[1] => z[22]) = 0; |
| (b[2] => z[22]) = 0; |
| (b[3] => z[22]) = 0; |
| (b[4] => z[22]) = 0; |
| (b[5] => z[22]) = 0; |
| (b[6] => z[22]) = 0; |
| (b[7] => z[22]) = 0; |
| (b[8] => z[22]) = 0; |
| (b[9] => z[22]) = 0; |
| (b[10] => z[22]) = 0; |
| (b[11] => z[22]) = 0; |
| (b[12] => z[22]) = 0; |
| (b[13] => z[22]) = 0; |
| (b[14] => z[22]) = 0; |
| (b[15] => z[22]) = 0; |
| (b[16] => z[22]) = 0; |
| (b[17] => z[22]) = 0; |
| (a[0] => z[23]) = 0; |
| (a[1] => z[23]) = 0; |
| (a[2] => z[23]) = 0; |
| (a[3] => z[23]) = 0; |
| (a[4] => z[23]) = 0; |
| (a[5] => z[23]) = 0; |
| (a[6] => z[23]) = 0; |
| (a[7] => z[23]) = 0; |
| (a[8] => z[23]) = 0; |
| (a[9] => z[23]) = 0; |
| (a[10] => z[23]) = 0; |
| (a[11] => z[23]) = 0; |
| (a[12] => z[23]) = 0; |
| (a[13] => z[23]) = 0; |
| (a[14] => z[23]) = 0; |
| (a[15] => z[23]) = 0; |
| (a[16] => z[23]) = 0; |
| (a[17] => z[23]) = 0; |
| (a[18] => z[23]) = 0; |
| (a[19] => z[23]) = 0; |
| (b[0] => z[23]) = 0; |
| (b[1] => z[23]) = 0; |
| (b[2] => z[23]) = 0; |
| (b[3] => z[23]) = 0; |
| (b[4] => z[23]) = 0; |
| (b[5] => z[23]) = 0; |
| (b[6] => z[23]) = 0; |
| (b[7] => z[23]) = 0; |
| (b[8] => z[23]) = 0; |
| (b[9] => z[23]) = 0; |
| (b[10] => z[23]) = 0; |
| (b[11] => z[23]) = 0; |
| (b[12] => z[23]) = 0; |
| (b[13] => z[23]) = 0; |
| (b[14] => z[23]) = 0; |
| (b[15] => z[23]) = 0; |
| (b[16] => z[23]) = 0; |
| (b[17] => z[23]) = 0; |
| (a[0] => z[24]) = 0; |
| (a[1] => z[24]) = 0; |
| (a[2] => z[24]) = 0; |
| (a[3] => z[24]) = 0; |
| (a[4] => z[24]) = 0; |
| (a[5] => z[24]) = 0; |
| (a[6] => z[24]) = 0; |
| (a[7] => z[24]) = 0; |
| (a[8] => z[24]) = 0; |
| (a[9] => z[24]) = 0; |
| (a[10] => z[24]) = 0; |
| (a[11] => z[24]) = 0; |
| (a[12] => z[24]) = 0; |
| (a[13] => z[24]) = 0; |
| (a[14] => z[24]) = 0; |
| (a[15] => z[24]) = 0; |
| (a[16] => z[24]) = 0; |
| (a[17] => z[24]) = 0; |
| (a[18] => z[24]) = 0; |
| (a[19] => z[24]) = 0; |
| (b[0] => z[24]) = 0; |
| (b[1] => z[24]) = 0; |
| (b[2] => z[24]) = 0; |
| (b[3] => z[24]) = 0; |
| (b[4] => z[24]) = 0; |
| (b[5] => z[24]) = 0; |
| (b[6] => z[24]) = 0; |
| (b[7] => z[24]) = 0; |
| (b[8] => z[24]) = 0; |
| (b[9] => z[24]) = 0; |
| (b[10] => z[24]) = 0; |
| (b[11] => z[24]) = 0; |
| (b[12] => z[24]) = 0; |
| (b[13] => z[24]) = 0; |
| (b[14] => z[24]) = 0; |
| (b[15] => z[24]) = 0; |
| (b[16] => z[24]) = 0; |
| (b[17] => z[24]) = 0; |
| (a[0] => z[25]) = 0; |
| (a[1] => z[25]) = 0; |
| (a[2] => z[25]) = 0; |
| (a[3] => z[25]) = 0; |
| (a[4] => z[25]) = 0; |
| (a[5] => z[25]) = 0; |
| (a[6] => z[25]) = 0; |
| (a[7] => z[25]) = 0; |
| (a[8] => z[25]) = 0; |
| (a[9] => z[25]) = 0; |
| (a[10] => z[25]) = 0; |
| (a[11] => z[25]) = 0; |
| (a[12] => z[25]) = 0; |
| (a[13] => z[25]) = 0; |
| (a[14] => z[25]) = 0; |
| (a[15] => z[25]) = 0; |
| (a[16] => z[25]) = 0; |
| (a[17] => z[25]) = 0; |
| (a[18] => z[25]) = 0; |
| (a[19] => z[25]) = 0; |
| (b[0] => z[25]) = 0; |
| (b[1] => z[25]) = 0; |
| (b[2] => z[25]) = 0; |
| (b[3] => z[25]) = 0; |
| (b[4] => z[25]) = 0; |
| (b[5] => z[25]) = 0; |
| (b[6] => z[25]) = 0; |
| (b[7] => z[25]) = 0; |
| (b[8] => z[25]) = 0; |
| (b[9] => z[25]) = 0; |
| (b[10] => z[25]) = 0; |
| (b[11] => z[25]) = 0; |
| (b[12] => z[25]) = 0; |
| (b[13] => z[25]) = 0; |
| (b[14] => z[25]) = 0; |
| (b[15] => z[25]) = 0; |
| (b[16] => z[25]) = 0; |
| (b[17] => z[25]) = 0; |
| (a[0] => z[26]) = 0; |
| (a[1] => z[26]) = 0; |
| (a[2] => z[26]) = 0; |
| (a[3] => z[26]) = 0; |
| (a[4] => z[26]) = 0; |
| (a[5] => z[26]) = 0; |
| (a[6] => z[26]) = 0; |
| (a[7] => z[26]) = 0; |
| (a[8] => z[26]) = 0; |
| (a[9] => z[26]) = 0; |
| (a[10] => z[26]) = 0; |
| (a[11] => z[26]) = 0; |
| (a[12] => z[26]) = 0; |
| (a[13] => z[26]) = 0; |
| (a[14] => z[26]) = 0; |
| (a[15] => z[26]) = 0; |
| (a[16] => z[26]) = 0; |
| (a[17] => z[26]) = 0; |
| (a[18] => z[26]) = 0; |
| (a[19] => z[26]) = 0; |
| (b[0] => z[26]) = 0; |
| (b[1] => z[26]) = 0; |
| (b[2] => z[26]) = 0; |
| (b[3] => z[26]) = 0; |
| (b[4] => z[26]) = 0; |
| (b[5] => z[26]) = 0; |
| (b[6] => z[26]) = 0; |
| (b[7] => z[26]) = 0; |
| (b[8] => z[26]) = 0; |
| (b[9] => z[26]) = 0; |
| (b[10] => z[26]) = 0; |
| (b[11] => z[26]) = 0; |
| (b[12] => z[26]) = 0; |
| (b[13] => z[26]) = 0; |
| (b[14] => z[26]) = 0; |
| (b[15] => z[26]) = 0; |
| (b[16] => z[26]) = 0; |
| (b[17] => z[26]) = 0; |
| (a[0] => z[27]) = 0; |
| (a[1] => z[27]) = 0; |
| (a[2] => z[27]) = 0; |
| (a[3] => z[27]) = 0; |
| (a[4] => z[27]) = 0; |
| (a[5] => z[27]) = 0; |
| (a[6] => z[27]) = 0; |
| (a[7] => z[27]) = 0; |
| (a[8] => z[27]) = 0; |
| (a[9] => z[27]) = 0; |
| (a[10] => z[27]) = 0; |
| (a[11] => z[27]) = 0; |
| (a[12] => z[27]) = 0; |
| (a[13] => z[27]) = 0; |
| (a[14] => z[27]) = 0; |
| (a[15] => z[27]) = 0; |
| (a[16] => z[27]) = 0; |
| (a[17] => z[27]) = 0; |
| (a[18] => z[27]) = 0; |
| (a[19] => z[27]) = 0; |
| (b[0] => z[27]) = 0; |
| (b[1] => z[27]) = 0; |
| (b[2] => z[27]) = 0; |
| (b[3] => z[27]) = 0; |
| (b[4] => z[27]) = 0; |
| (b[5] => z[27]) = 0; |
| (b[6] => z[27]) = 0; |
| (b[7] => z[27]) = 0; |
| (b[8] => z[27]) = 0; |
| (b[9] => z[27]) = 0; |
| (b[10] => z[27]) = 0; |
| (b[11] => z[27]) = 0; |
| (b[12] => z[27]) = 0; |
| (b[13] => z[27]) = 0; |
| (b[14] => z[27]) = 0; |
| (b[15] => z[27]) = 0; |
| (b[16] => z[27]) = 0; |
| (b[17] => z[27]) = 0; |
| (a[0] => z[28]) = 0; |
| (a[1] => z[28]) = 0; |
| (a[2] => z[28]) = 0; |
| (a[3] => z[28]) = 0; |
| (a[4] => z[28]) = 0; |
| (a[5] => z[28]) = 0; |
| (a[6] => z[28]) = 0; |
| (a[7] => z[28]) = 0; |
| (a[8] => z[28]) = 0; |
| (a[9] => z[28]) = 0; |
| (a[10] => z[28]) = 0; |
| (a[11] => z[28]) = 0; |
| (a[12] => z[28]) = 0; |
| (a[13] => z[28]) = 0; |
| (a[14] => z[28]) = 0; |
| (a[15] => z[28]) = 0; |
| (a[16] => z[28]) = 0; |
| (a[17] => z[28]) = 0; |
| (a[18] => z[28]) = 0; |
| (a[19] => z[28]) = 0; |
| (b[0] => z[28]) = 0; |
| (b[1] => z[28]) = 0; |
| (b[2] => z[28]) = 0; |
| (b[3] => z[28]) = 0; |
| (b[4] => z[28]) = 0; |
| (b[5] => z[28]) = 0; |
| (b[6] => z[28]) = 0; |
| (b[7] => z[28]) = 0; |
| (b[8] => z[28]) = 0; |
| (b[9] => z[28]) = 0; |
| (b[10] => z[28]) = 0; |
| (b[11] => z[28]) = 0; |
| (b[12] => z[28]) = 0; |
| (b[13] => z[28]) = 0; |
| (b[14] => z[28]) = 0; |
| (b[15] => z[28]) = 0; |
| (b[16] => z[28]) = 0; |
| (b[17] => z[28]) = 0; |
| (a[0] => z[29]) = 0; |
| (a[1] => z[29]) = 0; |
| (a[2] => z[29]) = 0; |
| (a[3] => z[29]) = 0; |
| (a[4] => z[29]) = 0; |
| (a[5] => z[29]) = 0; |
| (a[6] => z[29]) = 0; |
| (a[7] => z[29]) = 0; |
| (a[8] => z[29]) = 0; |
| (a[9] => z[29]) = 0; |
| (a[10] => z[29]) = 0; |
| (a[11] => z[29]) = 0; |
| (a[12] => z[29]) = 0; |
| (a[13] => z[29]) = 0; |
| (a[14] => z[29]) = 0; |
| (a[15] => z[29]) = 0; |
| (a[16] => z[29]) = 0; |
| (a[17] => z[29]) = 0; |
| (a[18] => z[29]) = 0; |
| (a[19] => z[29]) = 0; |
| (b[0] => z[29]) = 0; |
| (b[1] => z[29]) = 0; |
| (b[2] => z[29]) = 0; |
| (b[3] => z[29]) = 0; |
| (b[4] => z[29]) = 0; |
| (b[5] => z[29]) = 0; |
| (b[6] => z[29]) = 0; |
| (b[7] => z[29]) = 0; |
| (b[8] => z[29]) = 0; |
| (b[9] => z[29]) = 0; |
| (b[10] => z[29]) = 0; |
| (b[11] => z[29]) = 0; |
| (b[12] => z[29]) = 0; |
| (b[13] => z[29]) = 0; |
| (b[14] => z[29]) = 0; |
| (b[15] => z[29]) = 0; |
| (b[16] => z[29]) = 0; |
| (b[17] => z[29]) = 0; |
| (a[0] => z[30]) = 0; |
| (a[1] => z[30]) = 0; |
| (a[2] => z[30]) = 0; |
| (a[3] => z[30]) = 0; |
| (a[4] => z[30]) = 0; |
| (a[5] => z[30]) = 0; |
| (a[6] => z[30]) = 0; |
| (a[7] => z[30]) = 0; |
| (a[8] => z[30]) = 0; |
| (a[9] => z[30]) = 0; |
| (a[10] => z[30]) = 0; |
| (a[11] => z[30]) = 0; |
| (a[12] => z[30]) = 0; |
| (a[13] => z[30]) = 0; |
| (a[14] => z[30]) = 0; |
| (a[15] => z[30]) = 0; |
| (a[16] => z[30]) = 0; |
| (a[17] => z[30]) = 0; |
| (a[18] => z[30]) = 0; |
| (a[19] => z[30]) = 0; |
| (b[0] => z[30]) = 0; |
| (b[1] => z[30]) = 0; |
| (b[2] => z[30]) = 0; |
| (b[3] => z[30]) = 0; |
| (b[4] => z[30]) = 0; |
| (b[5] => z[30]) = 0; |
| (b[6] => z[30]) = 0; |
| (b[7] => z[30]) = 0; |
| (b[8] => z[30]) = 0; |
| (b[9] => z[30]) = 0; |
| (b[10] => z[30]) = 0; |
| (b[11] => z[30]) = 0; |
| (b[12] => z[30]) = 0; |
| (b[13] => z[30]) = 0; |
| (b[14] => z[30]) = 0; |
| (b[15] => z[30]) = 0; |
| (b[16] => z[30]) = 0; |
| (b[17] => z[30]) = 0; |
| (a[0] => z[31]) = 0; |
| (a[1] => z[31]) = 0; |
| (a[2] => z[31]) = 0; |
| (a[3] => z[31]) = 0; |
| (a[4] => z[31]) = 0; |
| (a[5] => z[31]) = 0; |
| (a[6] => z[31]) = 0; |
| (a[7] => z[31]) = 0; |
| (a[8] => z[31]) = 0; |
| (a[9] => z[31]) = 0; |
| (a[10] => z[31]) = 0; |
| (a[11] => z[31]) = 0; |
| (a[12] => z[31]) = 0; |
| (a[13] => z[31]) = 0; |
| (a[14] => z[31]) = 0; |
| (a[15] => z[31]) = 0; |
| (a[16] => z[31]) = 0; |
| (a[17] => z[31]) = 0; |
| (a[18] => z[31]) = 0; |
| (a[19] => z[31]) = 0; |
| (b[0] => z[31]) = 0; |
| (b[1] => z[31]) = 0; |
| (b[2] => z[31]) = 0; |
| (b[3] => z[31]) = 0; |
| (b[4] => z[31]) = 0; |
| (b[5] => z[31]) = 0; |
| (b[6] => z[31]) = 0; |
| (b[7] => z[31]) = 0; |
| (b[8] => z[31]) = 0; |
| (b[9] => z[31]) = 0; |
| (b[10] => z[31]) = 0; |
| (b[11] => z[31]) = 0; |
| (b[12] => z[31]) = 0; |
| (b[13] => z[31]) = 0; |
| (b[14] => z[31]) = 0; |
| (b[15] => z[31]) = 0; |
| (b[16] => z[31]) = 0; |
| (b[17] => z[31]) = 0; |
| (a[0] => z[32]) = 0; |
| (a[1] => z[32]) = 0; |
| (a[2] => z[32]) = 0; |
| (a[3] => z[32]) = 0; |
| (a[4] => z[32]) = 0; |
| (a[5] => z[32]) = 0; |
| (a[6] => z[32]) = 0; |
| (a[7] => z[32]) = 0; |
| (a[8] => z[32]) = 0; |
| (a[9] => z[32]) = 0; |
| (a[10] => z[32]) = 0; |
| (a[11] => z[32]) = 0; |
| (a[12] => z[32]) = 0; |
| (a[13] => z[32]) = 0; |
| (a[14] => z[32]) = 0; |
| (a[15] => z[32]) = 0; |
| (a[16] => z[32]) = 0; |
| (a[17] => z[32]) = 0; |
| (a[18] => z[32]) = 0; |
| (a[19] => z[32]) = 0; |
| (b[0] => z[32]) = 0; |
| (b[1] => z[32]) = 0; |
| (b[2] => z[32]) = 0; |
| (b[3] => z[32]) = 0; |
| (b[4] => z[32]) = 0; |
| (b[5] => z[32]) = 0; |
| (b[6] => z[32]) = 0; |
| (b[7] => z[32]) = 0; |
| (b[8] => z[32]) = 0; |
| (b[9] => z[32]) = 0; |
| (b[10] => z[32]) = 0; |
| (b[11] => z[32]) = 0; |
| (b[12] => z[32]) = 0; |
| (b[13] => z[32]) = 0; |
| (b[14] => z[32]) = 0; |
| (b[15] => z[32]) = 0; |
| (b[16] => z[32]) = 0; |
| (b[17] => z[32]) = 0; |
| (a[0] => z[33]) = 0; |
| (a[1] => z[33]) = 0; |
| (a[2] => z[33]) = 0; |
| (a[3] => z[33]) = 0; |
| (a[4] => z[33]) = 0; |
| (a[5] => z[33]) = 0; |
| (a[6] => z[33]) = 0; |
| (a[7] => z[33]) = 0; |
| (a[8] => z[33]) = 0; |
| (a[9] => z[33]) = 0; |
| (a[10] => z[33]) = 0; |
| (a[11] => z[33]) = 0; |
| (a[12] => z[33]) = 0; |
| (a[13] => z[33]) = 0; |
| (a[14] => z[33]) = 0; |
| (a[15] => z[33]) = 0; |
| (a[16] => z[33]) = 0; |
| (a[17] => z[33]) = 0; |
| (a[18] => z[33]) = 0; |
| (a[19] => z[33]) = 0; |
| (b[0] => z[33]) = 0; |
| (b[1] => z[33]) = 0; |
| (b[2] => z[33]) = 0; |
| (b[3] => z[33]) = 0; |
| (b[4] => z[33]) = 0; |
| (b[5] => z[33]) = 0; |
| (b[6] => z[33]) = 0; |
| (b[7] => z[33]) = 0; |
| (b[8] => z[33]) = 0; |
| (b[9] => z[33]) = 0; |
| (b[10] => z[33]) = 0; |
| (b[11] => z[33]) = 0; |
| (b[12] => z[33]) = 0; |
| (b[13] => z[33]) = 0; |
| (b[14] => z[33]) = 0; |
| (b[15] => z[33]) = 0; |
| (b[16] => z[33]) = 0; |
| (b[17] => z[33]) = 0; |
| (a[0] => z[34]) = 0; |
| (a[1] => z[34]) = 0; |
| (a[2] => z[34]) = 0; |
| (a[3] => z[34]) = 0; |
| (a[4] => z[34]) = 0; |
| (a[5] => z[34]) = 0; |
| (a[6] => z[34]) = 0; |
| (a[7] => z[34]) = 0; |
| (a[8] => z[34]) = 0; |
| (a[9] => z[34]) = 0; |
| (a[10] => z[34]) = 0; |
| (a[11] => z[34]) = 0; |
| (a[12] => z[34]) = 0; |
| (a[13] => z[34]) = 0; |
| (a[14] => z[34]) = 0; |
| (a[15] => z[34]) = 0; |
| (a[16] => z[34]) = 0; |
| (a[17] => z[34]) = 0; |
| (a[18] => z[34]) = 0; |
| (a[19] => z[34]) = 0; |
| (b[0] => z[34]) = 0; |
| (b[1] => z[34]) = 0; |
| (b[2] => z[34]) = 0; |
| (b[3] => z[34]) = 0; |
| (b[4] => z[34]) = 0; |
| (b[5] => z[34]) = 0; |
| (b[6] => z[34]) = 0; |
| (b[7] => z[34]) = 0; |
| (b[8] => z[34]) = 0; |
| (b[9] => z[34]) = 0; |
| (b[10] => z[34]) = 0; |
| (b[11] => z[34]) = 0; |
| (b[12] => z[34]) = 0; |
| (b[13] => z[34]) = 0; |
| (b[14] => z[34]) = 0; |
| (b[15] => z[34]) = 0; |
| (b[16] => z[34]) = 0; |
| (b[17] => z[34]) = 0; |
| (a[0] => z[35]) = 0; |
| (a[1] => z[35]) = 0; |
| (a[2] => z[35]) = 0; |
| (a[3] => z[35]) = 0; |
| (a[4] => z[35]) = 0; |
| (a[5] => z[35]) = 0; |
| (a[6] => z[35]) = 0; |
| (a[7] => z[35]) = 0; |
| (a[8] => z[35]) = 0; |
| (a[9] => z[35]) = 0; |
| (a[10] => z[35]) = 0; |
| (a[11] => z[35]) = 0; |
| (a[12] => z[35]) = 0; |
| (a[13] => z[35]) = 0; |
| (a[14] => z[35]) = 0; |
| (a[15] => z[35]) = 0; |
| (a[16] => z[35]) = 0; |
| (a[17] => z[35]) = 0; |
| (a[18] => z[35]) = 0; |
| (a[19] => z[35]) = 0; |
| (b[0] => z[35]) = 0; |
| (b[1] => z[35]) = 0; |
| (b[2] => z[35]) = 0; |
| (b[3] => z[35]) = 0; |
| (b[4] => z[35]) = 0; |
| (b[5] => z[35]) = 0; |
| (b[6] => z[35]) = 0; |
| (b[7] => z[35]) = 0; |
| (b[8] => z[35]) = 0; |
| (b[9] => z[35]) = 0; |
| (b[10] => z[35]) = 0; |
| (b[11] => z[35]) = 0; |
| (b[12] => z[35]) = 0; |
| (b[13] => z[35]) = 0; |
| (b[14] => z[35]) = 0; |
| (b[15] => z[35]) = 0; |
| (b[16] => z[35]) = 0; |
| (b[17] => z[35]) = 0; |
| (a[0] => z[36]) = 0; |
| (a[1] => z[36]) = 0; |
| (a[2] => z[36]) = 0; |
| (a[3] => z[36]) = 0; |
| (a[4] => z[36]) = 0; |
| (a[5] => z[36]) = 0; |
| (a[6] => z[36]) = 0; |
| (a[7] => z[36]) = 0; |
| (a[8] => z[36]) = 0; |
| (a[9] => z[36]) = 0; |
| (a[10] => z[36]) = 0; |
| (a[11] => z[36]) = 0; |
| (a[12] => z[36]) = 0; |
| (a[13] => z[36]) = 0; |
| (a[14] => z[36]) = 0; |
| (a[15] => z[36]) = 0; |
| (a[16] => z[36]) = 0; |
| (a[17] => z[36]) = 0; |
| (a[18] => z[36]) = 0; |
| (a[19] => z[36]) = 0; |
| (b[0] => z[36]) = 0; |
| (b[1] => z[36]) = 0; |
| (b[2] => z[36]) = 0; |
| (b[3] => z[36]) = 0; |
| (b[4] => z[36]) = 0; |
| (b[5] => z[36]) = 0; |
| (b[6] => z[36]) = 0; |
| (b[7] => z[36]) = 0; |
| (b[8] => z[36]) = 0; |
| (b[9] => z[36]) = 0; |
| (b[10] => z[36]) = 0; |
| (b[11] => z[36]) = 0; |
| (b[12] => z[36]) = 0; |
| (b[13] => z[36]) = 0; |
| (b[14] => z[36]) = 0; |
| (b[15] => z[36]) = 0; |
| (b[16] => z[36]) = 0; |
| (b[17] => z[36]) = 0; |
| (a[0] => z[37]) = 0; |
| (a[1] => z[37]) = 0; |
| (a[2] => z[37]) = 0; |
| (a[3] => z[37]) = 0; |
| (a[4] => z[37]) = 0; |
| (a[5] => z[37]) = 0; |
| (a[6] => z[37]) = 0; |
| (a[7] => z[37]) = 0; |
| (a[8] => z[37]) = 0; |
| (a[9] => z[37]) = 0; |
| (a[10] => z[37]) = 0; |
| (a[11] => z[37]) = 0; |
| (a[12] => z[37]) = 0; |
| (a[13] => z[37]) = 0; |
| (a[14] => z[37]) = 0; |
| (a[15] => z[37]) = 0; |
| (a[16] => z[37]) = 0; |
| (a[17] => z[37]) = 0; |
| (a[18] => z[37]) = 0; |
| (a[19] => z[37]) = 0; |
| (b[0] => z[37]) = 0; |
| (b[1] => z[37]) = 0; |
| (b[2] => z[37]) = 0; |
| (b[3] => z[37]) = 0; |
| (b[4] => z[37]) = 0; |
| (b[5] => z[37]) = 0; |
| (b[6] => z[37]) = 0; |
| (b[7] => z[37]) = 0; |
| (b[8] => z[37]) = 0; |
| (b[9] => z[37]) = 0; |
| (b[10] => z[37]) = 0; |
| (b[11] => z[37]) = 0; |
| (b[12] => z[37]) = 0; |
| (b[13] => z[37]) = 0; |
| (b[14] => z[37]) = 0; |
| (b[15] => z[37]) = 0; |
| (b[16] => z[37]) = 0; |
| (b[17] => z[37]) = 0; |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULT_REGIN ( // TODO: Name subject to change |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [2:0] feedback, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [2:0] output_select, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .acc_fir(6'b0), |
| .z(z), |
| .dly_b(), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .load_acc(1'b0), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| |
| .output_select(output_select), // unregistered output: a * b (0) |
| .saturate_enable(1'b0), |
| .shift_right(6'b0), |
| .round(1'b0), |
| .subtract(1'b0), |
| .register_inputs(register_inputs) // registered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (posedge clk => (z +: a)) = 0; |
| (posedge clk => (z +: b)) = 0; |
| $setuphold(posedge clk, a, 0, 0); |
| $setuphold(posedge clk, b, 0, 0); |
| $setuphold(posedge clk, feedback, 0, 0); |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULT_REGOUT ( // TODO: Name subject to change |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [2:0] feedback, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire f_mode, |
| input wire [2:0] output_select, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .acc_fir(6'b0), |
| .z(z), |
| .dly_b(), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .load_acc(1'b0), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| |
| .output_select(output_select), // registered output: a * b (4) |
| .saturate_enable(1'b0), |
| .shift_right(6'b0), |
| .round(1'b0), |
| .subtract(1'b0), |
| .register_inputs(register_inputs) // unregistered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (posedge clk => (z +: a)) = 0; |
| (posedge clk => (z +: b)) = 0; |
| $setuphold(posedge clk, a, 0, 0); |
| $setuphold(posedge clk, b, 0, 0); |
| $setuphold(posedge clk, feedback, 0, 0); |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULT_REGIN_REGOUT ( // TODO: Name subject to change |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [2:0] feedback, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire f_mode, |
| input wire [2:0] output_select, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .acc_fir(6'b0), |
| .z(z), |
| .dly_b(), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .load_acc(1'b0), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| |
| .output_select(output_select), // registered output: a * b (4) |
| .saturate_enable(1'b0), |
| .shift_right(6'b0), |
| .round(1'b0), |
| .subtract(1'b0), |
| .register_inputs(register_inputs) // registered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (posedge clk => (z +: a)) = 0; |
| (posedge clk => (z +: b)) = 0; |
| $setuphold(posedge clk, a, 0, 0); |
| $setuphold(posedge clk, b, 0, 0); |
| $setuphold(posedge clk, feedback, 0, 0); |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULTADD ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire [ 5:0] acc_fir, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [ 2:0] output_select, |
| input wire saturate_enable, |
| input wire [ 5:0] shift_right, |
| input wire round, |
| input wire subtract, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .dly_b(), |
| .z(z), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .acc_fir(acc_fir), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| //.clk(1'b0), |
| .reset(reset), |
| |
| .output_select(output_select), // unregistered output: ACCin (2, 3) |
| .saturate_enable(saturate_enable), |
| .shift_right(shift_right), |
| .round(round), |
| .subtract(subtract), |
| .register_inputs(register_inputs) // unregistered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (a[0] => z[0]) = 0; |
| (a[1] => z[0]) = 0; |
| (a[2] => z[0]) = 0; |
| (a[3] => z[0]) = 0; |
| (a[4] => z[0]) = 0; |
| (a[5] => z[0]) = 0; |
| (a[6] => z[0]) = 0; |
| (a[7] => z[0]) = 0; |
| (a[8] => z[0]) = 0; |
| (a[9] => z[0]) = 0; |
| (a[10] => z[0]) = 0; |
| (a[11] => z[0]) = 0; |
| (a[12] => z[0]) = 0; |
| (a[13] => z[0]) = 0; |
| (a[14] => z[0]) = 0; |
| (a[15] => z[0]) = 0; |
| (a[16] => z[0]) = 0; |
| (a[17] => z[0]) = 0; |
| (a[18] => z[0]) = 0; |
| (a[19] => z[0]) = 0; |
| (b[0] => z[0]) = 0; |
| (b[1] => z[0]) = 0; |
| (b[2] => z[0]) = 0; |
| (b[3] => z[0]) = 0; |
| (b[4] => z[0]) = 0; |
| (b[5] => z[0]) = 0; |
| (b[6] => z[0]) = 0; |
| (b[7] => z[0]) = 0; |
| (b[8] => z[0]) = 0; |
| (b[9] => z[0]) = 0; |
| (b[10] => z[0]) = 0; |
| (b[11] => z[0]) = 0; |
| (b[12] => z[0]) = 0; |
| (b[13] => z[0]) = 0; |
| (b[14] => z[0]) = 0; |
| (b[15] => z[0]) = 0; |
| (b[16] => z[0]) = 0; |
| (b[17] => z[0]) = 0; |
| (a[0] => z[1]) = 0; |
| (a[1] => z[1]) = 0; |
| (a[2] => z[1]) = 0; |
| (a[3] => z[1]) = 0; |
| (a[4] => z[1]) = 0; |
| (a[5] => z[1]) = 0; |
| (a[6] => z[1]) = 0; |
| (a[7] => z[1]) = 0; |
| (a[8] => z[1]) = 0; |
| (a[9] => z[1]) = 0; |
| (a[10] => z[1]) = 0; |
| (a[11] => z[1]) = 0; |
| (a[12] => z[1]) = 0; |
| (a[13] => z[1]) = 0; |
| (a[14] => z[1]) = 0; |
| (a[15] => z[1]) = 0; |
| (a[16] => z[1]) = 0; |
| (a[17] => z[1]) = 0; |
| (a[18] => z[1]) = 0; |
| (a[19] => z[1]) = 0; |
| (b[0] => z[1]) = 0; |
| (b[1] => z[1]) = 0; |
| (b[2] => z[1]) = 0; |
| (b[3] => z[1]) = 0; |
| (b[4] => z[1]) = 0; |
| (b[5] => z[1]) = 0; |
| (b[6] => z[1]) = 0; |
| (b[7] => z[1]) = 0; |
| (b[8] => z[1]) = 0; |
| (b[9] => z[1]) = 0; |
| (b[10] => z[1]) = 0; |
| (b[11] => z[1]) = 0; |
| (b[12] => z[1]) = 0; |
| (b[13] => z[1]) = 0; |
| (b[14] => z[1]) = 0; |
| (b[15] => z[1]) = 0; |
| (b[16] => z[1]) = 0; |
| (b[17] => z[1]) = 0; |
| (a[0] => z[2]) = 0; |
| (a[1] => z[2]) = 0; |
| (a[2] => z[2]) = 0; |
| (a[3] => z[2]) = 0; |
| (a[4] => z[2]) = 0; |
| (a[5] => z[2]) = 0; |
| (a[6] => z[2]) = 0; |
| (a[7] => z[2]) = 0; |
| (a[8] => z[2]) = 0; |
| (a[9] => z[2]) = 0; |
| (a[10] => z[2]) = 0; |
| (a[11] => z[2]) = 0; |
| (a[12] => z[2]) = 0; |
| (a[13] => z[2]) = 0; |
| (a[14] => z[2]) = 0; |
| (a[15] => z[2]) = 0; |
| (a[16] => z[2]) = 0; |
| (a[17] => z[2]) = 0; |
| (a[18] => z[2]) = 0; |
| (a[19] => z[2]) = 0; |
| (b[0] => z[2]) = 0; |
| (b[1] => z[2]) = 0; |
| (b[2] => z[2]) = 0; |
| (b[3] => z[2]) = 0; |
| (b[4] => z[2]) = 0; |
| (b[5] => z[2]) = 0; |
| (b[6] => z[2]) = 0; |
| (b[7] => z[2]) = 0; |
| (b[8] => z[2]) = 0; |
| (b[9] => z[2]) = 0; |
| (b[10] => z[2]) = 0; |
| (b[11] => z[2]) = 0; |
| (b[12] => z[2]) = 0; |
| (b[13] => z[2]) = 0; |
| (b[14] => z[2]) = 0; |
| (b[15] => z[2]) = 0; |
| (b[16] => z[2]) = 0; |
| (b[17] => z[2]) = 0; |
| (a[0] => z[3]) = 0; |
| (a[1] => z[3]) = 0; |
| (a[2] => z[3]) = 0; |
| (a[3] => z[3]) = 0; |
| (a[4] => z[3]) = 0; |
| (a[5] => z[3]) = 0; |
| (a[6] => z[3]) = 0; |
| (a[7] => z[3]) = 0; |
| (a[8] => z[3]) = 0; |
| (a[9] => z[3]) = 0; |
| (a[10] => z[3]) = 0; |
| (a[11] => z[3]) = 0; |
| (a[12] => z[3]) = 0; |
| (a[13] => z[3]) = 0; |
| (a[14] => z[3]) = 0; |
| (a[15] => z[3]) = 0; |
| (a[16] => z[3]) = 0; |
| (a[17] => z[3]) = 0; |
| (a[18] => z[3]) = 0; |
| (a[19] => z[3]) = 0; |
| (b[0] => z[3]) = 0; |
| (b[1] => z[3]) = 0; |
| (b[2] => z[3]) = 0; |
| (b[3] => z[3]) = 0; |
| (b[4] => z[3]) = 0; |
| (b[5] => z[3]) = 0; |
| (b[6] => z[3]) = 0; |
| (b[7] => z[3]) = 0; |
| (b[8] => z[3]) = 0; |
| (b[9] => z[3]) = 0; |
| (b[10] => z[3]) = 0; |
| (b[11] => z[3]) = 0; |
| (b[12] => z[3]) = 0; |
| (b[13] => z[3]) = 0; |
| (b[14] => z[3]) = 0; |
| (b[15] => z[3]) = 0; |
| (b[16] => z[3]) = 0; |
| (b[17] => z[3]) = 0; |
| (a[0] => z[4]) = 0; |
| (a[1] => z[4]) = 0; |
| (a[2] => z[4]) = 0; |
| (a[3] => z[4]) = 0; |
| (a[4] => z[4]) = 0; |
| (a[5] => z[4]) = 0; |
| (a[6] => z[4]) = 0; |
| (a[7] => z[4]) = 0; |
| (a[8] => z[4]) = 0; |
| (a[9] => z[4]) = 0; |
| (a[10] => z[4]) = 0; |
| (a[11] => z[4]) = 0; |
| (a[12] => z[4]) = 0; |
| (a[13] => z[4]) = 0; |
| (a[14] => z[4]) = 0; |
| (a[15] => z[4]) = 0; |
| (a[16] => z[4]) = 0; |
| (a[17] => z[4]) = 0; |
| (a[18] => z[4]) = 0; |
| (a[19] => z[4]) = 0; |
| (b[0] => z[4]) = 0; |
| (b[1] => z[4]) = 0; |
| (b[2] => z[4]) = 0; |
| (b[3] => z[4]) = 0; |
| (b[4] => z[4]) = 0; |
| (b[5] => z[4]) = 0; |
| (b[6] => z[4]) = 0; |
| (b[7] => z[4]) = 0; |
| (b[8] => z[4]) = 0; |
| (b[9] => z[4]) = 0; |
| (b[10] => z[4]) = 0; |
| (b[11] => z[4]) = 0; |
| (b[12] => z[4]) = 0; |
| (b[13] => z[4]) = 0; |
| (b[14] => z[4]) = 0; |
| (b[15] => z[4]) = 0; |
| (b[16] => z[4]) = 0; |
| (b[17] => z[4]) = 0; |
| (a[0] => z[5]) = 0; |
| (a[1] => z[5]) = 0; |
| (a[2] => z[5]) = 0; |
| (a[3] => z[5]) = 0; |
| (a[4] => z[5]) = 0; |
| (a[5] => z[5]) = 0; |
| (a[6] => z[5]) = 0; |
| (a[7] => z[5]) = 0; |
| (a[8] => z[5]) = 0; |
| (a[9] => z[5]) = 0; |
| (a[10] => z[5]) = 0; |
| (a[11] => z[5]) = 0; |
| (a[12] => z[5]) = 0; |
| (a[13] => z[5]) = 0; |
| (a[14] => z[5]) = 0; |
| (a[15] => z[5]) = 0; |
| (a[16] => z[5]) = 0; |
| (a[17] => z[5]) = 0; |
| (a[18] => z[5]) = 0; |
| (a[19] => z[5]) = 0; |
| (b[0] => z[5]) = 0; |
| (b[1] => z[5]) = 0; |
| (b[2] => z[5]) = 0; |
| (b[3] => z[5]) = 0; |
| (b[4] => z[5]) = 0; |
| (b[5] => z[5]) = 0; |
| (b[6] => z[5]) = 0; |
| (b[7] => z[5]) = 0; |
| (b[8] => z[5]) = 0; |
| (b[9] => z[5]) = 0; |
| (b[10] => z[5]) = 0; |
| (b[11] => z[5]) = 0; |
| (b[12] => z[5]) = 0; |
| (b[13] => z[5]) = 0; |
| (b[14] => z[5]) = 0; |
| (b[15] => z[5]) = 0; |
| (b[16] => z[5]) = 0; |
| (b[17] => z[5]) = 0; |
| (a[0] => z[6]) = 0; |
| (a[1] => z[6]) = 0; |
| (a[2] => z[6]) = 0; |
| (a[3] => z[6]) = 0; |
| (a[4] => z[6]) = 0; |
| (a[5] => z[6]) = 0; |
| (a[6] => z[6]) = 0; |
| (a[7] => z[6]) = 0; |
| (a[8] => z[6]) = 0; |
| (a[9] => z[6]) = 0; |
| (a[10] => z[6]) = 0; |
| (a[11] => z[6]) = 0; |
| (a[12] => z[6]) = 0; |
| (a[13] => z[6]) = 0; |
| (a[14] => z[6]) = 0; |
| (a[15] => z[6]) = 0; |
| (a[16] => z[6]) = 0; |
| (a[17] => z[6]) = 0; |
| (a[18] => z[6]) = 0; |
| (a[19] => z[6]) = 0; |
| (b[0] => z[6]) = 0; |
| (b[1] => z[6]) = 0; |
| (b[2] => z[6]) = 0; |
| (b[3] => z[6]) = 0; |
| (b[4] => z[6]) = 0; |
| (b[5] => z[6]) = 0; |
| (b[6] => z[6]) = 0; |
| (b[7] => z[6]) = 0; |
| (b[8] => z[6]) = 0; |
| (b[9] => z[6]) = 0; |
| (b[10] => z[6]) = 0; |
| (b[11] => z[6]) = 0; |
| (b[12] => z[6]) = 0; |
| (b[13] => z[6]) = 0; |
| (b[14] => z[6]) = 0; |
| (b[15] => z[6]) = 0; |
| (b[16] => z[6]) = 0; |
| (b[17] => z[6]) = 0; |
| (a[0] => z[7]) = 0; |
| (a[1] => z[7]) = 0; |
| (a[2] => z[7]) = 0; |
| (a[3] => z[7]) = 0; |
| (a[4] => z[7]) = 0; |
| (a[5] => z[7]) = 0; |
| (a[6] => z[7]) = 0; |
| (a[7] => z[7]) = 0; |
| (a[8] => z[7]) = 0; |
| (a[9] => z[7]) = 0; |
| (a[10] => z[7]) = 0; |
| (a[11] => z[7]) = 0; |
| (a[12] => z[7]) = 0; |
| (a[13] => z[7]) = 0; |
| (a[14] => z[7]) = 0; |
| (a[15] => z[7]) = 0; |
| (a[16] => z[7]) = 0; |
| (a[17] => z[7]) = 0; |
| (a[18] => z[7]) = 0; |
| (a[19] => z[7]) = 0; |
| (b[0] => z[7]) = 0; |
| (b[1] => z[7]) = 0; |
| (b[2] => z[7]) = 0; |
| (b[3] => z[7]) = 0; |
| (b[4] => z[7]) = 0; |
| (b[5] => z[7]) = 0; |
| (b[6] => z[7]) = 0; |
| (b[7] => z[7]) = 0; |
| (b[8] => z[7]) = 0; |
| (b[9] => z[7]) = 0; |
| (b[10] => z[7]) = 0; |
| (b[11] => z[7]) = 0; |
| (b[12] => z[7]) = 0; |
| (b[13] => z[7]) = 0; |
| (b[14] => z[7]) = 0; |
| (b[15] => z[7]) = 0; |
| (b[16] => z[7]) = 0; |
| (b[17] => z[7]) = 0; |
| (a[0] => z[8]) = 0; |
| (a[1] => z[8]) = 0; |
| (a[2] => z[8]) = 0; |
| (a[3] => z[8]) = 0; |
| (a[4] => z[8]) = 0; |
| (a[5] => z[8]) = 0; |
| (a[6] => z[8]) = 0; |
| (a[7] => z[8]) = 0; |
| (a[8] => z[8]) = 0; |
| (a[9] => z[8]) = 0; |
| (a[10] => z[8]) = 0; |
| (a[11] => z[8]) = 0; |
| (a[12] => z[8]) = 0; |
| (a[13] => z[8]) = 0; |
| (a[14] => z[8]) = 0; |
| (a[15] => z[8]) = 0; |
| (a[16] => z[8]) = 0; |
| (a[17] => z[8]) = 0; |
| (a[18] => z[8]) = 0; |
| (a[19] => z[8]) = 0; |
| (b[0] => z[8]) = 0; |
| (b[1] => z[8]) = 0; |
| (b[2] => z[8]) = 0; |
| (b[3] => z[8]) = 0; |
| (b[4] => z[8]) = 0; |
| (b[5] => z[8]) = 0; |
| (b[6] => z[8]) = 0; |
| (b[7] => z[8]) = 0; |
| (b[8] => z[8]) = 0; |
| (b[9] => z[8]) = 0; |
| (b[10] => z[8]) = 0; |
| (b[11] => z[8]) = 0; |
| (b[12] => z[8]) = 0; |
| (b[13] => z[8]) = 0; |
| (b[14] => z[8]) = 0; |
| (b[15] => z[8]) = 0; |
| (b[16] => z[8]) = 0; |
| (b[17] => z[8]) = 0; |
| (a[0] => z[9]) = 0; |
| (a[1] => z[9]) = 0; |
| (a[2] => z[9]) = 0; |
| (a[3] => z[9]) = 0; |
| (a[4] => z[9]) = 0; |
| (a[5] => z[9]) = 0; |
| (a[6] => z[9]) = 0; |
| (a[7] => z[9]) = 0; |
| (a[8] => z[9]) = 0; |
| (a[9] => z[9]) = 0; |
| (a[10] => z[9]) = 0; |
| (a[11] => z[9]) = 0; |
| (a[12] => z[9]) = 0; |
| (a[13] => z[9]) = 0; |
| (a[14] => z[9]) = 0; |
| (a[15] => z[9]) = 0; |
| (a[16] => z[9]) = 0; |
| (a[17] => z[9]) = 0; |
| (a[18] => z[9]) = 0; |
| (a[19] => z[9]) = 0; |
| (b[0] => z[9]) = 0; |
| (b[1] => z[9]) = 0; |
| (b[2] => z[9]) = 0; |
| (b[3] => z[9]) = 0; |
| (b[4] => z[9]) = 0; |
| (b[5] => z[9]) = 0; |
| (b[6] => z[9]) = 0; |
| (b[7] => z[9]) = 0; |
| (b[8] => z[9]) = 0; |
| (b[9] => z[9]) = 0; |
| (b[10] => z[9]) = 0; |
| (b[11] => z[9]) = 0; |
| (b[12] => z[9]) = 0; |
| (b[13] => z[9]) = 0; |
| (b[14] => z[9]) = 0; |
| (b[15] => z[9]) = 0; |
| (b[16] => z[9]) = 0; |
| (b[17] => z[9]) = 0; |
| (a[0] => z[10]) = 0; |
| (a[1] => z[10]) = 0; |
| (a[2] => z[10]) = 0; |
| (a[3] => z[10]) = 0; |
| (a[4] => z[10]) = 0; |
| (a[5] => z[10]) = 0; |
| (a[6] => z[10]) = 0; |
| (a[7] => z[10]) = 0; |
| (a[8] => z[10]) = 0; |
| (a[9] => z[10]) = 0; |
| (a[10] => z[10]) = 0; |
| (a[11] => z[10]) = 0; |
| (a[12] => z[10]) = 0; |
| (a[13] => z[10]) = 0; |
| (a[14] => z[10]) = 0; |
| (a[15] => z[10]) = 0; |
| (a[16] => z[10]) = 0; |
| (a[17] => z[10]) = 0; |
| (a[18] => z[10]) = 0; |
| (a[19] => z[10]) = 0; |
| (b[0] => z[10]) = 0; |
| (b[1] => z[10]) = 0; |
| (b[2] => z[10]) = 0; |
| (b[3] => z[10]) = 0; |
| (b[4] => z[10]) = 0; |
| (b[5] => z[10]) = 0; |
| (b[6] => z[10]) = 0; |
| (b[7] => z[10]) = 0; |
| (b[8] => z[10]) = 0; |
| (b[9] => z[10]) = 0; |
| (b[10] => z[10]) = 0; |
| (b[11] => z[10]) = 0; |
| (b[12] => z[10]) = 0; |
| (b[13] => z[10]) = 0; |
| (b[14] => z[10]) = 0; |
| (b[15] => z[10]) = 0; |
| (b[16] => z[10]) = 0; |
| (b[17] => z[10]) = 0; |
| (a[0] => z[11]) = 0; |
| (a[1] => z[11]) = 0; |
| (a[2] => z[11]) = 0; |
| (a[3] => z[11]) = 0; |
| (a[4] => z[11]) = 0; |
| (a[5] => z[11]) = 0; |
| (a[6] => z[11]) = 0; |
| (a[7] => z[11]) = 0; |
| (a[8] => z[11]) = 0; |
| (a[9] => z[11]) = 0; |
| (a[10] => z[11]) = 0; |
| (a[11] => z[11]) = 0; |
| (a[12] => z[11]) = 0; |
| (a[13] => z[11]) = 0; |
| (a[14] => z[11]) = 0; |
| (a[15] => z[11]) = 0; |
| (a[16] => z[11]) = 0; |
| (a[17] => z[11]) = 0; |
| (a[18] => z[11]) = 0; |
| (a[19] => z[11]) = 0; |
| (b[0] => z[11]) = 0; |
| (b[1] => z[11]) = 0; |
| (b[2] => z[11]) = 0; |
| (b[3] => z[11]) = 0; |
| (b[4] => z[11]) = 0; |
| (b[5] => z[11]) = 0; |
| (b[6] => z[11]) = 0; |
| (b[7] => z[11]) = 0; |
| (b[8] => z[11]) = 0; |
| (b[9] => z[11]) = 0; |
| (b[10] => z[11]) = 0; |
| (b[11] => z[11]) = 0; |
| (b[12] => z[11]) = 0; |
| (b[13] => z[11]) = 0; |
| (b[14] => z[11]) = 0; |
| (b[15] => z[11]) = 0; |
| (b[16] => z[11]) = 0; |
| (b[17] => z[11]) = 0; |
| (a[0] => z[12]) = 0; |
| (a[1] => z[12]) = 0; |
| (a[2] => z[12]) = 0; |
| (a[3] => z[12]) = 0; |
| (a[4] => z[12]) = 0; |
| (a[5] => z[12]) = 0; |
| (a[6] => z[12]) = 0; |
| (a[7] => z[12]) = 0; |
| (a[8] => z[12]) = 0; |
| (a[9] => z[12]) = 0; |
| (a[10] => z[12]) = 0; |
| (a[11] => z[12]) = 0; |
| (a[12] => z[12]) = 0; |
| (a[13] => z[12]) = 0; |
| (a[14] => z[12]) = 0; |
| (a[15] => z[12]) = 0; |
| (a[16] => z[12]) = 0; |
| (a[17] => z[12]) = 0; |
| (a[18] => z[12]) = 0; |
| (a[19] => z[12]) = 0; |
| (b[0] => z[12]) = 0; |
| (b[1] => z[12]) = 0; |
| (b[2] => z[12]) = 0; |
| (b[3] => z[12]) = 0; |
| (b[4] => z[12]) = 0; |
| (b[5] => z[12]) = 0; |
| (b[6] => z[12]) = 0; |
| (b[7] => z[12]) = 0; |
| (b[8] => z[12]) = 0; |
| (b[9] => z[12]) = 0; |
| (b[10] => z[12]) = 0; |
| (b[11] => z[12]) = 0; |
| (b[12] => z[12]) = 0; |
| (b[13] => z[12]) = 0; |
| (b[14] => z[12]) = 0; |
| (b[15] => z[12]) = 0; |
| (b[16] => z[12]) = 0; |
| (b[17] => z[12]) = 0; |
| (a[0] => z[13]) = 0; |
| (a[1] => z[13]) = 0; |
| (a[2] => z[13]) = 0; |
| (a[3] => z[13]) = 0; |
| (a[4] => z[13]) = 0; |
| (a[5] => z[13]) = 0; |
| (a[6] => z[13]) = 0; |
| (a[7] => z[13]) = 0; |
| (a[8] => z[13]) = 0; |
| (a[9] => z[13]) = 0; |
| (a[10] => z[13]) = 0; |
| (a[11] => z[13]) = 0; |
| (a[12] => z[13]) = 0; |
| (a[13] => z[13]) = 0; |
| (a[14] => z[13]) = 0; |
| (a[15] => z[13]) = 0; |
| (a[16] => z[13]) = 0; |
| (a[17] => z[13]) = 0; |
| (a[18] => z[13]) = 0; |
| (a[19] => z[13]) = 0; |
| (b[0] => z[13]) = 0; |
| (b[1] => z[13]) = 0; |
| (b[2] => z[13]) = 0; |
| (b[3] => z[13]) = 0; |
| (b[4] => z[13]) = 0; |
| (b[5] => z[13]) = 0; |
| (b[6] => z[13]) = 0; |
| (b[7] => z[13]) = 0; |
| (b[8] => z[13]) = 0; |
| (b[9] => z[13]) = 0; |
| (b[10] => z[13]) = 0; |
| (b[11] => z[13]) = 0; |
| (b[12] => z[13]) = 0; |
| (b[13] => z[13]) = 0; |
| (b[14] => z[13]) = 0; |
| (b[15] => z[13]) = 0; |
| (b[16] => z[13]) = 0; |
| (b[17] => z[13]) = 0; |
| (a[0] => z[14]) = 0; |
| (a[1] => z[14]) = 0; |
| (a[2] => z[14]) = 0; |
| (a[3] => z[14]) = 0; |
| (a[4] => z[14]) = 0; |
| (a[5] => z[14]) = 0; |
| (a[6] => z[14]) = 0; |
| (a[7] => z[14]) = 0; |
| (a[8] => z[14]) = 0; |
| (a[9] => z[14]) = 0; |
| (a[10] => z[14]) = 0; |
| (a[11] => z[14]) = 0; |
| (a[12] => z[14]) = 0; |
| (a[13] => z[14]) = 0; |
| (a[14] => z[14]) = 0; |
| (a[15] => z[14]) = 0; |
| (a[16] => z[14]) = 0; |
| (a[17] => z[14]) = 0; |
| (a[18] => z[14]) = 0; |
| (a[19] => z[14]) = 0; |
| (b[0] => z[14]) = 0; |
| (b[1] => z[14]) = 0; |
| (b[2] => z[14]) = 0; |
| (b[3] => z[14]) = 0; |
| (b[4] => z[14]) = 0; |
| (b[5] => z[14]) = 0; |
| (b[6] => z[14]) = 0; |
| (b[7] => z[14]) = 0; |
| (b[8] => z[14]) = 0; |
| (b[9] => z[14]) = 0; |
| (b[10] => z[14]) = 0; |
| (b[11] => z[14]) = 0; |
| (b[12] => z[14]) = 0; |
| (b[13] => z[14]) = 0; |
| (b[14] => z[14]) = 0; |
| (b[15] => z[14]) = 0; |
| (b[16] => z[14]) = 0; |
| (b[17] => z[14]) = 0; |
| (a[0] => z[15]) = 0; |
| (a[1] => z[15]) = 0; |
| (a[2] => z[15]) = 0; |
| (a[3] => z[15]) = 0; |
| (a[4] => z[15]) = 0; |
| (a[5] => z[15]) = 0; |
| (a[6] => z[15]) = 0; |
| (a[7] => z[15]) = 0; |
| (a[8] => z[15]) = 0; |
| (a[9] => z[15]) = 0; |
| (a[10] => z[15]) = 0; |
| (a[11] => z[15]) = 0; |
| (a[12] => z[15]) = 0; |
| (a[13] => z[15]) = 0; |
| (a[14] => z[15]) = 0; |
| (a[15] => z[15]) = 0; |
| (a[16] => z[15]) = 0; |
| (a[17] => z[15]) = 0; |
| (a[18] => z[15]) = 0; |
| (a[19] => z[15]) = 0; |
| (b[0] => z[15]) = 0; |
| (b[1] => z[15]) = 0; |
| (b[2] => z[15]) = 0; |
| (b[3] => z[15]) = 0; |
| (b[4] => z[15]) = 0; |
| (b[5] => z[15]) = 0; |
| (b[6] => z[15]) = 0; |
| (b[7] => z[15]) = 0; |
| (b[8] => z[15]) = 0; |
| (b[9] => z[15]) = 0; |
| (b[10] => z[15]) = 0; |
| (b[11] => z[15]) = 0; |
| (b[12] => z[15]) = 0; |
| (b[13] => z[15]) = 0; |
| (b[14] => z[15]) = 0; |
| (b[15] => z[15]) = 0; |
| (b[16] => z[15]) = 0; |
| (b[17] => z[15]) = 0; |
| (a[0] => z[16]) = 0; |
| (a[1] => z[16]) = 0; |
| (a[2] => z[16]) = 0; |
| (a[3] => z[16]) = 0; |
| (a[4] => z[16]) = 0; |
| (a[5] => z[16]) = 0; |
| (a[6] => z[16]) = 0; |
| (a[7] => z[16]) = 0; |
| (a[8] => z[16]) = 0; |
| (a[9] => z[16]) = 0; |
| (a[10] => z[16]) = 0; |
| (a[11] => z[16]) = 0; |
| (a[12] => z[16]) = 0; |
| (a[13] => z[16]) = 0; |
| (a[14] => z[16]) = 0; |
| (a[15] => z[16]) = 0; |
| (a[16] => z[16]) = 0; |
| (a[17] => z[16]) = 0; |
| (a[18] => z[16]) = 0; |
| (a[19] => z[16]) = 0; |
| (b[0] => z[16]) = 0; |
| (b[1] => z[16]) = 0; |
| (b[2] => z[16]) = 0; |
| (b[3] => z[16]) = 0; |
| (b[4] => z[16]) = 0; |
| (b[5] => z[16]) = 0; |
| (b[6] => z[16]) = 0; |
| (b[7] => z[16]) = 0; |
| (b[8] => z[16]) = 0; |
| (b[9] => z[16]) = 0; |
| (b[10] => z[16]) = 0; |
| (b[11] => z[16]) = 0; |
| (b[12] => z[16]) = 0; |
| (b[13] => z[16]) = 0; |
| (b[14] => z[16]) = 0; |
| (b[15] => z[16]) = 0; |
| (b[16] => z[16]) = 0; |
| (b[17] => z[16]) = 0; |
| (a[0] => z[17]) = 0; |
| (a[1] => z[17]) = 0; |
| (a[2] => z[17]) = 0; |
| (a[3] => z[17]) = 0; |
| (a[4] => z[17]) = 0; |
| (a[5] => z[17]) = 0; |
| (a[6] => z[17]) = 0; |
| (a[7] => z[17]) = 0; |
| (a[8] => z[17]) = 0; |
| (a[9] => z[17]) = 0; |
| (a[10] => z[17]) = 0; |
| (a[11] => z[17]) = 0; |
| (a[12] => z[17]) = 0; |
| (a[13] => z[17]) = 0; |
| (a[14] => z[17]) = 0; |
| (a[15] => z[17]) = 0; |
| (a[16] => z[17]) = 0; |
| (a[17] => z[17]) = 0; |
| (a[18] => z[17]) = 0; |
| (a[19] => z[17]) = 0; |
| (b[0] => z[17]) = 0; |
| (b[1] => z[17]) = 0; |
| (b[2] => z[17]) = 0; |
| (b[3] => z[17]) = 0; |
| (b[4] => z[17]) = 0; |
| (b[5] => z[17]) = 0; |
| (b[6] => z[17]) = 0; |
| (b[7] => z[17]) = 0; |
| (b[8] => z[17]) = 0; |
| (b[9] => z[17]) = 0; |
| (b[10] => z[17]) = 0; |
| (b[11] => z[17]) = 0; |
| (b[12] => z[17]) = 0; |
| (b[13] => z[17]) = 0; |
| (b[14] => z[17]) = 0; |
| (b[15] => z[17]) = 0; |
| (b[16] => z[17]) = 0; |
| (b[17] => z[17]) = 0; |
| (a[0] => z[18]) = 0; |
| (a[1] => z[18]) = 0; |
| (a[2] => z[18]) = 0; |
| (a[3] => z[18]) = 0; |
| (a[4] => z[18]) = 0; |
| (a[5] => z[18]) = 0; |
| (a[6] => z[18]) = 0; |
| (a[7] => z[18]) = 0; |
| (a[8] => z[18]) = 0; |
| (a[9] => z[18]) = 0; |
| (a[10] => z[18]) = 0; |
| (a[11] => z[18]) = 0; |
| (a[12] => z[18]) = 0; |
| (a[13] => z[18]) = 0; |
| (a[14] => z[18]) = 0; |
| (a[15] => z[18]) = 0; |
| (a[16] => z[18]) = 0; |
| (a[17] => z[18]) = 0; |
| (a[18] => z[18]) = 0; |
| (a[19] => z[18]) = 0; |
| (b[0] => z[18]) = 0; |
| (b[1] => z[18]) = 0; |
| (b[2] => z[18]) = 0; |
| (b[3] => z[18]) = 0; |
| (b[4] => z[18]) = 0; |
| (b[5] => z[18]) = 0; |
| (b[6] => z[18]) = 0; |
| (b[7] => z[18]) = 0; |
| (b[8] => z[18]) = 0; |
| (b[9] => z[18]) = 0; |
| (b[10] => z[18]) = 0; |
| (b[11] => z[18]) = 0; |
| (b[12] => z[18]) = 0; |
| (b[13] => z[18]) = 0; |
| (b[14] => z[18]) = 0; |
| (b[15] => z[18]) = 0; |
| (b[16] => z[18]) = 0; |
| (b[17] => z[18]) = 0; |
| (a[0] => z[19]) = 0; |
| (a[1] => z[19]) = 0; |
| (a[2] => z[19]) = 0; |
| (a[3] => z[19]) = 0; |
| (a[4] => z[19]) = 0; |
| (a[5] => z[19]) = 0; |
| (a[6] => z[19]) = 0; |
| (a[7] => z[19]) = 0; |
| (a[8] => z[19]) = 0; |
| (a[9] => z[19]) = 0; |
| (a[10] => z[19]) = 0; |
| (a[11] => z[19]) = 0; |
| (a[12] => z[19]) = 0; |
| (a[13] => z[19]) = 0; |
| (a[14] => z[19]) = 0; |
| (a[15] => z[19]) = 0; |
| (a[16] => z[19]) = 0; |
| (a[17] => z[19]) = 0; |
| (a[18] => z[19]) = 0; |
| (a[19] => z[19]) = 0; |
| (b[0] => z[19]) = 0; |
| (b[1] => z[19]) = 0; |
| (b[2] => z[19]) = 0; |
| (b[3] => z[19]) = 0; |
| (b[4] => z[19]) = 0; |
| (b[5] => z[19]) = 0; |
| (b[6] => z[19]) = 0; |
| (b[7] => z[19]) = 0; |
| (b[8] => z[19]) = 0; |
| (b[9] => z[19]) = 0; |
| (b[10] => z[19]) = 0; |
| (b[11] => z[19]) = 0; |
| (b[12] => z[19]) = 0; |
| (b[13] => z[19]) = 0; |
| (b[14] => z[19]) = 0; |
| (b[15] => z[19]) = 0; |
| (b[16] => z[19]) = 0; |
| (b[17] => z[19]) = 0; |
| (a[0] => z[20]) = 0; |
| (a[1] => z[20]) = 0; |
| (a[2] => z[20]) = 0; |
| (a[3] => z[20]) = 0; |
| (a[4] => z[20]) = 0; |
| (a[5] => z[20]) = 0; |
| (a[6] => z[20]) = 0; |
| (a[7] => z[20]) = 0; |
| (a[8] => z[20]) = 0; |
| (a[9] => z[20]) = 0; |
| (a[10] => z[20]) = 0; |
| (a[11] => z[20]) = 0; |
| (a[12] => z[20]) = 0; |
| (a[13] => z[20]) = 0; |
| (a[14] => z[20]) = 0; |
| (a[15] => z[20]) = 0; |
| (a[16] => z[20]) = 0; |
| (a[17] => z[20]) = 0; |
| (a[18] => z[20]) = 0; |
| (a[19] => z[20]) = 0; |
| (b[0] => z[20]) = 0; |
| (b[1] => z[20]) = 0; |
| (b[2] => z[20]) = 0; |
| (b[3] => z[20]) = 0; |
| (b[4] => z[20]) = 0; |
| (b[5] => z[20]) = 0; |
| (b[6] => z[20]) = 0; |
| (b[7] => z[20]) = 0; |
| (b[8] => z[20]) = 0; |
| (b[9] => z[20]) = 0; |
| (b[10] => z[20]) = 0; |
| (b[11] => z[20]) = 0; |
| (b[12] => z[20]) = 0; |
| (b[13] => z[20]) = 0; |
| (b[14] => z[20]) = 0; |
| (b[15] => z[20]) = 0; |
| (b[16] => z[20]) = 0; |
| (b[17] => z[20]) = 0; |
| (a[0] => z[21]) = 0; |
| (a[1] => z[21]) = 0; |
| (a[2] => z[21]) = 0; |
| (a[3] => z[21]) = 0; |
| (a[4] => z[21]) = 0; |
| (a[5] => z[21]) = 0; |
| (a[6] => z[21]) = 0; |
| (a[7] => z[21]) = 0; |
| (a[8] => z[21]) = 0; |
| (a[9] => z[21]) = 0; |
| (a[10] => z[21]) = 0; |
| (a[11] => z[21]) = 0; |
| (a[12] => z[21]) = 0; |
| (a[13] => z[21]) = 0; |
| (a[14] => z[21]) = 0; |
| (a[15] => z[21]) = 0; |
| (a[16] => z[21]) = 0; |
| (a[17] => z[21]) = 0; |
| (a[18] => z[21]) = 0; |
| (a[19] => z[21]) = 0; |
| (b[0] => z[21]) = 0; |
| (b[1] => z[21]) = 0; |
| (b[2] => z[21]) = 0; |
| (b[3] => z[21]) = 0; |
| (b[4] => z[21]) = 0; |
| (b[5] => z[21]) = 0; |
| (b[6] => z[21]) = 0; |
| (b[7] => z[21]) = 0; |
| (b[8] => z[21]) = 0; |
| (b[9] => z[21]) = 0; |
| (b[10] => z[21]) = 0; |
| (b[11] => z[21]) = 0; |
| (b[12] => z[21]) = 0; |
| (b[13] => z[21]) = 0; |
| (b[14] => z[21]) = 0; |
| (b[15] => z[21]) = 0; |
| (b[16] => z[21]) = 0; |
| (b[17] => z[21]) = 0; |
| (a[0] => z[22]) = 0; |
| (a[1] => z[22]) = 0; |
| (a[2] => z[22]) = 0; |
| (a[3] => z[22]) = 0; |
| (a[4] => z[22]) = 0; |
| (a[5] => z[22]) = 0; |
| (a[6] => z[22]) = 0; |
| (a[7] => z[22]) = 0; |
| (a[8] => z[22]) = 0; |
| (a[9] => z[22]) = 0; |
| (a[10] => z[22]) = 0; |
| (a[11] => z[22]) = 0; |
| (a[12] => z[22]) = 0; |
| (a[13] => z[22]) = 0; |
| (a[14] => z[22]) = 0; |
| (a[15] => z[22]) = 0; |
| (a[16] => z[22]) = 0; |
| (a[17] => z[22]) = 0; |
| (a[18] => z[22]) = 0; |
| (a[19] => z[22]) = 0; |
| (b[0] => z[22]) = 0; |
| (b[1] => z[22]) = 0; |
| (b[2] => z[22]) = 0; |
| (b[3] => z[22]) = 0; |
| (b[4] => z[22]) = 0; |
| (b[5] => z[22]) = 0; |
| (b[6] => z[22]) = 0; |
| (b[7] => z[22]) = 0; |
| (b[8] => z[22]) = 0; |
| (b[9] => z[22]) = 0; |
| (b[10] => z[22]) = 0; |
| (b[11] => z[22]) = 0; |
| (b[12] => z[22]) = 0; |
| (b[13] => z[22]) = 0; |
| (b[14] => z[22]) = 0; |
| (b[15] => z[22]) = 0; |
| (b[16] => z[22]) = 0; |
| (b[17] => z[22]) = 0; |
| (a[0] => z[23]) = 0; |
| (a[1] => z[23]) = 0; |
| (a[2] => z[23]) = 0; |
| (a[3] => z[23]) = 0; |
| (a[4] => z[23]) = 0; |
| (a[5] => z[23]) = 0; |
| (a[6] => z[23]) = 0; |
| (a[7] => z[23]) = 0; |
| (a[8] => z[23]) = 0; |
| (a[9] => z[23]) = 0; |
| (a[10] => z[23]) = 0; |
| (a[11] => z[23]) = 0; |
| (a[12] => z[23]) = 0; |
| (a[13] => z[23]) = 0; |
| (a[14] => z[23]) = 0; |
| (a[15] => z[23]) = 0; |
| (a[16] => z[23]) = 0; |
| (a[17] => z[23]) = 0; |
| (a[18] => z[23]) = 0; |
| (a[19] => z[23]) = 0; |
| (b[0] => z[23]) = 0; |
| (b[1] => z[23]) = 0; |
| (b[2] => z[23]) = 0; |
| (b[3] => z[23]) = 0; |
| (b[4] => z[23]) = 0; |
| (b[5] => z[23]) = 0; |
| (b[6] => z[23]) = 0; |
| (b[7] => z[23]) = 0; |
| (b[8] => z[23]) = 0; |
| (b[9] => z[23]) = 0; |
| (b[10] => z[23]) = 0; |
| (b[11] => z[23]) = 0; |
| (b[12] => z[23]) = 0; |
| (b[13] => z[23]) = 0; |
| (b[14] => z[23]) = 0; |
| (b[15] => z[23]) = 0; |
| (b[16] => z[23]) = 0; |
| (b[17] => z[23]) = 0; |
| (a[0] => z[24]) = 0; |
| (a[1] => z[24]) = 0; |
| (a[2] => z[24]) = 0; |
| (a[3] => z[24]) = 0; |
| (a[4] => z[24]) = 0; |
| (a[5] => z[24]) = 0; |
| (a[6] => z[24]) = 0; |
| (a[7] => z[24]) = 0; |
| (a[8] => z[24]) = 0; |
| (a[9] => z[24]) = 0; |
| (a[10] => z[24]) = 0; |
| (a[11] => z[24]) = 0; |
| (a[12] => z[24]) = 0; |
| (a[13] => z[24]) = 0; |
| (a[14] => z[24]) = 0; |
| (a[15] => z[24]) = 0; |
| (a[16] => z[24]) = 0; |
| (a[17] => z[24]) = 0; |
| (a[18] => z[24]) = 0; |
| (a[19] => z[24]) = 0; |
| (b[0] => z[24]) = 0; |
| (b[1] => z[24]) = 0; |
| (b[2] => z[24]) = 0; |
| (b[3] => z[24]) = 0; |
| (b[4] => z[24]) = 0; |
| (b[5] => z[24]) = 0; |
| (b[6] => z[24]) = 0; |
| (b[7] => z[24]) = 0; |
| (b[8] => z[24]) = 0; |
| (b[9] => z[24]) = 0; |
| (b[10] => z[24]) = 0; |
| (b[11] => z[24]) = 0; |
| (b[12] => z[24]) = 0; |
| (b[13] => z[24]) = 0; |
| (b[14] => z[24]) = 0; |
| (b[15] => z[24]) = 0; |
| (b[16] => z[24]) = 0; |
| (b[17] => z[24]) = 0; |
| (a[0] => z[25]) = 0; |
| (a[1] => z[25]) = 0; |
| (a[2] => z[25]) = 0; |
| (a[3] => z[25]) = 0; |
| (a[4] => z[25]) = 0; |
| (a[5] => z[25]) = 0; |
| (a[6] => z[25]) = 0; |
| (a[7] => z[25]) = 0; |
| (a[8] => z[25]) = 0; |
| (a[9] => z[25]) = 0; |
| (a[10] => z[25]) = 0; |
| (a[11] => z[25]) = 0; |
| (a[12] => z[25]) = 0; |
| (a[13] => z[25]) = 0; |
| (a[14] => z[25]) = 0; |
| (a[15] => z[25]) = 0; |
| (a[16] => z[25]) = 0; |
| (a[17] => z[25]) = 0; |
| (a[18] => z[25]) = 0; |
| (a[19] => z[25]) = 0; |
| (b[0] => z[25]) = 0; |
| (b[1] => z[25]) = 0; |
| (b[2] => z[25]) = 0; |
| (b[3] => z[25]) = 0; |
| (b[4] => z[25]) = 0; |
| (b[5] => z[25]) = 0; |
| (b[6] => z[25]) = 0; |
| (b[7] => z[25]) = 0; |
| (b[8] => z[25]) = 0; |
| (b[9] => z[25]) = 0; |
| (b[10] => z[25]) = 0; |
| (b[11] => z[25]) = 0; |
| (b[12] => z[25]) = 0; |
| (b[13] => z[25]) = 0; |
| (b[14] => z[25]) = 0; |
| (b[15] => z[25]) = 0; |
| (b[16] => z[25]) = 0; |
| (b[17] => z[25]) = 0; |
| (a[0] => z[26]) = 0; |
| (a[1] => z[26]) = 0; |
| (a[2] => z[26]) = 0; |
| (a[3] => z[26]) = 0; |
| (a[4] => z[26]) = 0; |
| (a[5] => z[26]) = 0; |
| (a[6] => z[26]) = 0; |
| (a[7] => z[26]) = 0; |
| (a[8] => z[26]) = 0; |
| (a[9] => z[26]) = 0; |
| (a[10] => z[26]) = 0; |
| (a[11] => z[26]) = 0; |
| (a[12] => z[26]) = 0; |
| (a[13] => z[26]) = 0; |
| (a[14] => z[26]) = 0; |
| (a[15] => z[26]) = 0; |
| (a[16] => z[26]) = 0; |
| (a[17] => z[26]) = 0; |
| (a[18] => z[26]) = 0; |
| (a[19] => z[26]) = 0; |
| (b[0] => z[26]) = 0; |
| (b[1] => z[26]) = 0; |
| (b[2] => z[26]) = 0; |
| (b[3] => z[26]) = 0; |
| (b[4] => z[26]) = 0; |
| (b[5] => z[26]) = 0; |
| (b[6] => z[26]) = 0; |
| (b[7] => z[26]) = 0; |
| (b[8] => z[26]) = 0; |
| (b[9] => z[26]) = 0; |
| (b[10] => z[26]) = 0; |
| (b[11] => z[26]) = 0; |
| (b[12] => z[26]) = 0; |
| (b[13] => z[26]) = 0; |
| (b[14] => z[26]) = 0; |
| (b[15] => z[26]) = 0; |
| (b[16] => z[26]) = 0; |
| (b[17] => z[26]) = 0; |
| (a[0] => z[27]) = 0; |
| (a[1] => z[27]) = 0; |
| (a[2] => z[27]) = 0; |
| (a[3] => z[27]) = 0; |
| (a[4] => z[27]) = 0; |
| (a[5] => z[27]) = 0; |
| (a[6] => z[27]) = 0; |
| (a[7] => z[27]) = 0; |
| (a[8] => z[27]) = 0; |
| (a[9] => z[27]) = 0; |
| (a[10] => z[27]) = 0; |
| (a[11] => z[27]) = 0; |
| (a[12] => z[27]) = 0; |
| (a[13] => z[27]) = 0; |
| (a[14] => z[27]) = 0; |
| (a[15] => z[27]) = 0; |
| (a[16] => z[27]) = 0; |
| (a[17] => z[27]) = 0; |
| (a[18] => z[27]) = 0; |
| (a[19] => z[27]) = 0; |
| (b[0] => z[27]) = 0; |
| (b[1] => z[27]) = 0; |
| (b[2] => z[27]) = 0; |
| (b[3] => z[27]) = 0; |
| (b[4] => z[27]) = 0; |
| (b[5] => z[27]) = 0; |
| (b[6] => z[27]) = 0; |
| (b[7] => z[27]) = 0; |
| (b[8] => z[27]) = 0; |
| (b[9] => z[27]) = 0; |
| (b[10] => z[27]) = 0; |
| (b[11] => z[27]) = 0; |
| (b[12] => z[27]) = 0; |
| (b[13] => z[27]) = 0; |
| (b[14] => z[27]) = 0; |
| (b[15] => z[27]) = 0; |
| (b[16] => z[27]) = 0; |
| (b[17] => z[27]) = 0; |
| (a[0] => z[28]) = 0; |
| (a[1] => z[28]) = 0; |
| (a[2] => z[28]) = 0; |
| (a[3] => z[28]) = 0; |
| (a[4] => z[28]) = 0; |
| (a[5] => z[28]) = 0; |
| (a[6] => z[28]) = 0; |
| (a[7] => z[28]) = 0; |
| (a[8] => z[28]) = 0; |
| (a[9] => z[28]) = 0; |
| (a[10] => z[28]) = 0; |
| (a[11] => z[28]) = 0; |
| (a[12] => z[28]) = 0; |
| (a[13] => z[28]) = 0; |
| (a[14] => z[28]) = 0; |
| (a[15] => z[28]) = 0; |
| (a[16] => z[28]) = 0; |
| (a[17] => z[28]) = 0; |
| (a[18] => z[28]) = 0; |
| (a[19] => z[28]) = 0; |
| (b[0] => z[28]) = 0; |
| (b[1] => z[28]) = 0; |
| (b[2] => z[28]) = 0; |
| (b[3] => z[28]) = 0; |
| (b[4] => z[28]) = 0; |
| (b[5] => z[28]) = 0; |
| (b[6] => z[28]) = 0; |
| (b[7] => z[28]) = 0; |
| (b[8] => z[28]) = 0; |
| (b[9] => z[28]) = 0; |
| (b[10] => z[28]) = 0; |
| (b[11] => z[28]) = 0; |
| (b[12] => z[28]) = 0; |
| (b[13] => z[28]) = 0; |
| (b[14] => z[28]) = 0; |
| (b[15] => z[28]) = 0; |
| (b[16] => z[28]) = 0; |
| (b[17] => z[28]) = 0; |
| (a[0] => z[29]) = 0; |
| (a[1] => z[29]) = 0; |
| (a[2] => z[29]) = 0; |
| (a[3] => z[29]) = 0; |
| (a[4] => z[29]) = 0; |
| (a[5] => z[29]) = 0; |
| (a[6] => z[29]) = 0; |
| (a[7] => z[29]) = 0; |
| (a[8] => z[29]) = 0; |
| (a[9] => z[29]) = 0; |
| (a[10] => z[29]) = 0; |
| (a[11] => z[29]) = 0; |
| (a[12] => z[29]) = 0; |
| (a[13] => z[29]) = 0; |
| (a[14] => z[29]) = 0; |
| (a[15] => z[29]) = 0; |
| (a[16] => z[29]) = 0; |
| (a[17] => z[29]) = 0; |
| (a[18] => z[29]) = 0; |
| (a[19] => z[29]) = 0; |
| (b[0] => z[29]) = 0; |
| (b[1] => z[29]) = 0; |
| (b[2] => z[29]) = 0; |
| (b[3] => z[29]) = 0; |
| (b[4] => z[29]) = 0; |
| (b[5] => z[29]) = 0; |
| (b[6] => z[29]) = 0; |
| (b[7] => z[29]) = 0; |
| (b[8] => z[29]) = 0; |
| (b[9] => z[29]) = 0; |
| (b[10] => z[29]) = 0; |
| (b[11] => z[29]) = 0; |
| (b[12] => z[29]) = 0; |
| (b[13] => z[29]) = 0; |
| (b[14] => z[29]) = 0; |
| (b[15] => z[29]) = 0; |
| (b[16] => z[29]) = 0; |
| (b[17] => z[29]) = 0; |
| (a[0] => z[30]) = 0; |
| (a[1] => z[30]) = 0; |
| (a[2] => z[30]) = 0; |
| (a[3] => z[30]) = 0; |
| (a[4] => z[30]) = 0; |
| (a[5] => z[30]) = 0; |
| (a[6] => z[30]) = 0; |
| (a[7] => z[30]) = 0; |
| (a[8] => z[30]) = 0; |
| (a[9] => z[30]) = 0; |
| (a[10] => z[30]) = 0; |
| (a[11] => z[30]) = 0; |
| (a[12] => z[30]) = 0; |
| (a[13] => z[30]) = 0; |
| (a[14] => z[30]) = 0; |
| (a[15] => z[30]) = 0; |
| (a[16] => z[30]) = 0; |
| (a[17] => z[30]) = 0; |
| (a[18] => z[30]) = 0; |
| (a[19] => z[30]) = 0; |
| (b[0] => z[30]) = 0; |
| (b[1] => z[30]) = 0; |
| (b[2] => z[30]) = 0; |
| (b[3] => z[30]) = 0; |
| (b[4] => z[30]) = 0; |
| (b[5] => z[30]) = 0; |
| (b[6] => z[30]) = 0; |
| (b[7] => z[30]) = 0; |
| (b[8] => z[30]) = 0; |
| (b[9] => z[30]) = 0; |
| (b[10] => z[30]) = 0; |
| (b[11] => z[30]) = 0; |
| (b[12] => z[30]) = 0; |
| (b[13] => z[30]) = 0; |
| (b[14] => z[30]) = 0; |
| (b[15] => z[30]) = 0; |
| (b[16] => z[30]) = 0; |
| (b[17] => z[30]) = 0; |
| (a[0] => z[31]) = 0; |
| (a[1] => z[31]) = 0; |
| (a[2] => z[31]) = 0; |
| (a[3] => z[31]) = 0; |
| (a[4] => z[31]) = 0; |
| (a[5] => z[31]) = 0; |
| (a[6] => z[31]) = 0; |
| (a[7] => z[31]) = 0; |
| (a[8] => z[31]) = 0; |
| (a[9] => z[31]) = 0; |
| (a[10] => z[31]) = 0; |
| (a[11] => z[31]) = 0; |
| (a[12] => z[31]) = 0; |
| (a[13] => z[31]) = 0; |
| (a[14] => z[31]) = 0; |
| (a[15] => z[31]) = 0; |
| (a[16] => z[31]) = 0; |
| (a[17] => z[31]) = 0; |
| (a[18] => z[31]) = 0; |
| (a[19] => z[31]) = 0; |
| (b[0] => z[31]) = 0; |
| (b[1] => z[31]) = 0; |
| (b[2] => z[31]) = 0; |
| (b[3] => z[31]) = 0; |
| (b[4] => z[31]) = 0; |
| (b[5] => z[31]) = 0; |
| (b[6] => z[31]) = 0; |
| (b[7] => z[31]) = 0; |
| (b[8] => z[31]) = 0; |
| (b[9] => z[31]) = 0; |
| (b[10] => z[31]) = 0; |
| (b[11] => z[31]) = 0; |
| (b[12] => z[31]) = 0; |
| (b[13] => z[31]) = 0; |
| (b[14] => z[31]) = 0; |
| (b[15] => z[31]) = 0; |
| (b[16] => z[31]) = 0; |
| (b[17] => z[31]) = 0; |
| (a[0] => z[32]) = 0; |
| (a[1] => z[32]) = 0; |
| (a[2] => z[32]) = 0; |
| (a[3] => z[32]) = 0; |
| (a[4] => z[32]) = 0; |
| (a[5] => z[32]) = 0; |
| (a[6] => z[32]) = 0; |
| (a[7] => z[32]) = 0; |
| (a[8] => z[32]) = 0; |
| (a[9] => z[32]) = 0; |
| (a[10] => z[32]) = 0; |
| (a[11] => z[32]) = 0; |
| (a[12] => z[32]) = 0; |
| (a[13] => z[32]) = 0; |
| (a[14] => z[32]) = 0; |
| (a[15] => z[32]) = 0; |
| (a[16] => z[32]) = 0; |
| (a[17] => z[32]) = 0; |
| (a[18] => z[32]) = 0; |
| (a[19] => z[32]) = 0; |
| (b[0] => z[32]) = 0; |
| (b[1] => z[32]) = 0; |
| (b[2] => z[32]) = 0; |
| (b[3] => z[32]) = 0; |
| (b[4] => z[32]) = 0; |
| (b[5] => z[32]) = 0; |
| (b[6] => z[32]) = 0; |
| (b[7] => z[32]) = 0; |
| (b[8] => z[32]) = 0; |
| (b[9] => z[32]) = 0; |
| (b[10] => z[32]) = 0; |
| (b[11] => z[32]) = 0; |
| (b[12] => z[32]) = 0; |
| (b[13] => z[32]) = 0; |
| (b[14] => z[32]) = 0; |
| (b[15] => z[32]) = 0; |
| (b[16] => z[32]) = 0; |
| (b[17] => z[32]) = 0; |
| (a[0] => z[33]) = 0; |
| (a[1] => z[33]) = 0; |
| (a[2] => z[33]) = 0; |
| (a[3] => z[33]) = 0; |
| (a[4] => z[33]) = 0; |
| (a[5] => z[33]) = 0; |
| (a[6] => z[33]) = 0; |
| (a[7] => z[33]) = 0; |
| (a[8] => z[33]) = 0; |
| (a[9] => z[33]) = 0; |
| (a[10] => z[33]) = 0; |
| (a[11] => z[33]) = 0; |
| (a[12] => z[33]) = 0; |
| (a[13] => z[33]) = 0; |
| (a[14] => z[33]) = 0; |
| (a[15] => z[33]) = 0; |
| (a[16] => z[33]) = 0; |
| (a[17] => z[33]) = 0; |
| (a[18] => z[33]) = 0; |
| (a[19] => z[33]) = 0; |
| (b[0] => z[33]) = 0; |
| (b[1] => z[33]) = 0; |
| (b[2] => z[33]) = 0; |
| (b[3] => z[33]) = 0; |
| (b[4] => z[33]) = 0; |
| (b[5] => z[33]) = 0; |
| (b[6] => z[33]) = 0; |
| (b[7] => z[33]) = 0; |
| (b[8] => z[33]) = 0; |
| (b[9] => z[33]) = 0; |
| (b[10] => z[33]) = 0; |
| (b[11] => z[33]) = 0; |
| (b[12] => z[33]) = 0; |
| (b[13] => z[33]) = 0; |
| (b[14] => z[33]) = 0; |
| (b[15] => z[33]) = 0; |
| (b[16] => z[33]) = 0; |
| (b[17] => z[33]) = 0; |
| (a[0] => z[34]) = 0; |
| (a[1] => z[34]) = 0; |
| (a[2] => z[34]) = 0; |
| (a[3] => z[34]) = 0; |
| (a[4] => z[34]) = 0; |
| (a[5] => z[34]) = 0; |
| (a[6] => z[34]) = 0; |
| (a[7] => z[34]) = 0; |
| (a[8] => z[34]) = 0; |
| (a[9] => z[34]) = 0; |
| (a[10] => z[34]) = 0; |
| (a[11] => z[34]) = 0; |
| (a[12] => z[34]) = 0; |
| (a[13] => z[34]) = 0; |
| (a[14] => z[34]) = 0; |
| (a[15] => z[34]) = 0; |
| (a[16] => z[34]) = 0; |
| (a[17] => z[34]) = 0; |
| (a[18] => z[34]) = 0; |
| (a[19] => z[34]) = 0; |
| (b[0] => z[34]) = 0; |
| (b[1] => z[34]) = 0; |
| (b[2] => z[34]) = 0; |
| (b[3] => z[34]) = 0; |
| (b[4] => z[34]) = 0; |
| (b[5] => z[34]) = 0; |
| (b[6] => z[34]) = 0; |
| (b[7] => z[34]) = 0; |
| (b[8] => z[34]) = 0; |
| (b[9] => z[34]) = 0; |
| (b[10] => z[34]) = 0; |
| (b[11] => z[34]) = 0; |
| (b[12] => z[34]) = 0; |
| (b[13] => z[34]) = 0; |
| (b[14] => z[34]) = 0; |
| (b[15] => z[34]) = 0; |
| (b[16] => z[34]) = 0; |
| (b[17] => z[34]) = 0; |
| (a[0] => z[35]) = 0; |
| (a[1] => z[35]) = 0; |
| (a[2] => z[35]) = 0; |
| (a[3] => z[35]) = 0; |
| (a[4] => z[35]) = 0; |
| (a[5] => z[35]) = 0; |
| (a[6] => z[35]) = 0; |
| (a[7] => z[35]) = 0; |
| (a[8] => z[35]) = 0; |
| (a[9] => z[35]) = 0; |
| (a[10] => z[35]) = 0; |
| (a[11] => z[35]) = 0; |
| (a[12] => z[35]) = 0; |
| (a[13] => z[35]) = 0; |
| (a[14] => z[35]) = 0; |
| (a[15] => z[35]) = 0; |
| (a[16] => z[35]) = 0; |
| (a[17] => z[35]) = 0; |
| (a[18] => z[35]) = 0; |
| (a[19] => z[35]) = 0; |
| (b[0] => z[35]) = 0; |
| (b[1] => z[35]) = 0; |
| (b[2] => z[35]) = 0; |
| (b[3] => z[35]) = 0; |
| (b[4] => z[35]) = 0; |
| (b[5] => z[35]) = 0; |
| (b[6] => z[35]) = 0; |
| (b[7] => z[35]) = 0; |
| (b[8] => z[35]) = 0; |
| (b[9] => z[35]) = 0; |
| (b[10] => z[35]) = 0; |
| (b[11] => z[35]) = 0; |
| (b[12] => z[35]) = 0; |
| (b[13] => z[35]) = 0; |
| (b[14] => z[35]) = 0; |
| (b[15] => z[35]) = 0; |
| (b[16] => z[35]) = 0; |
| (b[17] => z[35]) = 0; |
| (a[0] => z[36]) = 0; |
| (a[1] => z[36]) = 0; |
| (a[2] => z[36]) = 0; |
| (a[3] => z[36]) = 0; |
| (a[4] => z[36]) = 0; |
| (a[5] => z[36]) = 0; |
| (a[6] => z[36]) = 0; |
| (a[7] => z[36]) = 0; |
| (a[8] => z[36]) = 0; |
| (a[9] => z[36]) = 0; |
| (a[10] => z[36]) = 0; |
| (a[11] => z[36]) = 0; |
| (a[12] => z[36]) = 0; |
| (a[13] => z[36]) = 0; |
| (a[14] => z[36]) = 0; |
| (a[15] => z[36]) = 0; |
| (a[16] => z[36]) = 0; |
| (a[17] => z[36]) = 0; |
| (a[18] => z[36]) = 0; |
| (a[19] => z[36]) = 0; |
| (b[0] => z[36]) = 0; |
| (b[1] => z[36]) = 0; |
| (b[2] => z[36]) = 0; |
| (b[3] => z[36]) = 0; |
| (b[4] => z[36]) = 0; |
| (b[5] => z[36]) = 0; |
| (b[6] => z[36]) = 0; |
| (b[7] => z[36]) = 0; |
| (b[8] => z[36]) = 0; |
| (b[9] => z[36]) = 0; |
| (b[10] => z[36]) = 0; |
| (b[11] => z[36]) = 0; |
| (b[12] => z[36]) = 0; |
| (b[13] => z[36]) = 0; |
| (b[14] => z[36]) = 0; |
| (b[15] => z[36]) = 0; |
| (b[16] => z[36]) = 0; |
| (b[17] => z[36]) = 0; |
| (a[0] => z[37]) = 0; |
| (a[1] => z[37]) = 0; |
| (a[2] => z[37]) = 0; |
| (a[3] => z[37]) = 0; |
| (a[4] => z[37]) = 0; |
| (a[5] => z[37]) = 0; |
| (a[6] => z[37]) = 0; |
| (a[7] => z[37]) = 0; |
| (a[8] => z[37]) = 0; |
| (a[9] => z[37]) = 0; |
| (a[10] => z[37]) = 0; |
| (a[11] => z[37]) = 0; |
| (a[12] => z[37]) = 0; |
| (a[13] => z[37]) = 0; |
| (a[14] => z[37]) = 0; |
| (a[15] => z[37]) = 0; |
| (a[16] => z[37]) = 0; |
| (a[17] => z[37]) = 0; |
| (a[18] => z[37]) = 0; |
| (a[19] => z[37]) = 0; |
| (b[0] => z[37]) = 0; |
| (b[1] => z[37]) = 0; |
| (b[2] => z[37]) = 0; |
| (b[3] => z[37]) = 0; |
| (b[4] => z[37]) = 0; |
| (b[5] => z[37]) = 0; |
| (b[6] => z[37]) = 0; |
| (b[7] => z[37]) = 0; |
| (b[8] => z[37]) = 0; |
| (b[9] => z[37]) = 0; |
| (b[10] => z[37]) = 0; |
| (b[11] => z[37]) = 0; |
| (b[12] => z[37]) = 0; |
| (b[13] => z[37]) = 0; |
| (b[14] => z[37]) = 0; |
| (b[15] => z[37]) = 0; |
| (b[16] => z[37]) = 0; |
| (b[17] => z[37]) = 0; |
| (subtract => z[0]) = 0; |
| (subtract => z[1]) = 0; |
| (subtract => z[2]) = 0; |
| (subtract => z[3]) = 0; |
| (subtract => z[4]) = 0; |
| (subtract => z[5]) = 0; |
| (subtract => z[6]) = 0; |
| (subtract => z[7]) = 0; |
| (subtract => z[8]) = 0; |
| (subtract => z[9]) = 0; |
| (subtract => z[10]) = 0; |
| (subtract => z[11]) = 0; |
| (subtract => z[12]) = 0; |
| (subtract => z[13]) = 0; |
| (subtract => z[14]) = 0; |
| (subtract => z[15]) = 0; |
| (subtract => z[16]) = 0; |
| (subtract => z[17]) = 0; |
| (subtract => z[18]) = 0; |
| (subtract => z[19]) = 0; |
| (subtract => z[20]) = 0; |
| (subtract => z[21]) = 0; |
| (subtract => z[22]) = 0; |
| (subtract => z[23]) = 0; |
| (subtract => z[24]) = 0; |
| (subtract => z[25]) = 0; |
| (subtract => z[26]) = 0; |
| (subtract => z[27]) = 0; |
| (subtract => z[28]) = 0; |
| (subtract => z[29]) = 0; |
| (subtract => z[30]) = 0; |
| (subtract => z[31]) = 0; |
| (subtract => z[32]) = 0; |
| (subtract => z[33]) = 0; |
| (subtract => z[34]) = 0; |
| (subtract => z[35]) = 0; |
| (subtract => z[36]) = 0; |
| (subtract => z[37]) = 0; |
| (acc_fir[0] => z[0]) = 0; |
| (acc_fir[1] => z[0]) = 0; |
| (acc_fir[2] => z[0]) = 0; |
| (acc_fir[3] => z[0]) = 0; |
| (acc_fir[4] => z[0]) = 0; |
| (acc_fir[5] => z[0]) = 0; |
| (acc_fir[0] => z[1]) = 0; |
| (acc_fir[1] => z[1]) = 0; |
| (acc_fir[2] => z[1]) = 0; |
| (acc_fir[3] => z[1]) = 0; |
| (acc_fir[4] => z[1]) = 0; |
| (acc_fir[5] => z[1]) = 0; |
| (acc_fir[0] => z[2]) = 0; |
| (acc_fir[1] => z[2]) = 0; |
| (acc_fir[2] => z[2]) = 0; |
| (acc_fir[3] => z[2]) = 0; |
| (acc_fir[4] => z[2]) = 0; |
| (acc_fir[5] => z[2]) = 0; |
| (acc_fir[0] => z[3]) = 0; |
| (acc_fir[1] => z[3]) = 0; |
| (acc_fir[2] => z[3]) = 0; |
| (acc_fir[3] => z[3]) = 0; |
| (acc_fir[4] => z[3]) = 0; |
| (acc_fir[5] => z[3]) = 0; |
| (acc_fir[0] => z[4]) = 0; |
| (acc_fir[1] => z[4]) = 0; |
| (acc_fir[2] => z[4]) = 0; |
| (acc_fir[3] => z[4]) = 0; |
| (acc_fir[4] => z[4]) = 0; |
| (acc_fir[5] => z[4]) = 0; |
| (acc_fir[0] => z[5]) = 0; |
| (acc_fir[1] => z[5]) = 0; |
| (acc_fir[2] => z[5]) = 0; |
| (acc_fir[3] => z[5]) = 0; |
| (acc_fir[4] => z[5]) = 0; |
| (acc_fir[5] => z[5]) = 0; |
| (acc_fir[0] => z[6]) = 0; |
| (acc_fir[1] => z[6]) = 0; |
| (acc_fir[2] => z[6]) = 0; |
| (acc_fir[3] => z[6]) = 0; |
| (acc_fir[4] => z[6]) = 0; |
| (acc_fir[5] => z[6]) = 0; |
| (acc_fir[0] => z[7]) = 0; |
| (acc_fir[1] => z[7]) = 0; |
| (acc_fir[2] => z[7]) = 0; |
| (acc_fir[3] => z[7]) = 0; |
| (acc_fir[4] => z[7]) = 0; |
| (acc_fir[5] => z[7]) = 0; |
| (acc_fir[0] => z[8]) = 0; |
| (acc_fir[1] => z[8]) = 0; |
| (acc_fir[2] => z[8]) = 0; |
| (acc_fir[3] => z[8]) = 0; |
| (acc_fir[4] => z[8]) = 0; |
| (acc_fir[5] => z[8]) = 0; |
| (acc_fir[0] => z[9]) = 0; |
| (acc_fir[1] => z[9]) = 0; |
| (acc_fir[2] => z[9]) = 0; |
| (acc_fir[3] => z[9]) = 0; |
| (acc_fir[4] => z[9]) = 0; |
| (acc_fir[5] => z[9]) = 0; |
| (acc_fir[0] => z[10]) = 0; |
| (acc_fir[1] => z[10]) = 0; |
| (acc_fir[2] => z[10]) = 0; |
| (acc_fir[3] => z[10]) = 0; |
| (acc_fir[4] => z[10]) = 0; |
| (acc_fir[5] => z[10]) = 0; |
| (acc_fir[0] => z[11]) = 0; |
| (acc_fir[1] => z[11]) = 0; |
| (acc_fir[2] => z[11]) = 0; |
| (acc_fir[3] => z[11]) = 0; |
| (acc_fir[4] => z[11]) = 0; |
| (acc_fir[5] => z[11]) = 0; |
| (acc_fir[0] => z[12]) = 0; |
| (acc_fir[1] => z[12]) = 0; |
| (acc_fir[2] => z[12]) = 0; |
| (acc_fir[3] => z[12]) = 0; |
| (acc_fir[4] => z[12]) = 0; |
| (acc_fir[5] => z[12]) = 0; |
| (acc_fir[0] => z[13]) = 0; |
| (acc_fir[1] => z[13]) = 0; |
| (acc_fir[2] => z[13]) = 0; |
| (acc_fir[3] => z[13]) = 0; |
| (acc_fir[4] => z[13]) = 0; |
| (acc_fir[5] => z[13]) = 0; |
| (acc_fir[0] => z[14]) = 0; |
| (acc_fir[1] => z[14]) = 0; |
| (acc_fir[2] => z[14]) = 0; |
| (acc_fir[3] => z[14]) = 0; |
| (acc_fir[4] => z[14]) = 0; |
| (acc_fir[5] => z[14]) = 0; |
| (acc_fir[0] => z[15]) = 0; |
| (acc_fir[1] => z[15]) = 0; |
| (acc_fir[2] => z[15]) = 0; |
| (acc_fir[3] => z[15]) = 0; |
| (acc_fir[4] => z[15]) = 0; |
| (acc_fir[5] => z[15]) = 0; |
| (acc_fir[0] => z[16]) = 0; |
| (acc_fir[1] => z[16]) = 0; |
| (acc_fir[2] => z[16]) = 0; |
| (acc_fir[3] => z[16]) = 0; |
| (acc_fir[4] => z[16]) = 0; |
| (acc_fir[5] => z[16]) = 0; |
| (acc_fir[0] => z[17]) = 0; |
| (acc_fir[1] => z[17]) = 0; |
| (acc_fir[2] => z[17]) = 0; |
| (acc_fir[3] => z[17]) = 0; |
| (acc_fir[4] => z[17]) = 0; |
| (acc_fir[5] => z[17]) = 0; |
| (acc_fir[0] => z[18]) = 0; |
| (acc_fir[1] => z[18]) = 0; |
| (acc_fir[2] => z[18]) = 0; |
| (acc_fir[3] => z[18]) = 0; |
| (acc_fir[4] => z[18]) = 0; |
| (acc_fir[5] => z[18]) = 0; |
| (acc_fir[0] => z[19]) = 0; |
| (acc_fir[1] => z[19]) = 0; |
| (acc_fir[2] => z[19]) = 0; |
| (acc_fir[3] => z[19]) = 0; |
| (acc_fir[4] => z[19]) = 0; |
| (acc_fir[5] => z[19]) = 0; |
| (acc_fir[0] => z[20]) = 0; |
| (acc_fir[1] => z[20]) = 0; |
| (acc_fir[2] => z[20]) = 0; |
| (acc_fir[3] => z[20]) = 0; |
| (acc_fir[4] => z[20]) = 0; |
| (acc_fir[5] => z[20]) = 0; |
| (acc_fir[0] => z[21]) = 0; |
| (acc_fir[1] => z[21]) = 0; |
| (acc_fir[2] => z[21]) = 0; |
| (acc_fir[3] => z[21]) = 0; |
| (acc_fir[4] => z[21]) = 0; |
| (acc_fir[5] => z[21]) = 0; |
| (acc_fir[0] => z[22]) = 0; |
| (acc_fir[1] => z[22]) = 0; |
| (acc_fir[2] => z[22]) = 0; |
| (acc_fir[3] => z[22]) = 0; |
| (acc_fir[4] => z[22]) = 0; |
| (acc_fir[5] => z[22]) = 0; |
| (acc_fir[0] => z[23]) = 0; |
| (acc_fir[1] => z[23]) = 0; |
| (acc_fir[2] => z[23]) = 0; |
| (acc_fir[3] => z[23]) = 0; |
| (acc_fir[4] => z[23]) = 0; |
| (acc_fir[5] => z[23]) = 0; |
| (acc_fir[0] => z[24]) = 0; |
| (acc_fir[1] => z[24]) = 0; |
| (acc_fir[2] => z[24]) = 0; |
| (acc_fir[3] => z[24]) = 0; |
| (acc_fir[4] => z[24]) = 0; |
| (acc_fir[5] => z[24]) = 0; |
| (acc_fir[0] => z[25]) = 0; |
| (acc_fir[1] => z[25]) = 0; |
| (acc_fir[2] => z[25]) = 0; |
| (acc_fir[3] => z[25]) = 0; |
| (acc_fir[4] => z[25]) = 0; |
| (acc_fir[5] => z[25]) = 0; |
| (acc_fir[0] => z[26]) = 0; |
| (acc_fir[1] => z[26]) = 0; |
| (acc_fir[2] => z[26]) = 0; |
| (acc_fir[3] => z[26]) = 0; |
| (acc_fir[4] => z[26]) = 0; |
| (acc_fir[5] => z[26]) = 0; |
| (acc_fir[0] => z[27]) = 0; |
| (acc_fir[1] => z[27]) = 0; |
| (acc_fir[2] => z[27]) = 0; |
| (acc_fir[3] => z[27]) = 0; |
| (acc_fir[4] => z[27]) = 0; |
| (acc_fir[5] => z[27]) = 0; |
| (acc_fir[0] => z[28]) = 0; |
| (acc_fir[1] => z[28]) = 0; |
| (acc_fir[2] => z[28]) = 0; |
| (acc_fir[3] => z[28]) = 0; |
| (acc_fir[4] => z[28]) = 0; |
| (acc_fir[5] => z[28]) = 0; |
| (acc_fir[0] => z[29]) = 0; |
| (acc_fir[1] => z[29]) = 0; |
| (acc_fir[2] => z[29]) = 0; |
| (acc_fir[3] => z[29]) = 0; |
| (acc_fir[4] => z[29]) = 0; |
| (acc_fir[5] => z[29]) = 0; |
| (acc_fir[0] => z[30]) = 0; |
| (acc_fir[1] => z[30]) = 0; |
| (acc_fir[2] => z[30]) = 0; |
| (acc_fir[3] => z[30]) = 0; |
| (acc_fir[4] => z[30]) = 0; |
| (acc_fir[5] => z[30]) = 0; |
| (acc_fir[0] => z[31]) = 0; |
| (acc_fir[1] => z[31]) = 0; |
| (acc_fir[2] => z[31]) = 0; |
| (acc_fir[3] => z[31]) = 0; |
| (acc_fir[4] => z[31]) = 0; |
| (acc_fir[5] => z[31]) = 0; |
| (acc_fir[0] => z[32]) = 0; |
| (acc_fir[1] => z[32]) = 0; |
| (acc_fir[2] => z[32]) = 0; |
| (acc_fir[3] => z[32]) = 0; |
| (acc_fir[4] => z[32]) = 0; |
| (acc_fir[5] => z[32]) = 0; |
| (acc_fir[0] => z[33]) = 0; |
| (acc_fir[1] => z[33]) = 0; |
| (acc_fir[2] => z[33]) = 0; |
| (acc_fir[3] => z[33]) = 0; |
| (acc_fir[4] => z[33]) = 0; |
| (acc_fir[5] => z[33]) = 0; |
| (acc_fir[0] => z[34]) = 0; |
| (acc_fir[1] => z[34]) = 0; |
| (acc_fir[2] => z[34]) = 0; |
| (acc_fir[3] => z[34]) = 0; |
| (acc_fir[4] => z[34]) = 0; |
| (acc_fir[5] => z[34]) = 0; |
| (acc_fir[0] => z[35]) = 0; |
| (acc_fir[1] => z[35]) = 0; |
| (acc_fir[2] => z[35]) = 0; |
| (acc_fir[3] => z[35]) = 0; |
| (acc_fir[4] => z[35]) = 0; |
| (acc_fir[5] => z[35]) = 0; |
| (acc_fir[0] => z[36]) = 0; |
| (acc_fir[1] => z[36]) = 0; |
| (acc_fir[2] => z[36]) = 0; |
| (acc_fir[3] => z[36]) = 0; |
| (acc_fir[4] => z[36]) = 0; |
| (acc_fir[5] => z[36]) = 0; |
| (acc_fir[0] => z[37]) = 0; |
| (acc_fir[1] => z[37]) = 0; |
| (acc_fir[2] => z[37]) = 0; |
| (acc_fir[3] => z[37]) = 0; |
| (acc_fir[4] => z[37]) = 0; |
| (acc_fir[5] => z[37]) = 0; |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULTADD_REGIN ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire [ 5:0] acc_fir, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [ 2:0] output_select, |
| input wire saturate_enable, |
| input wire [ 5:0] shift_right, |
| input wire round, |
| input wire subtract, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .dly_b(), |
| .z(z), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .acc_fir(acc_fir), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| |
| .output_select(output_select), // unregistered output: ACCin (2, 3) |
| .saturate_enable(saturate_enable), |
| .shift_right(shift_right), |
| .round(round), |
| .subtract(subtract), |
| .register_inputs(register_inputs) // registered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (posedge clk => (z +: a)) = 0; |
| (posedge clk => (z +: b)) = 0; |
| $setuphold(posedge clk, a, 0, 0); |
| $setuphold(posedge clk, b, 0, 0); |
| $setuphold(posedge clk, feedback, 0, 0); |
| $setuphold(posedge clk, load_acc, 0, 0); |
| $setuphold(posedge clk, subtract, 0, 0); |
| $setuphold(posedge clk, acc_fir, 0, 0); |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULTADD_REGOUT ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire [ 5:0] acc_fir, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [ 2:0] output_select, |
| input wire saturate_enable, |
| input wire [ 5:0] shift_right, |
| input wire round, |
| input wire subtract, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .dly_b(), |
| .z(z), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .acc_fir(acc_fir), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| |
| .output_select(output_select), // registered output: ACCin (6, 7) |
| .saturate_enable(saturate_enable), |
| .shift_right(shift_right), |
| .round(round), |
| .subtract(subtract), |
| .register_inputs(register_inputs) // unregistered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (posedge clk => (z +: a)) = 0; |
| (posedge clk => (z +: b)) = 0; |
| $setuphold(posedge clk, a, 0, 0); |
| $setuphold(posedge clk, b, 0, 0); |
| $setuphold(posedge clk, feedback, 0, 0); |
| $setuphold(posedge clk, load_acc, 0, 0); |
| $setuphold(posedge clk, subtract, 0, 0); |
| $setuphold(posedge clk, acc_fir, 0, 0); |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULTADD_REGIN_REGOUT ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire [ 5:0] acc_fir, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [ 2:0] output_select, |
| input wire saturate_enable, |
| input wire [ 5:0] shift_right, |
| input wire round, |
| input wire subtract, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .dly_b(), |
| .z(z), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .acc_fir(acc_fir), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| |
| .output_select(output_select), // registered output: ACCin (6, 7) |
| .saturate_enable(saturate_enable), |
| .shift_right(shift_right), |
| .round(round), |
| .subtract(subtract), |
| .register_inputs(register_inputs) // registered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (posedge clk => (z +: a)) = 0; |
| (posedge clk => (z +: b)) = 0; |
| $setuphold(posedge clk, a, 0, 0); |
| $setuphold(posedge clk, b, 0, 0); |
| $setuphold(posedge clk, feedback, 0, 0); |
| $setuphold(posedge clk, load_acc, 0, 0); |
| $setuphold(posedge clk, subtract, 0, 0); |
| $setuphold(posedge clk, acc_fir, 0, 0); |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULTACC ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire load_acc, |
| input wire [ 2:0] feedback, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [ 2:0] output_select, |
| input wire saturate_enable, |
| input wire [ 5:0] shift_right, |
| input wire round, |
| input wire subtract, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .acc_fir(6'b0), |
| .z(z), |
| .dly_b(), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| |
| .output_select(output_select), // unregistered output: ACCout (1) |
| .saturate_enable(saturate_enable), |
| .shift_right(shift_right), |
| .round(round), |
| .subtract(subtract), |
| .register_inputs(register_inputs) // unregistered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (posedge clk => (z +: a)) = 0; |
| (posedge clk => (z +: b)) = 0; |
| $setuphold(posedge clk, a, 0, 0); |
| $setuphold(posedge clk, b, 0, 0); |
| $setuphold(posedge clk, feedback, 0, 0); |
| $setuphold(posedge clk, load_acc, 0, 0); |
| $setuphold(posedge clk, subtract, 0, 0); |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULTACC_REGIN ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [ 2:0] output_select, |
| input wire saturate_enable, |
| input wire [ 5:0] shift_right, |
| input wire round, |
| input wire subtract, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .acc_fir(6'b0), |
| .z(z), |
| .dly_b(), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| |
| .output_select(output_select), // unregistered output: ACCout (1) |
| .saturate_enable(saturate_enable), |
| .shift_right(shift_right), |
| .round(round), |
| .subtract(subtract), |
| .register_inputs(register_inputs) // registered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (posedge clk => (z +: a)) = 0; |
| (posedge clk => (z +: b)) = 0; |
| $setuphold(posedge clk, a, 0, 0); |
| $setuphold(posedge clk, b, 0, 0); |
| $setuphold(posedge clk, feedback, 0, 0); |
| $setuphold(posedge clk, load_acc, 0, 0); |
| $setuphold(posedge clk, subtract, 0, 0); |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULTACC_REGOUT ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [ 2:0] output_select, |
| input wire saturate_enable, |
| input wire [ 5:0] shift_right, |
| input wire round, |
| input wire subtract, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .acc_fir(6'b0), |
| .z(z), |
| .dly_b(), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| |
| .output_select(output_select), // registered output: ACCout (5) |
| .saturate_enable(saturate_enable), |
| .shift_right(shift_right), |
| .round(round), |
| .subtract(subtract), |
| .register_inputs(register_inputs) // unregistered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (posedge clk => (z +: a)) = 0; |
| (posedge clk => (z +: b)) = 0; |
| $setuphold(posedge clk, a, 0, 0); |
| $setuphold(posedge clk, b, 0, 0); |
| $setuphold(posedge clk, feedback, 0, 0); |
| $setuphold(posedge clk, load_acc, 0, 0); |
| $setuphold(posedge clk, subtract, 0, 0); |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module QL_DSP2_MULTACC_REGIN_REGOUT ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| |
| input wire f_mode, |
| input wire [ 2:0] output_select, |
| input wire saturate_enable, |
| input wire [ 5:0] shift_right, |
| input wire round, |
| input wire subtract, |
| input wire register_inputs |
| ); |
| |
| parameter [79:0] MODE_BITS = 80'd0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .acc_fir(6'b0), |
| .z(z), |
| .dly_b(), |
| |
| .f_mode(f_mode), |
| |
| .feedback(feedback), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| |
| .output_select(output_select), // registered output: ACCout (5) |
| .saturate_enable(saturate_enable), |
| .shift_right(shift_right), |
| .round(round), |
| .subtract(subtract), |
| .register_inputs(register_inputs) // registered inputs |
| ); |
| |
| `ifdef SDF_SIM |
| specify |
| (posedge clk => (z +: a)) = 0; |
| (posedge clk => (z +: b)) = 0; |
| $setuphold(posedge clk, a, 0, 0); |
| $setuphold(posedge clk, b, 0, 0); |
| $setuphold(posedge clk, feedback, 0, 0); |
| $setuphold(posedge clk, load_acc, 0, 0); |
| $setuphold(posedge clk, subtract, 0, 0); |
| endspecify |
| `endif |
| |
| endmodule |
| |
| module dsp_t1_20x18x64_cfg_ports ( |
| input wire [19:0] a_i, |
| input wire [17:0] b_i, |
| input wire [ 5:0] acc_fir_i, |
| output wire [37:0] z_o, |
| output wire [17:0] dly_b_o, |
| |
| (* clkbuf_sink *) |
| input wire clock_i, |
| input wire reset_i, |
| |
| input wire [ 2:0] feedback_i, |
| input wire load_acc_i, |
| input wire unsigned_a_i, |
| input wire unsigned_b_i, |
| |
| input wire [ 2:0] output_select_i, |
| input wire saturate_enable_i, |
| input wire [ 5:0] shift_right_i, |
| input wire round_i, |
| input wire subtract_i, |
| input wire register_inputs_i |
| ); |
| |
| parameter [19:0] COEFF_0 = 20'd0; |
| parameter [19:0] COEFF_1 = 20'd0; |
| parameter [19:0] COEFF_2 = 20'd0; |
| parameter [19:0] COEFF_3 = 20'd0; |
| |
| QL_DSP2 #( |
| .MODE_BITS({COEFF_3, COEFF_2, COEFF_1, COEFF_0}) |
| ) dsp ( |
| .a(a_i), |
| .b(b_i), |
| .z(z_o), |
| .dly_b(dly_b_o), |
| |
| .f_mode(1'b0), // 20x18x64 DSP |
| |
| .acc_fir(acc_fir_i), |
| .feedback(feedback_i), |
| .load_acc(load_acc_i), |
| |
| .unsigned_a(unsigned_a_i), |
| .unsigned_b(unsigned_b_i), |
| |
| .clk(clock_i), |
| .reset(reset_i), |
| |
| .saturate_enable(saturate_enable_i), |
| .output_select(output_select_i), |
| .round(round_i), |
| .shift_right(shift_right_i), |
| .subtract(subtract_i), |
| .register_inputs(register_inputs_i) |
| ); |
| endmodule |
| |
| module dsp_t1_10x9x32_cfg_ports ( |
| input wire [ 9:0] a_i, |
| input wire [ 8:0] b_i, |
| input wire [ 5:0] acc_fir_i, |
| output wire [18:0] z_o, |
| output wire [ 8:0] dly_b_o, |
| |
| (* clkbuf_sink *) |
| input wire clock_i, |
| input wire reset_i, |
| |
| input wire [ 2:0] feedback_i, |
| input wire load_acc_i, |
| input wire unsigned_a_i, |
| input wire unsigned_b_i, |
| |
| input wire [ 2:0] output_select_i, |
| input wire saturate_enable_i, |
| input wire [ 5:0] shift_right_i, |
| input wire round_i, |
| input wire subtract_i, |
| input wire register_inputs_i |
| ); |
| |
| parameter [9:0] COEFF_0 = 10'd0; |
| parameter [9:0] COEFF_1 = 10'd0; |
| parameter [9:0] COEFF_2 = 10'd0; |
| parameter [9:0] COEFF_3 = 10'd0; |
| |
| wire [18:0] z_rem; |
| wire [8:0] dly_b_rem; |
| |
| QL_DSP2 #( |
| .MODE_BITS({10'd0, COEFF_3, |
| 10'd0, COEFF_2, |
| 10'd0, COEFF_1, |
| 10'd0, COEFF_0}) |
| ) dsp ( |
| .a({10'd0, a_i}), |
| .b({9'd0, b_i}), |
| .z({z_rem, z_o}), |
| .dly_b({dly_b_rem, dly_b_o}), |
| |
| .f_mode(1'b1), // 10x9x32 DSP |
| |
| .acc_fir(acc_fir_i), |
| .feedback(feedback_i), |
| .load_acc(load_acc_i), |
| |
| .unsigned_a(unsigned_a_i), |
| .unsigned_b(unsigned_b_i), |
| |
| .clk(clock_i), |
| .reset(reset_i), |
| |
| .saturate_enable(saturate_enable_i), |
| .output_select(output_select_i), |
| .round(round_i), |
| .shift_right(shift_right_i), |
| .subtract(subtract_i), |
| .register_inputs(register_inputs_i) |
| ); |
| endmodule |
| |
| module dsp_t1_sim_cfg_ports # ( |
| parameter NBITS_ACC = 64, |
| parameter NBITS_A = 20, |
| parameter NBITS_B = 18, |
| parameter NBITS_Z = 38 |
| )( |
| input wire [NBITS_A-1:0] a_i, |
| input wire [NBITS_B-1:0] b_i, |
| output wire [NBITS_Z-1:0] z_o, |
| output reg [NBITS_B-1:0] dly_b_o, |
| |
| input wire [5:0] acc_fir_i, |
| input wire [2:0] feedback_i, |
| input wire load_acc_i, |
| |
| input wire unsigned_a_i, |
| input wire unsigned_b_i, |
| |
| input wire clock_i, |
| input wire s_reset, |
| |
| input wire saturate_enable_i, |
| input wire [2:0] output_select_i, |
| input wire round_i, |
| input wire [5:0] shift_right_i, |
| input wire subtract_i, |
| input wire register_inputs_i, |
| input wire [NBITS_A-1:0] coef_0_i, |
| input wire [NBITS_A-1:0] coef_1_i, |
| input wire [NBITS_A-1:0] coef_2_i, |
| input wire [NBITS_A-1:0] coef_3_i |
| ); |
| |
| // FIXME: The version of Icarus Verilog from Conda seems not to recognize the |
| // $error macro. Disable this sanity check for now because of that. |
| |
| |
| // Input registers |
| reg [NBITS_A-1:0] r_a; |
| reg [NBITS_B-1:0] r_b; |
| reg [5:0] r_acc_fir; |
| reg r_unsigned_a; |
| reg r_unsigned_b; |
| reg r_load_acc; |
| reg [2:0] r_feedback; |
| reg [5:0] r_shift_d1; |
| reg [5:0] r_shift_d2; |
| reg r_subtract; |
| reg r_sat; |
| reg r_rnd; |
| reg [NBITS_ACC-1:0] acc; |
| |
| initial begin |
| r_a <= 0; |
| r_b <= 0; |
| |
| r_acc_fir <= 0; |
| r_unsigned_a <= 0; |
| r_unsigned_b <= 0; |
| r_feedback <= 0; |
| r_shift_d1 <= 0; |
| r_shift_d2 <= 0; |
| r_subtract <= 0; |
| r_load_acc <= 0; |
| r_sat <= 0; |
| r_rnd <= 0; |
| end |
| |
| always @(posedge clock_i or posedge s_reset) begin |
| if (s_reset) begin |
| |
| r_a <= 'h0; |
| r_b <= 'h0; |
| |
| r_acc_fir <= 0; |
| r_unsigned_a <= 0; |
| r_unsigned_b <= 0; |
| r_feedback <= 0; |
| r_shift_d1 <= 0; |
| r_shift_d2 <= 0; |
| r_subtract <= 0; |
| r_load_acc <= 0; |
| r_sat <= 0; |
| r_rnd <= 0; |
| |
| end else begin |
| |
| r_a <= a_i; |
| r_b <= b_i; |
| |
| r_acc_fir <= acc_fir_i; |
| r_unsigned_a <= unsigned_a_i; |
| r_unsigned_b <= unsigned_b_i; |
| r_feedback <= feedback_i; |
| r_shift_d1 <= shift_right_i; |
| r_shift_d2 <= r_shift_d1; |
| r_subtract <= subtract_i; |
| r_load_acc <= load_acc_i; |
| r_sat <= r_sat; |
| r_rnd <= r_rnd; |
| |
| end |
| end |
| |
| // Registered / non-registered input path select |
| wire [NBITS_A-1:0] a = register_inputs_i ? r_a : a_i; |
| wire [NBITS_B-1:0] b = register_inputs_i ? r_b : b_i; |
| |
| wire [5:0] acc_fir = register_inputs_i ? r_acc_fir : acc_fir_i; |
| wire unsigned_a = register_inputs_i ? r_unsigned_a : unsigned_a_i; |
| wire unsigned_b = register_inputs_i ? r_unsigned_b : unsigned_b_i; |
| wire [2:0] feedback = register_inputs_i ? r_feedback : feedback_i; |
| wire load_acc = register_inputs_i ? r_load_acc : load_acc_i; |
| wire subtract = register_inputs_i ? r_subtract : subtract_i; |
| wire sat = register_inputs_i ? r_sat : saturate_enable_i; |
| wire rnd = register_inputs_i ? r_rnd : round_i; |
| |
| // Shift right control |
| wire [5:0] shift_d1 = register_inputs_i ? r_shift_d1 : shift_right_i; |
| wire [5:0] shift_d2 = output_select_i[1] ? shift_d1 : r_shift_d2; |
| |
| // Multiplier |
| wire unsigned_mode = unsigned_a & unsigned_b; |
| wire [NBITS_A-1:0] mult_a; |
| assign mult_a = (feedback == 3'h0) ? a : |
| (feedback == 3'h1) ? a : |
| (feedback == 3'h2) ? a : |
| (feedback == 3'h3) ? acc[NBITS_A-1:0] : |
| (feedback == 3'h4) ? coef_0_i : |
| (feedback == 3'h5) ? coef_1_i : |
| (feedback == 3'h6) ? coef_2_i : |
| coef_3_i; // if feedback == 3'h7 |
| |
| wire [NBITS_B-1:0] mult_b = (feedback == 2'h2) ? {NBITS_B{1'b0}} : b; |
| |
| wire [NBITS_A-1:0] mult_sgn_a = mult_a[NBITS_A-1]; |
| wire [NBITS_A-1:0] mult_mag_a = (mult_sgn_a && !unsigned_a) ? (~mult_a + 1) : mult_a; |
| wire [NBITS_B-1:0] mult_sgn_b = mult_b[NBITS_B-1]; |
| wire [NBITS_B-1:0] mult_mag_b = (mult_sgn_b && !unsigned_b) ? (~mult_b + 1) : mult_b; |
| |
| wire [NBITS_A+NBITS_B-1:0] mult_mag = mult_mag_a * mult_mag_b; |
| wire mult_sgn = (mult_sgn_a && !unsigned_a) ^ (mult_sgn_b && !unsigned_b); |
| |
| wire [NBITS_A+NBITS_B-1:0] mult = (unsigned_a && unsigned_b) ? |
| (mult_a * mult_b) : (mult_sgn ? (~mult_mag + 1) : mult_mag); |
| |
| // Sign extension |
| wire [NBITS_ACC-1:0] mult_xtnd = unsigned_mode ? |
| {{(NBITS_ACC-NBITS_A-NBITS_B){1'b0}}, mult[NBITS_A+NBITS_B-1:0]} : |
| {{(NBITS_ACC-NBITS_A-NBITS_B){mult[NBITS_A+NBITS_B-1]}}, mult[NBITS_A+NBITS_B-1:0]}; |
| |
| // Adder |
| wire [NBITS_ACC-1:0] acc_fir_int = unsigned_a ? {{(NBITS_ACC-NBITS_A){1'b0}}, a} : |
| {{(NBITS_ACC-NBITS_A){a[NBITS_A-1]}}, a} ; |
| |
| wire [NBITS_ACC-1:0] add_a = (subtract) ? (~mult_xtnd + 1) : mult_xtnd; |
| wire [NBITS_ACC-1:0] add_b = (feedback_i == 3'h0) ? acc : |
| (feedback_i == 3'h1) ? {{NBITS_ACC}{1'b0}} : (acc_fir_int << acc_fir); |
| |
| wire [NBITS_ACC-1:0] add_o = add_a + add_b; |
| |
| // Accumulator |
| initial acc <= 0; |
| |
| always @(posedge clock_i or posedge s_reset) |
| if (s_reset) acc <= 'h0; |
| else begin |
| if (load_acc) |
| acc <= add_o; |
| else |
| acc <= acc; |
| end |
| |
| // Adder/accumulator output selection |
| wire [NBITS_ACC-1:0] acc_out = (output_select_i[1]) ? add_o : acc; |
| |
| // Round, shift, saturate |
| wire [NBITS_ACC-1:0] acc_rnd = (rnd && (shift_right_i != 0)) ? (acc_out + ({{(NBITS_ACC-1){1'b0}}, 1'b1} << (shift_right_i - 1))) : |
| acc_out; |
| |
| wire [NBITS_ACC-1:0] acc_shr = (unsigned_mode) ? (acc_rnd >> shift_right_i) : |
| (acc_rnd >>> shift_right_i); |
| |
| 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}}} : |
| {{(NBITS_ACC-NBITS_Z){1'b0}},{acc_shr[NBITS_Z-1:0]}}; |
| |
| wire [NBITS_ACC-1:0] acc_sat_s = ((|acc_shr[NBITS_ACC-1:NBITS_Z-1] == 1'b0) || |
| (&acc_shr[NBITS_ACC-1:NBITS_Z-1] == 1'b1)) ? {{(NBITS_ACC-NBITS_Z){1'b0}},{acc_shr[NBITS_Z-1:0]}} : |
| {{(NBITS_ACC-NBITS_Z){1'b0}},{acc_shr[NBITS_ACC-1],{NBITS_Z-1{~acc_shr[NBITS_ACC-1]}}}}; |
| |
| wire [NBITS_ACC-1:0] acc_sat = (sat) ? ((unsigned_mode) ? acc_sat_u : acc_sat_s) : acc_shr; |
| |
| // Output signals |
| wire [NBITS_Z-1:0] z0; |
| reg [NBITS_Z-1:0] z1; |
| wire [NBITS_Z-1:0] z2; |
| |
| assign z0 = mult_xtnd[NBITS_Z-1:0]; |
| assign z2 = acc_sat[NBITS_Z-1:0]; |
| |
| initial z1 <= 0; |
| |
| always @(posedge clock_i or posedge s_reset) |
| if (s_reset) |
| z1 <= 0; |
| else begin |
| z1 <= (output_select_i == 3'b100) ? z0 : z2; |
| end |
| |
| // Output mux |
| assign z_o = (output_select_i == 3'h0) ? z0 : |
| (output_select_i == 3'h1) ? z2 : |
| (output_select_i == 3'h2) ? z2 : |
| (output_select_i == 3'h3) ? z2 : |
| (output_select_i == 3'h4) ? z1 : |
| (output_select_i == 3'h5) ? z1 : |
| (output_select_i == 3'h6) ? z1 : |
| z1; // if output_select_i == 3'h7 |
| |
| // B input delayed passthrough |
| initial dly_b_o <= 0; |
| |
| always @(posedge clock_i or posedge s_reset) |
| if (s_reset) |
| dly_b_o <= 0; |
| else |
| dly_b_o <= b_i; |
| |
| endmodule |
| |
| |
| |
| // ---------------------------------------- // |
| // ----- DSP cells simulation modules ----- // |
| // ------ Control bits in parameters ------ // |
| // ---------------------------------------- // |
| |
| module QL_DSP3 ( // TODO: Name subject to change |
| input wire [19:0] a, |
| input wire [17:0] b, |
| input wire [ 5:0] acc_fir, |
| output wire [37:0] z, |
| output wire [17:0] dly_b, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [2:0] feedback, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire subtract |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; |
| |
| localparam NBITS_ACC = 64; |
| localparam NBITS_A = 20; |
| localparam NBITS_B = 18; |
| localparam NBITS_Z = 38; |
| |
| // Fractured |
| generate if(F_MODE == 1'b1) begin |
| |
| wire [(NBITS_Z/2)-1:0] dsp_frac0_z; |
| wire [(NBITS_Z/2)-1:0] dsp_frac1_z; |
| |
| wire [(NBITS_B/2)-1:0] dsp_frac0_dly_b; |
| wire [(NBITS_B/2)-1:0] dsp_frac1_dly_b; |
| |
| dsp_t1_sim_cfg_params #( |
| .NBITS_A (NBITS_A/2), |
| .NBITS_B (NBITS_B/2), |
| .NBITS_ACC (NBITS_ACC/2), |
| .NBITS_Z (NBITS_Z/2), |
| .OUTPUT_SELECT (OUTPUT_SELECT), |
| .SATURATE_ENABLE (SATURATE_ENABLE), |
| .SHIFT_RIGHT (SHIFT_RIGHT), |
| .ROUND (ROUND), |
| .REGISTER_INPUTS (REGISTER_INPUTS) |
| ) dsp_frac0 ( |
| .a_i(a[(NBITS_A/2)-1:0]), |
| .b_i(b[(NBITS_B/2)-1:0]), |
| .z_o(dsp_frac0_z), |
| .dly_b_o(dsp_frac0_dly_b), |
| |
| .acc_fir_i(acc_fir), |
| .feedback_i(feedback), |
| .load_acc_i(load_acc), |
| |
| .unsigned_a_i(unsigned_a), |
| .unsigned_b_i(unsigned_b), |
| |
| .clock_i(clk), |
| .s_reset(reset), |
| |
| .subtract_i(subtract), |
| .coef_0_i(COEFF_0[(NBITS_A/2)-1:0]), |
| .coef_1_i(COEFF_1[(NBITS_A/2)-1:0]), |
| .coef_2_i(COEFF_2[(NBITS_A/2)-1:0]), |
| .coef_3_i(COEFF_3[(NBITS_A/2)-1:0]) |
| ); |
| |
| dsp_t1_sim_cfg_params #( |
| .NBITS_A (NBITS_A/2), |
| .NBITS_B (NBITS_B/2), |
| .NBITS_ACC (NBITS_ACC/2), |
| .NBITS_Z (NBITS_Z/2), |
| .OUTPUT_SELECT (OUTPUT_SELECT), |
| .SATURATE_ENABLE (SATURATE_ENABLE), |
| .SHIFT_RIGHT (SHIFT_RIGHT), |
| .ROUND (ROUND), |
| .REGISTER_INPUTS (REGISTER_INPUTS) |
| ) dsp_frac1 ( |
| .a_i(a[NBITS_A-1:NBITS_A/2]), |
| .b_i(b[NBITS_B-1:NBITS_B/2]), |
| .z_o(dsp_frac1_z), |
| .dly_b_o(dsp_frac1_dly_b), |
| .acc_fir_i(acc_fir), |
| .feedback_i(feedback), |
| .load_acc_i(load_acc), |
| |
| .unsigned_a_i(unsigned_a), |
| .unsigned_b_i(unsigned_b), |
| |
| .clock_i(clk), |
| .s_reset(reset), |
| |
| .subtract_i(subtract), |
| .coef_0_i(COEFF_0[NBITS_A-1:NBITS_A/2]), |
| .coef_1_i(COEFF_1[NBITS_A-1:NBITS_A/2]), |
| .coef_2_i(COEFF_2[NBITS_A-1:NBITS_A/2]), |
| .coef_3_i(COEFF_3[NBITS_A-1:NBITS_A/2]) |
| ); |
| |
| assign z = {dsp_frac1_z, dsp_frac0_z}; |
| assign dly_b = {dsp_frac1_dly_b, dsp_frac0_dly_b}; |
| |
| // Whole |
| end else begin |
| |
| dsp_t1_sim_cfg_params #( |
| .NBITS_A (NBITS_A), |
| .NBITS_B (NBITS_B), |
| .NBITS_ACC (NBITS_ACC), |
| .NBITS_Z (NBITS_Z), |
| .OUTPUT_SELECT (OUTPUT_SELECT), |
| .SATURATE_ENABLE (SATURATE_ENABLE), |
| .SHIFT_RIGHT (SHIFT_RIGHT), |
| .ROUND (ROUND), |
| .REGISTER_INPUTS (REGISTER_INPUTS) |
| ) dsp_full ( |
| .a_i(a), |
| .b_i(b), |
| .z_o(z), |
| .dly_b_o(dly_b), |
| |
| .acc_fir_i(acc_fir), |
| .feedback_i(feedback), |
| .load_acc_i(load_acc), |
| |
| .unsigned_a_i(unsigned_a), |
| .unsigned_b_i(unsigned_b), |
| |
| .clock_i(clk), |
| .s_reset(reset), |
| |
| .subtract_i(subtract), |
| .coef_0_i(COEFF_0), |
| .coef_1_i(COEFF_1), |
| .coef_2_i(COEFF_2), |
| .coef_3_i(COEFF_3) |
| ); |
| |
| end endgenerate |
| |
| endmodule |
| |
| module QL_DSP3_MULT ( // TODO: Name subject to change |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| input wire reset, |
| |
| input wire [2:0] feedback, |
| input wire unsigned_a, |
| input wire unsigned_b |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; // unregistered output: a * b (0) |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; // unregistered inputs |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .reset(reset), |
| |
| .feedback(feedback), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULT_REGIN ( // TODO: Name subject to change |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [2:0] feedback, |
| |
| input wire unsigned_a, |
| input wire unsigned_b |
| ); |
| |
| wire [37:0] dly_b_o; |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; // unregistered output: a * b (0) |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; // registered inputs |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULT_REGOUT ( // TODO: Name subject to change |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [2:0] feedback, |
| |
| input wire unsigned_a, |
| input wire unsigned_b |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; // registered output: a * b (4) |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; // unregistered inputs |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULT_REGIN_REGOUT ( // TODO: Name subject to change |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [2:0] feedback, |
| |
| input wire unsigned_a, |
| input wire unsigned_b |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; // registered output: a * b (4) |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; // unregistered inputs |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULTADD ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire [ 5:0] acc_fir, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire subtract |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| .acc_fir(acc_fir), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .reset(reset), |
| .subtract(subtract) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULTADD_REGIN ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire [ 5:0] acc_fir, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire subtract |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| .acc_fir(acc_fir), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| .subtract(subtract) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULTADD_REGOUT ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire [ 5:0] acc_fir, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire subtract |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| .acc_fir(acc_fir), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| .subtract(subtract) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULTADD_REGIN_REGOUT ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire [ 5:0] acc_fir, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire subtract |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| .acc_fir(acc_fir), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| .subtract(subtract) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULTACC ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire subtract |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| .subtract(subtract) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULTACC_REGIN ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire subtract |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| .subtract(subtract) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULTACC_REGOUT ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire subtract |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| .subtract(subtract) |
| ); |
| endmodule |
| |
| module QL_DSP3_MULTACC_REGIN_REGOUT ( |
| input wire [19:0] a, |
| input wire [17:0] b, |
| output wire [37:0] z, |
| |
| (* clkbuf_sink *) |
| input wire clk, |
| input wire reset, |
| |
| input wire [ 2:0] feedback, |
| input wire load_acc, |
| input wire unsigned_a, |
| input wire unsigned_b, |
| input wire subtract |
| ); |
| |
| parameter [92:0] MODE_BITS = 93'b0; |
| |
| localparam [19:0] COEFF_0 = MODE_BITS[19:0]; |
| localparam [19:0] COEFF_1 = MODE_BITS[39:20]; |
| localparam [19:0] COEFF_2 = MODE_BITS[59:40]; |
| localparam [19:0] COEFF_3 = MODE_BITS[79:60]; |
| |
| localparam [0:0] F_MODE = MODE_BITS[80]; |
| localparam [2:0] OUTPUT_SELECT = MODE_BITS[83:81]; |
| localparam [0:0] SATURATE_ENABLE = MODE_BITS[84]; |
| localparam [5:0] SHIFT_RIGHT = MODE_BITS[90:85]; |
| localparam [0:0] ROUND = MODE_BITS[91]; |
| localparam [0:0] REGISTER_INPUTS = MODE_BITS[92]; |
| |
| QL_DSP3 #( |
| .MODE_BITS({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| F_MODE, |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a), |
| .b(b), |
| .z(z), |
| |
| .feedback(feedback), |
| .load_acc(load_acc), |
| |
| .unsigned_a(unsigned_a), |
| .unsigned_b(unsigned_b), |
| |
| .clk(clk), |
| .reset(reset), |
| .subtract(subtract) |
| ); |
| endmodule |
| |
| module dsp_t1_20x18x64_cfg_params ( |
| input wire [19:0] a_i, |
| input wire [17:0] b_i, |
| input wire [ 5:0] acc_fir_i, |
| output wire [37:0] z_o, |
| output wire [17:0] dly_b_o, |
| |
| (* clkbuf_sink *) |
| input wire clock_i, |
| input wire reset_i, |
| |
| input wire [ 2:0] feedback_i, |
| input wire load_acc_i, |
| input wire unsigned_a_i, |
| input wire unsigned_b_i, |
| input wire subtract_i |
| ); |
| |
| parameter [19:0] COEFF_0 = 20'b0; |
| parameter [19:0] COEFF_1 = 20'b0; |
| parameter [19:0] COEFF_2 = 20'b0; |
| parameter [19:0] COEFF_3 = 20'b0; |
| |
| parameter [2:0] OUTPUT_SELECT = 3'b0; |
| parameter [0:0] SATURATE_ENABLE = 1'b0; |
| parameter [5:0] SHIFT_RIGHT = 6'b0; |
| parameter [0:0] ROUND = 1'b0; |
| parameter [0:0] REGISTER_INPUTS = 1'b0; |
| |
| QL_DSP3 #( |
| .MODE_BITS ({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| 1'b0, // Not fractured |
| COEFF_3, |
| COEFF_2, |
| COEFF_1, |
| COEFF_0 |
| }) |
| ) dsp ( |
| .a(a_i), |
| .b(b_i), |
| .z(z_o), |
| .dly_b(dly_b_o), |
| |
| .acc_fir(acc_fir_i), |
| .feedback(feedback_i), |
| .load_acc(load_acc_i), |
| |
| .unsigned_a(unsigned_a_i), |
| .unsigned_b(unsigned_b_i), |
| |
| .clk(clock_i), |
| .reset(reset_i), |
| .subtract(subtract_i) |
| ); |
| endmodule |
| |
| module dsp_t1_10x9x32_cfg_params ( |
| input wire [ 9:0] a_i, |
| input wire [ 8:0] b_i, |
| input wire [ 5:0] acc_fir_i, |
| output wire [18:0] z_o, |
| output wire [ 8:0] dly_b_o, |
| |
| (* clkbuf_sink *) |
| input wire clock_i, |
| input wire reset_i, |
| |
| input wire [ 2:0] feedback_i, |
| input wire load_acc_i, |
| input wire unsigned_a_i, |
| input wire unsigned_b_i, |
| input wire subtract_i |
| ); |
| |
| parameter [9:0] COEFF_0 = 10'b0; |
| parameter [9:0] COEFF_1 = 10'b0; |
| parameter [9:0] COEFF_2 = 10'b0; |
| parameter [9:0] COEFF_3 = 10'b0; |
| |
| parameter [2:0] OUTPUT_SELECT = 3'b0; |
| parameter [0:0] SATURATE_ENABLE = 1'b0; |
| parameter [5:0] SHIFT_RIGHT = 6'b0; |
| parameter [0:0] ROUND = 1'b0; |
| parameter [0:0] REGISTER_INPUTS = 1'b0; |
| |
| wire [18:0] z_rem; |
| wire [8:0] dly_b_rem; |
| |
| QL_DSP3 #( |
| .MODE_BITS ({ |
| REGISTER_INPUTS, |
| ROUND, |
| SHIFT_RIGHT, |
| SATURATE_ENABLE, |
| OUTPUT_SELECT, |
| 1'b1, // Fractured |
| 10'd0, COEFF_3, |
| 10'd0, COEFF_2, |
| 10'd0, COEFF_1, |
| 10'd0, COEFF_0 |
| }) |
| ) dsp ( |
| .a({10'b0, a_i}), |
| .b({9'b0, b_i}), |
| .z({z_rem, z_o}), |
| .dly_b({dly_b_rem, dly_b_o}), |
| |
| .acc_fir(acc_fir_i), |
| .feedback(feedback_i), |
| .load_acc(load_acc_i), |
| |
| .unsigned_a(unsigned_a_i), |
| .unsigned_b(unsigned_b_i), |
| |
| .clk(clock_i), |
| .reset(reset_i), |
| .subtract(subtract_i) |
| ); |
| endmodule |
| |
| module dsp_t1_sim_cfg_params # ( |
| parameter NBITS_ACC = 64, |
| parameter NBITS_A = 20, |
| parameter NBITS_B = 18, |
| parameter NBITS_Z = 38, |
| |
| parameter [2:0] OUTPUT_SELECT = 3'b0, |
| parameter [0:0] SATURATE_ENABLE = 1'b0, |
| parameter [5:0] SHIFT_RIGHT = 6'b0, |
| parameter [0:0] ROUND = 1'b0, |
| parameter [0:0] REGISTER_INPUTS = 1'b0 |
| )( |
| input wire [NBITS_A-1:0] a_i, |
| input wire [NBITS_B-1:0] b_i, |
| output wire [NBITS_Z-1:0] z_o, |
| output reg [NBITS_B-1:0] dly_b_o, |
| |
| input wire [5:0] acc_fir_i, |
| input wire [2:0] feedback_i, |
| input wire load_acc_i, |
| |
| input wire unsigned_a_i, |
| input wire unsigned_b_i, |
| |
| input wire clock_i, |
| input wire s_reset, |
| |
| input wire subtract_i, |
| input wire [NBITS_A-1:0] coef_0_i, |
| input wire [NBITS_A-1:0] coef_1_i, |
| input wire [NBITS_A-1:0] coef_2_i, |
| input wire [NBITS_A-1:0] coef_3_i |
| ); |
| |
| // FIXME: The version of Icarus Verilog from Conda seems not to recognize the |
| // $error macro. Disable this sanity check for now because of that. |
| |
| // Input registers |
| reg [NBITS_A-1:0] r_a; |
| reg [NBITS_B-1:0] r_b; |
| reg [5:0] r_acc_fir; |
| reg r_unsigned_a; |
| reg r_unsigned_b; |
| reg r_load_acc; |
| reg [2:0] r_feedback; |
| reg [5:0] r_shift_d1; |
| reg [5:0] r_shift_d2; |
| reg r_subtract; |
| reg r_sat; |
| reg r_rnd; |
| reg [NBITS_ACC-1:0] acc; |
| |
| initial begin |
| r_a <= 0; |
| r_b <= 0; |
| |
| r_acc_fir <= 0; |
| r_unsigned_a <= 0; |
| r_unsigned_b <= 0; |
| r_feedback <= 0; |
| r_shift_d1 <= 0; |
| r_shift_d2 <= 0; |
| r_subtract <= 0; |
| r_load_acc <= 0; |
| r_sat <= 0; |
| r_rnd <= 0; |
| end |
| |
| always @(posedge clock_i or posedge s_reset) begin |
| if (s_reset) begin |
| |
| r_a <= 'h0; |
| r_b <= 'h0; |
| |
| r_acc_fir <= 0; |
| r_unsigned_a <= 0; |
| r_unsigned_b <= 0; |
| r_feedback <= 0; |
| r_shift_d1 <= 0; |
| r_shift_d2 <= 0; |
| r_subtract <= 0; |
| r_load_acc <= 0; |
| r_sat <= 0; |
| r_rnd <= 0; |
| |
| end else begin |
| |
| r_a <= a_i; |
| r_b <= b_i; |
| |
| r_acc_fir <= acc_fir_i; |
| r_unsigned_a <= unsigned_a_i; |
| r_unsigned_b <= unsigned_b_i; |
| r_feedback <= feedback_i; |
| r_shift_d1 <= SHIFT_RIGHT; |
| r_shift_d2 <= r_shift_d1; |
| r_subtract <= subtract_i; |
| r_load_acc <= load_acc_i; |
| r_sat <= r_sat; |
| r_rnd <= r_rnd; |
| |
| end |
| end |
| |
| // Registered / non-registered input path select |
| wire [NBITS_A-1:0] a = REGISTER_INPUTS ? r_a : a_i; |
| wire [NBITS_B-1:0] b = REGISTER_INPUTS ? r_b : b_i; |
| |
| wire [5:0] acc_fir = REGISTER_INPUTS ? r_acc_fir : acc_fir_i; |
| wire unsigned_a = REGISTER_INPUTS ? r_unsigned_a : unsigned_a_i; |
| wire unsigned_b = REGISTER_INPUTS ? r_unsigned_b : unsigned_b_i; |
| wire [2:0] feedback = REGISTER_INPUTS ? r_feedback : feedback_i; |
| wire load_acc = REGISTER_INPUTS ? r_load_acc : load_acc_i; |
| wire subtract = REGISTER_INPUTS ? r_subtract : subtract_i; |
| wire sat = REGISTER_INPUTS ? r_sat : SATURATE_ENABLE; |
| wire rnd = REGISTER_INPUTS ? r_rnd : ROUND; |
| |
| // Shift right control |
| wire [5:0] shift_d1 = REGISTER_INPUTS ? r_shift_d1 : SHIFT_RIGHT; |
| wire [5:0] shift_d2 = OUTPUT_SELECT[1] ? shift_d1 : r_shift_d2; |
| |
| // Multiplier |
| wire unsigned_mode = unsigned_a & unsigned_b; |
| wire [NBITS_A-1:0] mult_a; |
| assign mult_a = (feedback == 3'h0) ? a : |
| (feedback == 3'h1) ? a : |
| (feedback == 3'h2) ? a : |
| (feedback == 3'h3) ? acc[NBITS_A-1:0] : |
| (feedback == 3'h4) ? coef_0_i : |
| (feedback == 3'h5) ? coef_1_i : |
| (feedback == 3'h6) ? coef_2_i : |
| coef_3_i; // if feedback == 3'h7 |
| |
| wire [NBITS_B-1:0] mult_b = (feedback == 2'h2) ? {NBITS_B{1'b0}} : b; |
| |
| wire [NBITS_A-1:0] mult_sgn_a = mult_a[NBITS_A-1]; |
| wire [NBITS_A-1:0] mult_mag_a = (mult_sgn_a && !unsigned_a) ? (~mult_a + 1) : mult_a; |
| wire [NBITS_B-1:0] mult_sgn_b = mult_b[NBITS_B-1]; |
| wire [NBITS_B-1:0] mult_mag_b = (mult_sgn_b && !unsigned_b) ? (~mult_b + 1) : mult_b; |
| |
| wire [NBITS_A+NBITS_B-1:0] mult_mag = mult_mag_a * mult_mag_b; |
| wire mult_sgn = (mult_sgn_a && !unsigned_a) ^ (mult_sgn_b && !unsigned_b); |
| |
| wire [NBITS_A+NBITS_B-1:0] mult = (unsigned_a && unsigned_b) ? |
| (mult_a * mult_b) : (mult_sgn ? (~mult_mag + 1) : mult_mag); |
| |
| // Sign extension |
| wire [NBITS_ACC-1:0] mult_xtnd = unsigned_mode ? |
| {{(NBITS_ACC-NBITS_A-NBITS_B){1'b0}}, mult[NBITS_A+NBITS_B-1:0]} : |
| {{(NBITS_ACC-NBITS_A-NBITS_B){mult[NBITS_A+NBITS_B-1]}}, mult[NBITS_A+NBITS_B-1:0]}; |
| |
| // Adder |
| wire [NBITS_ACC-1:0] acc_fir_int = unsigned_a ? {{(NBITS_ACC-NBITS_A){1'b0}}, a} : |
| {{(NBITS_ACC-NBITS_A){a[NBITS_A-1]}}, a} ; |
| |
| wire [NBITS_ACC-1:0] add_a = (subtract) ? (~mult_xtnd + 1) : mult_xtnd; |
| wire [NBITS_ACC-1:0] add_b = (feedback_i == 3'h0) ? acc : |
| (feedback_i == 3'h1) ? {{NBITS_ACC}{1'b0}} : (acc_fir_int << acc_fir); |
| |
| wire [NBITS_ACC-1:0] add_o = add_a + add_b; |
| |
| // Accumulator |
| initial acc <= 0; |
| |
| always @(posedge clock_i or posedge s_reset) |
| if (s_reset) acc <= 'h0; |
| else begin |
| if (load_acc) |
| acc <= add_o; |
| else |
| acc <= acc; |
| end |
| |
| // Adder/accumulator output selection |
| wire [NBITS_ACC-1:0] acc_out = (OUTPUT_SELECT[1]) ? add_o : acc; |
| |
| // Round, shift, saturate |
| wire [NBITS_ACC-1:0] acc_rnd = (rnd && (SHIFT_RIGHT != 0)) ? (acc_out + ({{(NBITS_ACC-1){1'b0}}, 1'b1} << (SHIFT_RIGHT - 1))) : |
| acc_out; |
| |
| wire [NBITS_ACC-1:0] acc_shr = (unsigned_mode) ? (acc_rnd >> SHIFT_RIGHT) : |
| (acc_rnd >>> SHIFT_RIGHT); |
| |
| 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}}} : |
| {{(NBITS_ACC-NBITS_Z){1'b0}},{acc_shr[NBITS_Z-1:0]}}; |
| |
| wire [NBITS_ACC-1:0] acc_sat_s = ((|acc_shr[NBITS_ACC-1:NBITS_Z-1] == 1'b0) || |
| (&acc_shr[NBITS_ACC-1:NBITS_Z-1] == 1'b1)) ? {{(NBITS_ACC-NBITS_Z){1'b0}},{acc_shr[NBITS_Z-1:0]}} : |
| {{(NBITS_ACC-NBITS_Z){1'b0}},{acc_shr[NBITS_ACC-1],{NBITS_Z-1{~acc_shr[NBITS_ACC-1]}}}}; |
| |
| wire [NBITS_ACC-1:0] acc_sat = (sat) ? ((unsigned_mode) ? acc_sat_u : acc_sat_s) : acc_shr; |
| |
| // Output signals |
| wire [NBITS_Z-1:0] z0; |
| reg [NBITS_Z-1:0] z1; |
| wire [NBITS_Z-1:0] z2; |
| |
| assign z0 = mult_xtnd[NBITS_Z-1:0]; |
| assign z2 = acc_sat[NBITS_Z-1:0]; |
| |
| initial z1 <= 0; |
| |
| always @(posedge clock_i or posedge s_reset) |
| if (s_reset) |
| z1 <= 0; |
| else begin |
| z1 <= (OUTPUT_SELECT == 3'b100) ? z0 : z2; |
| end |
| |
| // Output mux |
| assign z_o = (OUTPUT_SELECT == 3'h0) ? z0 : |
| (OUTPUT_SELECT == 3'h1) ? z2 : |
| (OUTPUT_SELECT == 3'h2) ? z2 : |
| (OUTPUT_SELECT == 3'h3) ? z2 : |
| (OUTPUT_SELECT == 3'h4) ? z1 : |
| (OUTPUT_SELECT == 3'h5) ? z1 : |
| (OUTPUT_SELECT == 3'h6) ? z1 : |
| z1; // if OUTPUT_SELECT == 3'h7 |
| |
| // B input delayed passthrough |
| initial dly_b_o <= 0; |
| |
| always @(posedge clock_i or posedge s_reset) |
| if (s_reset) |
| dly_b_o <= 0; |
| else |
| dly_b_o <= b_i; |
| |
| endmodule |