改进的for循环
声明局部循环变量
SystemVerilog简化了声明用于for循环的局部变量的方法。SystemVerilog可以在for循环内部声明循环变量。这样就不需要在模块级定义多个变量,也不用在命名的begin…end块中定义局部变量了。
module chip(...);//SystemVerilog风格的循环...always_ff@(posedge clock) beginfor(bit[4:0] i=0; i<=15;i++)....endalways_ff@(posedge clock)beginfor(int i=1;i <= 1024;i+=1)...end
endmodule
局部循环变量避免发生干扰
在for循环内部声明的变量是这个循环的局部变量。在循环中引用这个变量名称只会使用这个局部变量,而不会是模块其他地方,如接口、程序、任务或函数中声明的相同名字的变量。
for循环内部声明的变量时自动变量
局部循环变量时自动的
当在for循环初始化语句中声明变量时,变量时自动储存而不是静态的。当次for循环启动时,就自动地创建这个变量并初始化;当循环退出时,这个变量就被清除。自动变量的使用有如下几个需要注意的问题:
- 自动变量不能层次化引用
- 自动变量不能保存到VCD文件中
- for循环变量的值不能在循环外部使用,因为这个变量在循环外部是不存在的。
局部循环变量在循环外不存在
always_comb
beginfor(int lobit=0;lo_bit <=63;lo_bit++)beginif(data[lo_bit]) break;//当位值为1就退出循环endif(lo_bit > 7) //出错:此处并没有lo_bit...
end
如果需要在循环外引用一个变量,这个变量必须在循环外声明。
always_comb
int lo_bit;//本块的局部变量
beginfor( lobit=0;lo_bit <=63;lo_bit++)beginif(data[lo_bit]) break;//当位值为1就退出循环endif(lo_bit > 7) //lo_bit的值为最后一个循环的值...
end
2、多重for循环赋值
SystemVerilog可以在for循环中使用多个初始化赋值语句,多个步进赋值语句。
多个初始化或步进赋值语之间用逗号隔开。
for(int i=1,int j=0;i*j < 128;i++,j+=3)
...
每个循环变量可以声明为不同类型
for(int i=1,byte j=0;i*j <128;i++,j+=3)
....
3、for循环中声明的变量的层次化引进
局部变量没有层次路径
作为for循环一部分声明的局部变量不能被层次化引用。测试向量、显示波形或VCD文件都不能引用这些局部变量(但是工具可能会提供私有的、非标准的方法来处理这些变量)
always_ff@(posedge clock)
beginfor(int i=0;i<=15;i++)begin...//i不能层次化引用end
end
如果确实需要对for循环的控制变量进行层次化引用,则这个变量必须在for循环外部声明:在模块级或在命名的begin…end块内。
always_ff@(posedge clock)
begin:loop
int i;//i可以层次化引用for(int i=0;i<=15;i++)begin...end
end