module ripple_mult44(x_in, y_in, p);
parameter N = 4,
M = 4;
input [N-1:0] x_in;
input [M-1:0] y_in;
output [N+M-1:0] p;
reg [N+M-1:0] p;
reg [M:0] cin[N:0], pin[N:0], cout[N:0], pout[N:0];
integer i, j;
always @(x_in or y_in)begin
cin[0] = 0;
pin[0] = 0;
for(i=0; i<=N-1; i=i+1)begin
for(j=0; j<=M-1; j=j+1)begin
basic_mul_cell(x_in[i], y_in[j], cin[i][j], pin[i][j],
cout[i][j], pout[i][j]);
cin[i+1][j] = cout[i][j];
if(j==0) p[i] = pout[i][j];
if(j>0) pin[i+1][j-1] = pout[i][j];
end
pin[i+1][M-1] = 'b0;
end
for(i=0; i<=M-1; i=i+1)
p[i+N] = pin[N][i] + cin[N][i];
end
//进位存储乘法器基本单元
task basic_mul_cell(input x_i, y_j, cin, pin, output cout, pout);
reg int_p;
begin
int_p = x_i & y_j;
cout = (cin & pin)|(cin & int_p)|(pin & int_p);
pout = cin ^ int_p ^ pin;
end
endtask
endmodule
评论0