I am doing a code for radix-4 booth encoding for 8*8 multiplication. The logic is correct and there are no errors or warning. The output am getting is totally unrelated. i have posted the code below
module comp8mul (a, b, outc, clk);
input [7:0] a, b;
input clk;
output [4:0] outc;
wire [8:0] a1;
reg [8:0] a12;
wire [11:0] b1;
integer i;
reg [2:0] c1;
reg [11:0] ou1;
reg [4:0] b11 [0:11];
reg [4:0] s1;
assign a1 = {1'b0,a};
assign b1 = {1'b0,b,1'b0,1'b0};
always @(posedge clk) begin
for (i=11; i>=2'd2; i=i-(2'd2)) begin:rloop
c1={b1[i-2'd2],b1[i-1'b1],b1[i]};
case(c1)
3'b000: begin
ou1=11'b0;
s1[(i-(2'd3))/2'd2]=1'b0;
end
3'b001: begin
ou1=a1;
s1[(i-(2'd3))/2'd2]=1'b0;
end
3'b010: begin
ou1=a1;
s1[(i-2'd3)/2'd2]=1'b0;
end
3'b011: begin
a12=a1<<1;
ou1=(~a12)+1'b1;
s1[(i-(2'd3))/2'd2]=1'b1;
end
3'b100: begin
a12=a1<<1'b1;
ou1=(~a12)+1'b1;
s1[(i-(2'd3))/2'd2]=1'b1;
end
3'b101: begin
ou1=(~a1);
s1[(i-(2'd3))/2'd2]=1'b1;
end
3'b110: begin
ou1=(~a1);
s1[(i-(2'd3))/2'd2]=1'b1;
end
3'b111: begin
ou1=12'b0;
s1[(i-(2'd3))/2'd2]=1'b0;
end
endcase
if (((i-(2'd3))/2'd2)==3'd4) begin
b11[((i-(2'd3))/(2'd2))]={(~s1[(i-(2'd3))/(2'd2)]),s1[(i-(2'd3))/(2'd2)],s1[(i-(2'd3))/2'd2],ou1};
end
if (((i-(2'd3))/(2'd2))==1'b1) begin
b11[(i-(2'd3))/(2'd2)]={(~s1[(i-(2'd3))/(2'd2)]),ou1};
end
if(((i-(2'd3))/(2'd2))==1'b0) begin
b11[((i-(2'd3))/(2'd2))]=ou1;
end else
b11[(i-(2'd3))/(2'd2)]={1'b1,(~s1[(i-(2'd3))/(2'd2)]),ou1};
end
end
assign outc = b11[0];
endmodule
I should get five 12-bit partial products as outputs. I am assigning 1 row of the 2-d array to output and checking it.
Best Answer
If "five 12-bit partial products as outputs" desired, then
reg [4:0] b11 [0:11];
should bereg [11:0] b11 [0:4];
.Your b11 calculation is likely incorrect. There are missing
else
s before many of theif
statements. Therefore, all except the finalif
condition with fall into the finalelse
condition. You need to nest the else-ifs. Alternatively ,you can use another case statement. Also you need to control theou1
range otherwise the upper assigned bits will be out of range forb11
and masked out.Suggestion:
(i-2'd3)/2'd2
and format variations of the same equations is used many places. Assign it to a variable, such asreg [2:0] c2
, and call the variable (c2
) instead of the equation.c2
should be assigned just like yourc1
. This will help readability of the code and lower chances of a typo.