一、For的使用
for循环的一般形式
integer i;
for( i=0 变量的初始值; i<16 循环的继续条件; i=i+1 循环的步进操作)
begin
每次循环的操作……
end
其中变量i要定义为integer型,不能定义为reg类型。
此外,for是可以综合的,但是变量的初始值、循环的继续条件和循环的步进操作必须都是已知的值,不能是变量,否则是无法综合的。
下面展示一个简单的for使用场景
module for_add(
input [4:0] a,
output reg [8:0] sum
);
parameter n = 3'd3;
integer i ;
always @ (*)
begin
sum = 1 ;
for( i=0; i<n; i=i+1 )
sum= sum+a ;
end
endmodule
电路图如下所示
所以由电路图可知
always @ (*)
begin
sum = 1 ;
for( i=0; i<n; i=i+1 )
sum= sum+a ;
end
等效于
always @ (*)
begin
sum = 1 ;
sum1= sum+a ;
sum2= sum1+a ;
sum3= sum2+a ;
end
二、Generate的使用
generate的主要⽤法就是两种,第⼀是构造循环结构,例如多次实例化某个模块,或者是进⾏连线;第⼆种是通过if-generate或者case-generate来在多个代码块之间最多选择一个作为综合的rtl代码。
2.1构造循环结构
首先设计一个半加器
module half_adder(
input A,B,
output s,cout
);
assign cout=A&B;
assign S =A⊕B;
endmodule
下面对这个半加器例化N次
module N_half_adder
#( parameter N=2)
(
input [N-1:0] A,B,
output [N-1:0] s,cout
);
genvar i;
generate
for(i=0;i<N;i=i+1)
begin:inst_rtl
half_adder u0(.A(A[i]),.B(B[i]),.s(s[i]),.cout(cout[i]));
end
endgenerate
endmodule
仿真器会通过generate for begin后⾯的名字标识来⽣成结构
电路图如下所示
2.2 代码块选择
2.2.1 generate if
首先设计一个半加器
module half_adder(
input A,B,
output s,cout
);
assign cout=A&B;
assign S =A⊕B;
endmodule
在设计一个全加器
module full_adder(
input A,B,cin,
output s,cout
);
assign cout=(A^B)&cin+A&B;
assign s =A^B^cin;
endmodule
使用generate if ()进行代码块选择,其中generate if中的条件必须是参数
module select_design(
input A,B,cin,
output s,cout
);
parameter USE_CASE = 0;
generate
if (USE_CASE)
half_adder u0(.A(A),.B(B),.s(s),.cout(cout));
else
full_adder u0(.A(A),.B(B),.cin(cin),.s(s),.cout(cout));
endgenerate
endmodule
当USE_CASE = 0时电路图如下:
当USE_CASE = 1时电路图如下:
2.2.2 generate case
generate case语句和generate if语句用法无异,和普通的if与case一致,if具有优先级,case没有优先级。
generate
case(USE_CASE)
0:half_adder u0(.A(A),.B(B),.s(s),.cout(cout));
1:full_adder u0(.A(A),.B(B),.cin(cin),.s(s),.cout(cout));
endcase
endgenerate
三、参考文献
【Verilog】generate和for循环的一些使用总结(1)
Verilog初级教程(12)Verilog中的generate块
verilog中for循环