- 在C语言或者其他编程语言中for语句往往用作循环语句,但是在硬件电路Verilog中一般不在可综合代码中使用,因为for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,每条执行语句并不能有效地复用硬件逻辑资源,造成巨大的资源浪费。简单的说就是:for语句循环几次,就是将相同的电路复制几次,因此循环次数越多,占用面积越大,综合就越慢。
- for语句的一般使用情况:
- 在testbench中使用,往往用于激励信号的生成。
- generate-for语句(可看上一篇博客)因为生成语句只要就是用于重复电路中所以可以使用简化代码。和generate-for语句本质上时相似的。
- 其他的有的情况可以使用 使用后也可以综合但不建议使用,若一些简单的赋值重复很多可以使用来简化代码。
- 语法:
- for语句不单独使用,一般放在always块里
- 循环变量i 一般定义为integer型一般放在always块内定义
- always块应有名字 和generate相似
- 举个栗子:
always @(posedge clk)
begin
if(!rst_n)
num = 0;
else
begin
for(i=0;i<13;i=i+1)
if(data[i]) num = num + 1;
end
end
//这个for语句里用的是阻塞赋值,在综合时会将for语句展开综合成一长串的十三个类似的电路,并且是在一个时钟周期内完成计算,但是这样做可能会导致时序冲突即若频率很高一个周期完成不了从而产生错误,在对时钟周期没有严格要求的情况下一般不这样使用。
always @(posedge clk)
begin
if(!rst_n)
num <= 0;
else
begin
for(i=0;i<13;i=i+1)
if(data[i]) num <= num + 1;
end
end
//这里是非阻塞赋值,在综合时会将for语句展开综合成十三个类似的并行电路,相当于十三句非阻塞赋值给一个变量赋值,这样会导致一个时钟周期钟能计数一次且每次都是最后一位的赋值状态。不能完成计数。
所以综上,for语句是将电路进行复制,其运行状态还取决于内部是阻塞赋值还是非阻塞赋值。在可综合程序中一般不推荐使用。