`timescale 1ns/1ns module multi_pipe#( parameter size = 4 )( input clk , input rst_n , input [size-1:0] mul_a , input [size-1:0] mul_b , output reg [size*2-1:0] mul_out ); //本质是乘法转换为加法 //=========================================================================\\ //*****************************define sinals*******************************\\ //=========================================================================\\ wire [size*2-1:0] temp[size-1:0 ] ; reg [size*2-1:0] add_temp[size>>1-1:0] ; //=========================================================================\\ //*****************************main code***********************************\\ //=========================================================================\\ //并行移位计算 generate genvar i ; for(i = 0 ; i <= size - 1 ; i = i + 1) begin: assign_temp assign temp[i] = mul_b[i]?{ {(size-i){1'b0}}, mul_a, {i{1'b0}} } : 'd0 ; end endgenerate //一级加法流水线 generate genvar j ; for(j = 0 ; j <= size - 1 ; j = j + 2) begin: always_temp always@(posedge clk or negedge rst_n)begin if(!rst_n) add_temp[j/2] <= 'd0 ; else add_temp[j/2] <= temp[j] + temp[j + 1] ; end end endgenerate //二级加法流水线 always@(posedge clk or negedge rst_n)begin if(!rst_n) mul_out <= 'd0 ; else mul_out <= add_temp[0] + add_temp[1] ; end /* assign temp[0] = mul_b[0]?{ {4{1'b0}}, mul_a,} : 'd0 ; assign temp[1] = mul_b[1]?{ {3{1'b0}}, mul_a,1'b0} : 'd0 ; assign temp[2] = mul_b[1]?{ {2{1'b0}}, mul_a,2'b0} : 'd0 ; assign temp[3] = mul_b[1]?{ 1'b0, mul_a,3'b0} : 'd0 ; */ endmodule