我是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;
答案 0 :(得分:3)
Verilog中的for循环很好,但是如果你打算合成,它们需要能够静态展开。静态展开意味着循环不依赖于任何外部变量。例如for(i=0;i<10;i=i+1)
是静态的。 for(i=A; i<=20;i=i+B)
不是静态的,因为它取决于变量A
和B
。
你可以创建一个循环静态我将变量作为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