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
相关产品推荐
相关产品推荐

