verilog语法:for与generate...for

发布时间 2023-05-03 10:17:53作者: foghorn

1 for循环

  1. for循环必须在always块内使用,对应的always块内的变量需声明为reg类型。
  2. 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