Verilog语言中generate的用法

本文介绍了Verilog语言中的generate语句,重点讲解了其generate-for、generate-if和generate-case三种结构,以及如何在模块设计中通过genvar变量实现代码重复和条件性编排,以支持参数化设计和层次化引用。
摘要由CSDN通过智能技术生成

generate 语句可以动态地生成 Verilog 代码,常用于编写许多结构相同但参数不同的赋值语句或逻辑语句,方便参数化模块的生成。

generate 语句有些资料说是有三种用法,但我认为本质上就是两种用法。

  1. 对矢量中的多个位进行重复操作
  2. 根据参数定义来确定程序中是否应该包括某段 Verilog 代码

generate 语句有主要三种结构:

  • generate - for 语句结构
  • generate - if 语句结构
  • generate - case 语句结构

 其中generate - for 语句结构主要用来对矢量中的多个位进行重复操作。

generate - if 、generate - case主要根据参数定义来确定程序中是否应该包括某段 Verilog 代码。

 

generate - for
在使用前必须先声明一个 genvar 变量,用于 for 循环判断,一个 genvar 变量可用于多个generate 循环。但使用同一个 genvar 变量的 generate 语句不能相互嵌套。genvar 只有在建模时会出现,仿真时不会出现这个变量。

在 generate - for 循环结构中,可以对 generate 块命名,会创建一个generate块实例数组,如果未命名,有些仿真工具会出现警告。
以下为例子:

genvar i;
generate
    for (i = 0; i < 15; i++)
    begin: xorLoop
        always @(posedge clk or negedge rst_n)
            if (!rst_n) begin
                dout[i] <= 1'b0;
            end
        	else begin
                dout[i] <= din0[i] ^ din1[i];
            end
    end
endgenerate
genvar i;
generate
    for (i = 0; i < 15; i++)
    begin: xorLoop
        xor u_xor(
            .dout	(dout[i]),
            .din0	(din0[i]),
            .din1	(din1[i])
        );
    end
endgenerate

这两个模块的功能是一样的,第一个栗子是对 always 块进行了循环,第二个栗子是对实例化模块进行了循环。xorLoop 是 generate 语句模块名,目的是通过它对循环语句进行层次化引用,所以在上面栗子中的 xorLoop 模块相对层次名为 xorLoop[0].u_xor, xorLoop[1].u_xor…等。

在仿真时,仿真器会将 generate 块代码展开,上面的代码就相当于

xorLoop u_xor0(.dout(dout[0]), .din0(din0[0]), .din1(din1[0]));
xorLoop u_xor1(.dout(dout[1]), .din0(din0[1]), .din1(din1[1]));
// ......
xorLoop u_xor15(.dout(dout[15]), .din0(din0[15]), .din1(din1[15]));

generate - if
generate -if 语句不需要 genvar,可以不对 generate 块进行命名,而且可以不写 begin / end。由于在一个 generate - if 语句中通过判断语句最多执行一个代码块,所以对各个代码块用相同名称命名是合法的,且有助于保持对代码的层次化引用。

需要注意的一点是,在 generate 块中的判断条件必须是常量!

parameter div = 8;
generate
    if (div == 4) begin: u1
        div4 u_div4(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
    end
    else if (div == 8) begin: u1
    	div8 u_div8(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
    end
endgenerate

generate - case

generate - case 语句和 generate - if 语句都是条件判断,用法基本一致。

和 generate - if 语句一样,case 判断条件必须是常量。

parameter div = 8;
generate
    case(div)
        4: div4 u_div4(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
        8: div8 u_div8(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
    endcase
endgenerate

References

Rose Island : https://blog.csdn.net/weixin_42150654/article/details/123132249

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值