Verilog系列:【18】循环中的整型
在进行软件设计时,经常会使用integer声明的变量作为循环变量时用,而在Verilog中经常使用的变量类型有wire和reg等,很少使用integer,但是使用wire或者reg类型变量作为循环变量时如果没有设置合理的取值范围往往会使循环进入死循环状态。为此,本文以具体示例进行说明。
1 integer与reg渊源
在Verilog中integer为32位有符号数(PLI_INT32),可作为32位有符号reg类型变量,因此,其中可包括的数值有“0,1,x,z”,但是这并不等于说在其具体使用时两者可以完全互换。
2 具体使用示例
【示例一】
使用reg声明的变量作为循环变量,如果没有设置合适的取值范围极易造成循环陷入死循环状态。
仿真结果如下:
仿真进入死循环,仅输出s1,s2不会被执行。通过分析代码,其中循环变量loop被定义为4位宽的reg类型,而4位宽的reg类型表示的数据范围为0~15,for循环中当循环计数到15后,loop计数溢出,计数将再从0开始计数,即不会出现loop大于15的情况,所以该for循环将一直被执行,从而导致s2不会被执行。解决这种情况可使用如下方法:
1>声明循环变量为reg类型时,注意变量的定义宽度;
2>使用integer声明的变量作为循环变量。但是在具体使用时需要注意integer为32位,所以如果变量取值范围较小(循环次数较少),那么使用integer类型变量作为循环变量将会导致电路资源耗费较多。例如本例中,设计意图进行15次循环,如果使用integer声明的循环变量,将导致声明的变脸的高27位未被使用,即造成资源浪费。因此,在具体使用时要因地制宜。
【示例二】
使用integer简化for循环。
仿真结果如下:
从仿真结果可以看出,s1~s9价于s10~s13,其中s2~s8精简为s11~s12。当需要reg_loop的位数再多一些的话,那么使用integer定义的循环变量的方式优势将更明显。
3 总结
在编写Verilog程序时,当循环的次数较小时,建议定义适当位宽的reg类型变量作为循环变量。当循环次数较大时,建议定义integer类型的变量作为循环变量。当然,如果对于综合后电路规模有较严格要求,那么一定要使用reg类型的变量精确控制循环。总而言之,在for复制部分语句时可以使用integer变量作为循环变量,而在其他设计结构中尽量使用reg类型。