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

GF(2^m)二元多项式乘法Verilog实现错误排查求助

GF(2^m)二元多项式乘法Verilog代码错误修正

问题根源

  • 累加寄存器未初始化:Python中每次计算从全0开始累加,而你的Verilog仅在复位时清零寄存器,后续时钟沿直接在旧结果上异或,导致结果叠加错误。
  • 赋值依赖错误:out_reg[i+j] = C[i+j] ^ ...中C是out_reg的直接连线,循环中反复用当前寄存器值更新自身,时序块内的顺序循环会破坏异或累加的逻辑。
  • 逻辑展开不当:嵌套for循环在时序块中无法正确展开为多项式乘法所需的异或阵列,导致资源消耗异常。

修正方案

方案1:纯组合逻辑实现(无时钟)

直接展开部分积并异或累加,完全匹配Python算法逻辑:

module multiplier_41x163_direct(
    input [40:0] A,
    input [162:0] B, 
    output [202:0] C
);

// 生成每个A[i]对应的部分积:A[i]为1时,B左移i位;否则为0
wire [202:0] partial_products[40:0];
generate
    genvar i;
    for(i=0; i<=40; i=i+1) begin: gen_partial
        assign partial_products[i] = A[i] ? (B << i) : 203'd0;
    end
endgenerate

// 累加所有部分积(异或操作)
wire [202:0] accum[40:0];
assign accum[0] = partial_products[0];
generate
    genvar j;
    for(j=1; j<=40; j=j+1) begin: gen_accum
        assign accum[j] = accum[j-1] ^ partial_products[j];
    end
endgenerate

assign C = accum[40];

endmodule

方案2:同步时序逻辑实现(带时钟复位)

如果需要同步输出,在时钟沿完成计算:

module multiplier_41x163_direct(
    input clk,
    input rst_n,
    input [40:0] A,
    input [162:0] B, 
    output reg [202:0] C
);

reg [202:0] accum;
integer i;

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        C <= 'b0;
    end else begin
        accum <= 'b0; // 每次计算前清零累加器
        // 遍历A的所有位,累加对应的部分积
        for(i=0; i<=40; i=i+1) begin
            accum <= accum ^ (A[i] ? (B << i) : 203'd0);
        end
        C <= accum;
    end
end

endmodule

验证要点

  • 用你的Python测试向量(A=0x17a5b3f9ec1、B=0x71a3b6723027362b89d4ad344f678e139a023b693)仿真,对比输出结果是否与Python一致。
  • 组合逻辑方案会生成完整的异或门阵列,资源消耗符合41×163位乘法的预期;时序方案则在每个时钟周期完成一次乘法运算。

内容的提问来源于stack exchange,提问作者Blue Ink Tour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:34:51