Verilog实现24位数字乘法遇问题:测试结果始终为0求助
你的Verilog逐位乘法逻辑问题分析
你的代码逻辑完全错误,这根本不是逐位乘法的正确实现方式,结果为0的问题也源于此,具体问题和修正方向如下:
核心错误点
- 乘法逻辑完全偏离:你当前的代码只用到了
arg1和arg2的第0位与对应i位的组合,完全忽略了所有其他位的乘积配对(比如arg1[1]&arg2[1]、arg1[2]&arg2[3]等),而逐位乘法的核心是计算每一对arg1[m] & arg2[n]的乘积,再将对应位的乘积累加并处理进位。 - 高位处理错误:第二个for循环直接将
result[24:31]设为0,但24位×24位的完整结果是48位,即使要输出32位结果,也应该是截断高位而非直接清零。 - 赋值方式可能有误:如果这段代码是组合逻辑块,使用非阻塞赋值
<=会导致时序问题,应该改用阻塞赋值=。
正确的逐位乘法实现思路
逐位乘法的本质是移位相加:对于arg1的每一位,如果该位为1,则将arg2左移对应位数,然后将所有这些移位后的结果相加,最终得到乘积。针对你的需求(输出32位结果),可以这样实现:
// 组合逻辑实现24位×24位,输出32位结果 reg [31:0] result; integer m; always @(*) begin result = 32'd0; for (m = 0; m < 24; m = m + 1) begin // 如果arg1的第m位为1,就把arg2扩展到32位后左移m位,累加到结果中 if (arg1[m]) begin result = result + (({8'd0, arg2}) << m); end end end
或者更贴近传统逐位乘法的部分积累加方式(需要处理进位):
reg [47:0] full_product; // 先计算完整48位乘积 reg [31:0] result; integer m, n; always @(*) begin full_product = 48'd0; // 生成所有部分积并累加 for (m = 0; m < 24; m = m + 1) begin for (n = 0; n < 24; n = n + 1) begin full_product = full_product + ((arg1[m] ? 1'b1 : 0) << (m + n)); end end result = full_product[31:0]; // 截断到32位输出 end
为什么你的测试结果始终为0
假设你测试时arg1[0]和arg2[0]都为0,那么result[0]会被赋值为0,后续循环中result[i] = 0 | 0 | result[i-1],结果会一直保持0;即使arg1[0]或arg2[0]为1,你的逻辑也只是计算了极有限的几对乘积的非逻辑累加,完全不是乘法运算,最终结果也不可能正确。
内容的提问来源于stack exchange,提问作者user4534
相关产品推荐
相关产品推荐

