我正在设计一个Verilog处理器。我正在研究ALU,特别是ALU的乘数。在用小的正数进行乘法运算时,我可以得到正确的结果,但如果我尝试乘以有符号数,我会遇到问题。当一个正数乘以一个负数时,结果将不会一直扩展到64位,如果两个负数相乘,那么这个数字是完全不正确的(符号和数值)。任何人都可以看到问题在哪里?我认为我没有进行算术转换,但我调整了这一点,但仍然得到了错误的结果。有符号乘数Verilog
module multiplier(
input[31:0] operand1,
input[31:0] operand2,
output reg [63:0] product
);
reg [64:0] prod;
reg [31:0] mcand;
reg [31:0] sum;
integer i = 0;
always @* begin
prod = {32'b0,operand1};
mcand = operand2;
for(i=0;i<32;i=i+1) begin
//test 0 bit of product
case(prod[0])
1'b0:begin //if prod[0] == 0, arithmetic shift right
prod = prod>>>1;
end
1'b1:begin //if prod[0] == 1, add multiplicand to upper 32
//bits and arithmetic shift right
prod = {(prod[63:32]+mcand[31:0]),prod[31:0]};
prod = prod>>>1;
end
endcase
end
product = prod[63:0];
end
endmodule
任何不在RTL中使用'*'的理由? – Morgan