Verilog 模运算

问题描述 投票:0回答:1

我正在尝试用verilog设计一个模块来执行可综合的模运算。我想使用生成块将以下算法中的 % 运算符替换为可合成的模运算。如果可以的话请帮忙。我尝试创建一个块,但它在 vivado 中的模拟过程中抛出错误。错误:模块实例化应该是实例名称。错误2:库工作中顶级verilog单元的静态评估失败。

module modcalc(input  [11:0]dividend,
input [11:0] divisor,
 output reg [11:0] remainder);
 
 
reg [11:0] temp_dividend;
 
 // Create a counter to count the number of iterations
 reg [11:0] counter;
 
 // Generate block to create the modulo operation
 genvar i;
 generate
     for (i = 0; i < 11; i = i + 1) begin : MODULO_LOOP
         always @(*) begin
             if (temp_dividend >= divisor) begin
                 temp_dividend = temp_dividend - divisor;
             end
         end
     end
 endgenerate
 
 // Assign the remainder to the output
 always @(*) begin
     remainder = temp_dividend;
 end
 endmodule
 

module montgomerymult(

        input  [3:0] A, B,  // Operands
        input  [3:0] M,    // Modulus
        input  [5:0] M_inv, // Precomputed value
        input  [4:0] r,
        input [4:0] r_inv,
        output reg[3:0] R ,     // Result
        output [3:0] D
    );
        wire [9:0]  H;
        wire [11:0] T; 
        wire [11:0] Y;
        reg [11:0]   TL;
        wire [11:0]  m;
        wire [3:0] K;
        
        assign T = A * B;
        //assign TL = (T) % (r); // Extract lower bits
        modcalc(.dividend(T), .divisor(r), .remainder(TL));
        assign m = (TL * M_inv) % (r); // Modular multiplication by M'
        
        assign H = T + (m * M);
        assign K =H /r;
        always @* begin
        if (K >= M)
         begin
           R <= K - M;
        end
        else begin
            R <= K;
        end
        end
        
        assign Y = T * r_inv;
        assign D = Y % M;
        
    endmodule
verilog vivado
1个回答
0
投票

您的

modcalc
模块实例化不正确。

您还必须提供实例的名称(例如

my_modulo
):

modcalc my_modulo(.dividend(T), .divisor(r), .remainder(TL));

您的模块中可能存在其他问题,但错误

Error :Module instantiation...
是由上述错误引起的。

© www.soinside.com 2019 - 2024. All rights reserved.