Verilog有符号乘法“丢失”有符号位
我正在写一个代码,它使用一个乘法器模块,当其中一个输入是负数时,它会返回奇怪的答案。我猜这与Verilog处理签名数字的方式有关,并且模块没有将结果正确存储在'reg signed out'declaration中。我所有的输入/输出/wire/reg声明都是经过签名的,所以我不确定我遗漏了什么,以及我还需要做些什么来告诉Verilog解决这个问题。对不起,这是个初学者的问题 比如说, 当X[0]是1610,θ1[1]是-123时,我从乘法器模块得到的结果是: 6914897148530 以下是我的代码的相关部分:Verilog有符号乘法“丢失”有符号位,verilog,Verilog,我正在写一个代码,它使用一个乘法器模块,当其中一个输入是负数时,它会返回奇怪的答案。我猜这与Verilog处理签名数字的方式有关,并且模块没有将结果正确存储在'reg signed out'declaration中。我所有的输入/输出/wire/reg声明都是经过签名的,所以我不确定我遗漏了什么,以及我还需要做些什么来告诉Verilog解决这个问题。对不起,这是个初学者的问题 比如说, 当X[0]是1610,θ1[1]是-123时,我从乘法器模块得到的结果是: 6914897148530 以下是
module mult(in1, in2, out, mult_start); // multiplication module
input signed [32-1:0] in1, in2;
input mult_start;
output signed [64-1:0] out;
reg signed [64-1:0] out;
always @(in1 or in2 or mult_start)
begin
if (mult_start)
begin
out <= (in1 * in2) & {64{1'b1}};
end
else
out <= out;
end
endmodule
module child_one (clk, rst_b, sig_start, Input_X, Input_Theta1)
// Internal Variables Memory
reg signed [`REG_LENGTH-1:0] Theta1 [0:217-1];
reg signed [`REG_LENGTH-1:0] X [0:216-1];
wire signed [`OUT_LENGTH-1:0] prod_1 [0:217-1];
reg signed [`OUT_LENGTH-1:0] prod_sum;
wire signed [`OUT_LENGTH-1:0] sig_result;
mult mult_001 (X[0], Theta1[1], prod_1[1], mult_start);
mult mult_002 (X[1], Theta1[2], prod_1[2], mult_start);
mult mult_003 (X[2], Theta1[3], prod_1[3], mult_start);
mult mult_004 (X[3], Theta1[4], prod_1[4], mult_start);
always @(posedge clk or negedge rst_b)
begin
if (sig_start == 1)
begin
if (state == 4'b0000)
begin
state <= 4'b0001; // initialize state variable to zero
k <= 0;
result_done <= 0;
index <= 0;
end
else if (state == 4'b0001) // Start Multiplication Operation
begin
k <= result_done ? 0 : k + 1;
result_done <= result_done ? 1 : (k == 10);
state <= result_done ? 4'b0010 : 4'b0001;
mult_start <= result_done ? 1'b1 : 1'b0;
//mult_start <= 1'b1;
//state <= 4'b0010;
end
else if (state == 4'b0010) // Stop Multiplication Operation
begin
k <= 0;
result_done <= 0;
mult_start <= 0;
state <= 4'b0011;
end
end
end
端模
谢谢
费萨尔。感谢所有的帮助和建议。为mult模块编写一个单独的测试平台有助于找到解决方案
我的问题是mult模块。由于我的输入是32位长,mult输出将是32*2+1=65位长。我的输出端口“out”仅被分配为64位长,这导致在回答为负数时出现符号问题。将其指定为65位长度解决了我的问题。感谢所有的帮助和建议。为mult模块编写一个单独的测试平台有助于找到解决方案
我的问题是mult模块。由于我的输入是32位长,mult输出将是32*2+1=65位长。我的输出端口“out”仅被分配为64位长,这导致在回答为负数时出现符号问题。将其分配为65位长度解决了我的问题。我根本不懂Verilog,也不知道为什么这个问题被标记为VHDL,但我看不出分配给Theta1[0]会对任何乘法器模块产生什么影响。对于这两个问题,我都感到抱歉。Theta1[0]示例是我在末尾添加的内容,以显示我遇到的问题n我没有正确粘贴它。至于vhdl标签,那是因为我认为我遇到的问题是硬件语言问题,知道HDL的人可以让我知道我缺少的关于符号、二的补码、符号扩展或类似的东西……没关系。我听说Verilog有很多奇怪的地方,所以我决定避免使用它——包括它默认使用无符号算术;有符号乘法和无符号乘法是不同的过程。我所能建议的就是为乘法器模块创建一个测试台,并单独进行操作——将其简化为一个测试台,感谢您关于为乘法器模块编写一个测试台的建议。我在测试台上尝试了很多案例,经过了一些尝试和错误!这是一个符号扩展的问题。如果你解决了问题,考虑把你的解决方案发布为答案并勾选“接受”复选框。那我们就知道问题已经解决了。谢谢我根本不懂Verilog,也不知道为什么这个问题被标记为VHDL,但我看不出分配给Theta1[0]会对任何乘法器模块产生什么影响。这两件事我都很抱歉。Theta1[0]示例是我在末尾添加的内容,以显示我遇到的问题n我没有正确粘贴它。至于vhdl标签,那是因为我认为我遇到的问题是硬件语言问题,知道HDL的人可以让我知道我缺少的关于符号、二的补码、符号扩展或类似的东西……没关系。我听说Verilog有很多奇怪的地方,所以我决定避免使用它——包括它默认使用无符号算术;有符号乘法和无符号乘法是不同的过程。我所能建议的就是为乘法器模块创建一个测试台,并单独进行操作——将其简化为一个测试台,感谢您关于为乘法器模块编写一个测试台的建议。我在测试台上尝试了很多案例,经过了一些尝试和错误!这是一个符号扩展的问题。如果你解决了问题,考虑把你的解决方案发布为答案并勾选“接受”复选框。那我们就知道问题已经解决了。谢谢