1 for循环
- for循环必须在always块内使用,对应的always块内的变量需声明为reg类型。
- verilog的for和C语言的for的不同点:C语言的for里面的语句是串行执行,而verilog的for内的语句是并行执行的。例如下面的移位寄存器案例。
integer i;
always @ (posedge clk)
begin
data_reg[0] <= data_in;
for(i = 0; i < 4; i = i+1) begin
data_reg[i+1] <= data_reg[i];
end
end
其等效实现方式为:
always @ (posedge clk)
begin
data_reg[0] <= data_in;
data_reg[1] <= data_reg[0];
data_reg[2] <= data_reg[1];
data_reg[3] <= data_reg[2];
data_reg[4] <= data_reg[3];
end
generate...for
genvar i;
generate for(i=0;表达式2;表达式3)
begin :起个名字
...;
end
endgenerate
作用上:和for是一样的;
区别:
(1)generate for的循环变量必须用genvar声明,for的变量可以用reg、integer整数等多种类型声明;
(2)for只能用在always块里面,generate for可以做assign赋值,用always块话always写在generate for里;
(3)generate for后面必须给这个循环起一个名字,for不需要;
(4)generate for还可以用于例化模块;
`timescale 1ns/1ns
module gen_for_module(
input [7:0] data_in,
output [7:0] data_out
);
// 2. for,必须写在always块里
integer i;
reg [7:0] dout_reg;
always @ (*) begin
for(i = 0; i < 8; i = i+1) begin
dout_reg[i] = data_in[7-i];
end
end
assign data_out = dout_reg;
endmodule
`timescale 1ns/1ns
module gen_for_module(
input [7:0] data_in,
output [7:0] data_out
);
//必须使用genvar声明循环变量
genvar ii;
generate for(ii = 0; ii < 8; ii = ii+1)
begin : aaa_i
assign data_out[ii] = data_in[7-ii];
end
endgenerate
endmodule