循环语句可以减少代码量,使得代码更加精简;但是可能会导致综合问题,因此在运用循环语句要非常小心。
Xilinx建议是对于一些简单的信号连接方式变化,用循环语句是可接受的。如下面这一段只是实现多位输入信号到输出信号的位翻转(重映射):
reg[3:0] dout;
integer i;
always@(posedge clk)
begin
for(i=0;i<=3;i=i+1)
dout[3-i] <= din[i]
end
而如果是需要推断出硬件结构,并不建议(但我觉得是可以写的,只要按规范也是可以综合的)。
always@(posedge clk)
begin
for(i=0;i<= 3;i=i+1)
begin
if(en([i])
dout[i] <= i;
end
end
周期性行为中迭代的次数在仿真前能由编译器确定(即迭代次数是固定的并且与数据无关),这种循环称为静态的或是数据独立的。
如果循环次数是由运算中的某个变量决定的,这种循环则称为与数据相关的。具有数据依赖性的循环可能对内嵌的定时控制(如事件表达式)具有依赖性。
那些没有内部定时控制的非静态循环是有问题的,是不可综合的。