// behavioral model for a Booth-encoded 8x8 signed multiplier // 16-bit output => interpreted as a 16-bit signed number module booth16f(x, y, p); input [7:0] x, y; output [15:0] p; reg [8:0] a, b, c, d; reg u0, u1, u2, u3; wire [15:0] pp0, pp1, pp2, pp3, pp4; // perform the booth encoding always @(x or y) begin case (y[1:0]) 2'b00 : begin a = 9'b000000000; u0 = 0; end // 0 2'b01 : begin a = {x[7], x[7:0]}; u0 = 0; end // 1 2'b10 : begin a = {~x[7:0], 1'b1}; u0 = 1; end // -2 2'b11 : begin a = {~x[7], ~x[7:0]}; u0 = 1; end // -1 endcase case (y[3:1]) 3'b000 : begin b = 9'b000000000; u1 = 0; end // 0 3'b001 : begin b = {x[7], x[7:0]}; u1 = 0; end // 1 3'b010 : begin b = {x[7], x[7:0]}; u1 = 0; end // 1 3'b011 : begin b = {x[7:0], 1'b0}; u1 = 0; end // 2 3'b100 : begin b = {~x[7:0], 1'b1}; u1 = 1; end // -2 3'b101 : begin b = {~x[7], ~x[7:0]}; u1 = 1; end // -1 3'b110 : begin b = {~x[7], ~x[7:0]}; u1 = 1; end // -1 3'b111 : begin b = 9'b000000000; u1 = 0; end // 0 endcase case (y[5:3]) 3'b000 : begin c = 9'b000000000; u2 = 0; end // 0 3'b001 : begin c = {x[7], x[7:0]}; u2 = 0; end // 1 3'b010 : begin c = {x[7], x[7:0]}; u2 = 0; end // 1 3'b011 : begin c = {x[7:0], 1'b0}; u2 = 0; end // 2 3'b100 : begin c = {~x[7:0], 1'b1}; u2 = 1; end // -2 3'b101 : begin c = {~x[7], ~x[7:0]}; u2 = 1; end // -1 3'b110 : begin c = {~x[7], ~x[7:0]}; u2 = 1; end // -1 3'b111 : begin c = 9'b000000000; u2 = 0; end // 0 endcase case (y[7:5]) 3'b000 : begin d = 9'b000000000; u3 = 0; end // 0 3'b001 : begin d = {x[7], x[7:0]}; u3 = 0; end // 1 3'b010 : begin d = {x[7], x[7:0]}; u3 = 0; end // 1 3'b011 : begin d = {x[7:0], 1'b0}; u3 = 0; end // 2 3'b100 : begin d = {~x[7:0], 1'b1}; u3 = 1; end // -2 3'b101 : begin d = {~x[7], ~x[7:0]}; u3 = 1; end // -1 3'b110 : begin d = {~x[7], ~x[7:0]}; u3 = 1; end // -1 3'b111 : begin d = 9'b000000000; u3 = 0; end // 0 endcase end // form the partial product terms assign pp0 = {a[8], a[8], a[8], a[8], a[8], a[8], a[8], a[8:0]}; assign pp1 = {b[8], b[8], b[8], b[8], b[8], b[8:0], 2'b00}; assign pp2 = {c[8], c[8], c[8], c[8:0], 4'b0000}; assign pp3 = {d[8], d[8:0], 6'b000000}; assign pp4 = {9'b000000000, u3, 1'b0, u2, 1'b0, u1, 1'b0, u0}; // add up the partial product terms assign p = pp0 + pp1 + pp2 + pp3 + pp4; endmodule