for loop verilog的更好选择

时间:2015-03-16 16:36:13

标签: for-loop verilog

我是verilog的新手。我一直在网上搜索,他们中的大多数建议不要在verilog编码中使用for-loop。那么有更好的替代方案来替换for循环吗? 我现在面临的问题是我需要在case语句中执行1或2个for循环。而且我一直在考虑更好的替代品,但却没有提出任何选择。如果你们中的任何一个人能够对此有所了解,那就太好了。

我的代码示例:

always @(*)
case (help)
4'd1: for (i=A; i<=20;i=i+B)
       begin temp[i-1]=1; end
4'd2: for (i=A; i<=20;i=i+B)
        begin temp[i-1]=1; B=B+1; end
4'd3: begin
       for (i=A; i<=20;i=i+B)
        begin temp[i-1]=1; B=B+1; end
       for (i=A; i>=1;i=i-B)
        begin temp[i-1]=1; B=B+1; end
      end
default: temp = 0;

1 个答案:

答案 0 :(得分:3)

Verilog中的for循环很好,但是如果你打算合成,它们需要能够静态展开。静态展开意味着循环不依赖于任何外部变量。例如for(i=0;i<10;i=i+1)是静态的。 for(i=A; i<=20;i=i+B)不是静态的,因为它取决于变量AB

你可以创建一个循环静态我将变量作为for循环中的条件移动。 for(i=A; i<=20;i=i+B)成为:

tmp_var = A;
for (i=0; i<=20;i=i+1) begin
  if (i==tmp_var) begin
    // ... your logic here ...
    tmp_var = tmp_var+B;
  end
end

需要解决的问题超出了问题的范围:

他们使用B的方式和temp有点关注。

  • B似乎是一个输入,但您也在增加它。对于综合来说,操纵输入是非法的。如果是输入,则创建一个默认值为B的局部变量,稍后可以在同一个始终块内更改此值。如果它不是输入,则它创建锁存逻辑;哪个不好,我将用temp覆盖下一个。

  • temp是锁存逻辑。锁存逻辑很麻烦,因为时序很关键;了解闩锁何时透明或闭合,并遵守保持时间要求。逻辑越复杂,预测就越难。在RTL中,通过组合块内的不完整赋值(即always @*)推断出单向锁存器。要解决此问题,请确保为组合块的每次传递分配每个位。保护这一点的一种方法是在开始逻辑之前分配默认值。例如:

    always @(*) begin
      temp = 0; // default to a constant
      temp_B = B; // default to an input value
    
      // ... your logic ...
    end