我正在尝试用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
您的
modcalc
模块实例化不正确。
您还必须提供实例的名称(例如
my_modulo
):
modcalc my_modulo(.dividend(T), .divisor(r), .remainder(TL));
您的模块中可能存在其他问题,但错误
Error :Module instantiation...
是由上述错误引起的。