【问题标题】:Implementing Montogomery Modular Reduction/Multiplication (MMM)实施蒙哥马利模减/乘(MMM)
【发布时间】: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


【解决方案1】:

问题是 generate 中的if 在编译时必须是可确定的,您使用信号作为 if 块的条件。我了解您的意思是在选择器中使用该表达式创建一个多路复用器,但编译器没有。

您可以将iterate 逻辑包装在程序always 块中,然后您就可以使用if 语句。 此外,对 y 的赋值应该在 iterate 块之外,否则它会有多个驱动程序。

解决这两个问题

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;
    end  // iterate

endgenerate
assign  y  =  s[N] >= c ? s[N] - c : s[N];

//assign MMM[a, b, c] = y;


endmodule

免责声明:可能有更多错误,我没有注意到。

【讨论】:

  • 是的,这绝对正确!我已经进行了上述更改,并且一切正常。无论如何感谢您的回答:D
猜你喜欢
  • 2013-02-05
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 2018-02-13
相关资源
最近更新 更多