module mult(a,b,c);
parameter width=16;
input [width-1:0]a,b;
output [2*width-2:0]c;
reg[2*width+2:1] data;
integer i;
always@(*)
begin
data={{(width+1){1'b0}},b,1'b0};
for(i=0;i<=width-2;i=i+1)
begin
if(data[1]==1'b1 && data[1]!=data[2])
data=data+{a[width-1],a,{(width+1){1'b0}}};
else if(data[2]==1'b1 && data[1]!=data[2])
data=data+{~{a[width-1],a}+1,{(width+1){1'b0}}};
data={data[2*width+2:2*width+1],data[2*width+2],data[2*width:2]};
//data={data[2*width+2:2*width+1],1'b1,data[2*width:2]};
end
if(data[1]==1'b1 && data[1]!=data[2])
data=data+{a[width-1],a,{(width+1){1'b0}}};
else if(data[2]==1'b1 && data[1]!=data[2])
data=data+{~{a[width-1],a}+1,{(width+1){1'b0}}};
end
assign c[2*width-2]=data[2*width+2];
assign c[2*width-3:0]=data[2*width:3];
endmodule
这个是一个可定制位宽的booth算法乘法器 |