📄 altera_mf.v
字号:
scanina,
scaninb,
sourcea,
sourceb,
accum_sload_upper_data,
addnsub,
accum_sload,
signa,
signb,
clock0,
clock1,
clock2,
clock3,
ena0,
ena1,
ena2,
ena3,
aclr0,
aclr1,
aclr2,
aclr3,
result,
overflow,
scanouta,
scanoutb,
mult_round,
mult_saturation,
accum_round,
accum_saturation,
mult_is_saturated,
accum_is_saturated);
// ---------------------
// PARAMETER DECLARATION
// ---------------------
parameter width_a = 2;
parameter width_b = 2;
parameter width_result = 5;
parameter input_reg_a = "CLOCK0";
parameter input_aclr_a = "ACLR3";
parameter input_reg_b = "CLOCK0";
parameter input_aclr_b = "ACLR3";
parameter addnsub_reg = "CLOCK0";
parameter addnsub_aclr = "ACLR3";
parameter addnsub_pipeline_reg = "CLOCK0";
parameter addnsub_pipeline_aclr = "ACLR3";
parameter accum_direction = "ADD";
parameter accum_sload_reg = "CLOCK0";
parameter accum_sload_aclr = "ACLR3";
parameter accum_sload_pipeline_reg = "CLOCK0";
parameter accum_sload_pipeline_aclr = "ACLR3";
parameter representation_a = "UNSIGNED";
parameter sign_reg_a = "CLOCK0";
parameter sign_aclr_a = "ACLR3";
parameter sign_pipeline_reg_a = "CLOCK0";
parameter sign_pipeline_aclr_a = "ACLR3";
parameter representation_b = "UNSIGNED";
parameter sign_reg_b = "CLOCK0";
parameter sign_aclr_b = "ACLR3";
parameter sign_pipeline_reg_b = "CLOCK0";
parameter sign_pipeline_aclr_b = "ACLR3";
parameter multiplier_reg = "CLOCK0";
parameter multiplier_aclr = "ACLR3";
parameter output_reg = "CLOCK0";
parameter output_aclr = "ACLR3";
parameter lpm_type = "altmult_accum";
parameter lpm_hint = "UNUSED";
parameter extra_multiplier_latency = 0;
parameter extra_accumulator_latency = 0;
parameter dedicated_multiplier_circuitry = "AUTO";
parameter dsp_block_balancing = "AUTO";
parameter intended_device_family = "Stratix";
// StratixII related parameter
parameter accum_round_aclr = "ACLR3";
parameter accum_round_pipeline_aclr = "ACLR3";
parameter accum_round_pipeline_reg = "CLOCK0";
parameter accum_round_reg = "CLOCK0";
parameter accum_saturation_aclr = "ACLR3";
parameter accum_saturation_pipeline_aclr = "ACLR3";
parameter accum_saturation_pipeline_reg = "CLOCK0";
parameter accum_saturation_reg = "CLOCK0";
parameter accum_sload_upper_data_aclr = "ACLR3";
parameter accum_sload_upper_data_pipeline_aclr = "ACLR3";
parameter accum_sload_upper_data_pipeline_reg = "CLOCK0";
parameter accum_sload_upper_data_reg = "CLOCK0";
parameter mult_round_aclr = "ACLR3";
parameter mult_round_reg = "CLOCK0";
parameter mult_saturation_aclr = "ACLR3";
parameter mult_saturation_reg = "CLOCK0";
parameter input_source_a = "DATAA";
parameter input_source_b = "DATAB";
parameter width_upper_data = 1;
parameter multiplier_rounding = "NO";
parameter multiplier_saturation = "NO";
parameter accumulator_rounding = "NO";
parameter accumulator_saturation = "NO";
parameter port_mult_is_saturated = "UNUSED";
parameter port_accum_is_saturated = "UNUSED";
// -----------------------
// Local parameters
// -----------------------
parameter int_width_a = ((multiplier_saturation == "NO") && (multiplier_rounding == "NO") && (accumulator_saturation == "NO") && (accumulator_rounding == "NO")) ? width_a : 18;
parameter int_width_b = ((multiplier_saturation == "NO") && (multiplier_rounding == "NO") && (accumulator_saturation == "NO") && (accumulator_rounding == "NO")) ? width_b : 18;
parameter int_width_result = ((multiplier_saturation == "NO") && (multiplier_rounding == "NO") && (accumulator_saturation == "NO") && (accumulator_rounding == "NO")) ? width_result : 52;
parameter int_extra_width = ((multiplier_saturation == "NO") && (multiplier_rounding == "NO") && (accumulator_saturation == "NO") && (accumulator_rounding == "NO")) ? 0 : (int_width_a + int_width_b - width_a - width_b);
parameter diff_width_a = (int_width_a > width_a) ? int_width_a - width_a : 1;
parameter diff_width_b = (int_width_b > width_b) ? int_width_b - width_b : 1;
// ----------------
// PORT DECLARATION
// ----------------
// data input ports
input [width_a -1 : 0] dataa;
input [width_b -1 : 0] datab;
input [width_a -1 : 0] scanina;
input [width_b -1 : 0] scaninb;
input sourcea;
input sourceb;
input [width_result -1 : width_result - width_upper_data] accum_sload_upper_data;
// control signals
input addnsub;
input accum_sload;
input signa;
input signb;
// clock ports
input clock0;
input clock1;
input clock2;
input clock3;
// clock enable ports
input ena0;
input ena1;
input ena2;
input ena3;
// clear ports
input aclr0;
input aclr1;
input aclr2;
input aclr3;
// round and saturate ports
input mult_round;
input mult_saturation;
input accum_round;
input accum_saturation;
// output ports
output [width_result -1 : 0] result;
output overflow;
output [width_a -1 : 0] scanouta;
output [width_b -1 : 0] scanoutb;
output mult_is_saturated;
output accum_is_saturated;
// ---------------
// REG DECLARATION
// ---------------
reg [width_result -1 : 0] result;
reg [int_width_result -1 : 0] mult_res_out;
reg [int_width_result : 0] temp_sum;
reg [width_result + 1 : 0] result_pipe [extra_accumulator_latency : 0];
reg [width_result + 1 : 0] result_full ;
reg [int_width_result - 1 : 0] result_int;
reg [int_width_a - 1 : 0] mult_a_reg;
reg [int_width_a - 1 : 0] mult_a_int;
reg [int_width_a + int_width_b - 1 : 0] mult_res;
reg [int_width_a + int_width_b - 1 : 0] temp_mult_1;
reg [int_width_a + int_width_b - 1 : 0] temp_mult;
reg [int_width_b -1 :0] mult_b_reg;
reg [int_width_b -1 :0] mult_b_int;
reg [5 + int_width_a + int_width_b + width_upper_data : 0] mult_pipe [extra_multiplier_latency:0];
reg [5 + int_width_a + int_width_b + width_upper_data : 0] mult_full;
reg [width_upper_data - 1 : 0] sload_upper_data_reg;
reg [width_result - width_upper_data -1 + 4 : 0] lower_bits;
reg mult_signed_out;
reg [width_upper_data - 1 : 0] sload_upper_data_pipe_reg;
reg zero_acc_reg;
reg zero_acc_pipe_reg;
reg sign_a_reg;
reg sign_a_pipe_reg;
reg sign_b_reg;
reg sign_b_pipe_reg;
reg addsub_reg;
reg addsub_pipe_reg;
reg mult_signed;
reg temp_mult_signed;
reg neg_a;
reg neg_b;
reg overflow_int;
reg cout_int;
reg overflow_tmp_int;
reg overflow;
reg [int_width_a + int_width_b -1 : 0] mult_round_out;
reg mult_saturate_overflow;
reg [int_width_a + int_width_b -1 : 0] mult_saturate_out;
reg [int_width_a + int_width_b -1 : 0] mult_result;
reg [int_width_a + int_width_b -1 : 0] mult_final_out;
reg [int_width_result -1 : 0] accum_round_out;
reg accum_saturate_overflow;
reg [int_width_result -1 : 0] accum_saturate_out;
reg [int_width_result -1 : 0] accum_result;
reg [int_width_result -1 : 0] accum_final_out;
tri0 mult_is_saturated_latent;
reg mult_is_saturated_int;
reg mult_is_saturated_reg;
reg accum_is_saturated_latent;
reg [extra_accumulator_latency : 0] accum_saturate_pipe;
reg [extra_accumulator_latency : 0] mult_is_saturated_pipe;
reg mult_round_tmp;
reg mult_saturation_tmp;
reg accum_round_tmp1;
reg accum_round_tmp2;
reg accum_saturation_tmp1;
reg accum_saturation_tmp2;
reg [int_width_result - int_width_a - int_width_b + 2 - 1 : 0] accum_result_sign_bits;
// -------------------
// INTEGER DECLARATION
// -------------------
integer head_result;
integer i;
integer i2;
integer i3;
integer i4;
integer head_mult;
//-----------------
// TRI DECLARATION
//-----------------
// Tri wire for clear signal
tri0 input_a_wire_clr;
tri0 input_b_wire_clr;
tri0 addsub_wire_clr;
tri0 addsub_pipe_wire_clr;
tri0 zero_wire_clr;
tri0 zero_pipe_wire_clr;
tri0 sign_a_wire_clr;
tri0 sign_pipe_a_wire_clr;
tri0 sign_b_wire_clr;
tri0 sign_pipe_b_wire_clr;
tri0 multiplier_wire_clr;
tri0 mult_pipe_wire_clr;
tri0 output_wire_clr;
tri0 mult_round_wire_clr;
tri0 mult_saturation_wire_clr;
tri0 accum_round_wire_clr;
tri0 accum_round_pipe_wire_clr;
tri0 accum_saturation_wire_clr;
tri0 accum_saturation_pipe_wire_clr;
tri0 accum_sload_upper_data_wire_clr;
tri0 accum_sload_upper_data_pipe_wire_clr;
// Tri wire for enable signal
tri1 input_a_wire_en;
tri1 input_b_wire_en;
tri1 addsub_wire_en;
tri1 addsub_pipe_wire_en;
tri1 zero_wire_en;
tri1 zero_pipe_wire_en;
tri1 sign_a_wire_en;
tri1 sign_pipe_a_wire_en;
tri1 sign_b_wire_en;
tri1 sign_pipe_b_wire_en;
tri1 multiplier_wire_en;
tri1 mult_pipe_wire_en;
tri1 output_wire_en;
tri1 mult_round_wire_en;
tri1 mult_saturation_wire_en;
tri1 accum_round_wire_en;
tri1 accum_round_pipe_wire_en;
tri1 accum_saturation_wire_en;
tri1 accum_saturation_pipe_wire_en;
tri1 accum_sload_upper_data_wire_en;
tri1 accum_sload_upper_data_pipe_wire_en;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -