【发布时间】:2021-05-11 20:32:04
【问题描述】:
我一直在尝试在 Verilog 中实现 Montogomery Modular Reduction,但在执行此操作时遇到了错误。附上以下代码-
module MMM ( a , b , c , y ) ;
// Parameters
//
parameter N = 32 ; // Default value of N
// Inputs
//
input [N-1:0] a ; // N-bit input a
input [N-1:0] b ; // N-bit input b
input [N-1:0] c ; // N-bit input c
// Outputs
//
output [N-1:0] y ; // N-bit output y
// Internal nets
//
wire [N-1:0] q ; // N-bit q array
//wire [N+1:0] t [0:N-1] ; // (N+2)-bit temporary iteration variable t, bus array of N
wire [N+1:0] s ; //
// Initial value of S
//
assign s[0] = 0 ;
// Iteration
//
genvar i ;
generate
for ( i = 0 ; i <= N-1 ; i = i + 1 )
begin : iterate
assign q[i] = (s[i] + a[i] * b) % 2;
assign s[i+1] = (s[i] + q[i] * c + a[i] * b) / 2;
if (s[N] >= c)
assign y = s[N] - c ;
else
assign y = s[N] ;
end // iterate
endgenerate
//assign MMM[a, b, c] = y;
endmodule
错误 - 生成 if 条件必须是常量表达式。 任何帮助都会很棒。
谢谢
【问题讨论】:
-
我不明白。你能详细说明一下吗?
-
我可以访问一个运行良好的类似代码 它有以下代码行-assign q[i] = s[i][0] ^ ( a[i] & b [0]);分配 t[i] = s[i] + ( q[i] ? c : 0 ) ;赋值 s[i+1] = ( t[i] >> 1 ) ;我认为这里的问题在于 if..else 条件或其定义。
-
我发现了哪里出错了。 if 语句必须放在 for 循环之外才能得到结果。无论如何感谢您的帮助:)
标签: rsa verilog system-verilog