Verilog笔记—generate块

原始文章链接:https://zhuanlan.zhihu.com/p/107047600
作者:数字IC小站

1.generate概述

generate块作用:V中的generate语句常用于编写可配置的可综合的RTL的设计结构。它可用于创建模块的多个实例化,或者有条件的实例化代码块

generate块中允许使用的类型:module,UDP,门级原语,连续赋值语句,initial或always语句等。

在V中,generate是在建模(elaboration)阶段实施,在预处理之后,仿真开始之前(仿真开始前,此时所有的设计模块已经被链接到一起,并完成层次的引用)。因此,generate结构中的所有表达式都必须是常量表达式,并在建模时确定。generate结构可能受参数值的影响,但不受动态变量的影响。V中的generate块创建了新的作用域和新的层次结构,就像实例化模块一样。因此在尝试对generate块中的信号进行引用时,很容易出现混乱,因此请特别注意。

2.generate语法

首先定义genvar,作为generate的循环变量。generate循环中使用的索引变量必须由genvar声明。genvar变量的声明可以在generate的内部或外部。相同的循环索引变量可以在多个generate循环中(并行?),但是这些循环不能嵌套。genvar只有在建模时才会出现,在仿真时就已经消失了。

在generate语句中定义for语句。V中的generate循环中的generate块可以命名也可以不命名。如已命名,则会创建一个generate块实例数组。如果未命名,则有些仿真工具会出现警告。推荐对generate块进行命名。在“展开”生成循环的每个实例中,将隐式创建一个localparam,其名称和类型与循环索引变量相同。他的值是“展开”循环的特定实例的“索引”(循环退出时genvar变量的值?)。

generate语法如下:

genevar 循环变量名;
generate
	//generate循环语句
	//generate条件语句
	//generate分支语句
	//嵌套的generate语句
endgenerate
3.generate分类
  • 循环generate:用来多次实例化某个模块。
  • 条件generate:用来在多个块之间最多选择一个代码块,有两种形式。
    • if-generate结构
    • case-generate形式
  • 断言:使用generate生成多条断言。

3.1 generate-for循环

generate-for和普通for循环语法非常相似。不同之处在于generate-for循环每次迭代生成一个实例,循环多少次就实例化几个模块
在这里插入图片描述
在这里插入图片描述

3.2 if-generate循环
if-generate从备选块中选择最多一(0或1)个generate块。在建模中,条件必须为常量表达式
循环块的命名:条件if-generate不关心是否命名,并且可以不具有begin-end。他也会创建单独的范围层次结构级别,这个和generate循环是一样的。由于最多选择一个代码块,因此在单个的if-generate中以相同的名称命名所有的备用代码块是合法的,而且这有助于保持对代码的分层引用。但是,不同的generate块中必须具有不同的名称。

在这里插入图片描述
在这里插入图片描述

3.3 条件case-generate
与if-generate类似,case-generate也可用于从几个块中有条件的选择一个代码块。用法类似基本case语句,并且if-generate中的所有规则也适用与case-generate。

在这里插入图片描述

3.4 断言和形式验证
在编写断言时,generate构造也非常有用。如果有一个具有8个REQ输入和8个ACK输出的仲裁器块,那么与其编写1个断言来覆盖所有8个REQ/ACK对,不如将其分解为具有1个REQ/ACK对的8个独立断言。
在这里插入图片描述

4. 层次化访问生成的模块

使用generate会产生层次化,并且选择的模块或者产生的模块都会具有一个名称。如果未命名,则编译器将自动分配一个通用的名称。
要访问generate块中的模块项,必须使用<generate_blk_name>.<module_item_name>进行分层访问。

本章小结:
  • generate用于创建可配置RTL,根据参数设置具有不同的行为。
  • generate循环允许代码由索引控制多次实例化。
  • 条件generate可以有条件地实例化代码。
  • 断言中也可以利用generate进行多次生成断言操作。

其他参考文献:
https://blog.csdn.net/lxm920714/article/details/123215816

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值