You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:33:35