原始文章链接: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