目录

generate的结构类型

1.generate循环结构

2.条件if-generate构造

3.条件case-generate构造

4.断言和形式验证

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

总结


Verilog中generate的使用 - 知乎

Verilog中的generate语句常用于编写可配置的、可综合的RTL的设计结构。它可用于创建模块的多个实例化,或者有条件的实例化代码块。然而,有时候很困惑generate的使用方法,因此看下generate的几种常用用法。

generate的结构类型

我们常用generate语句做三件事情。一个是用来构造循环结构,用来多次实例化某个模块。一个是构造条件generate结构,用来在多个块之间最多选择一个代码块,条件generate结构包含if--generate结构和case--generate形式。还有一个是用来断言。

在Verilog中,generate在建模(elaboration)阶段实施,出现预处理之后,正式模拟仿真之前。因此。generate结构中的所有表达式都必须是常量表达式,并在建模(elaboration)时确定。例如,generate结构可能受参数值的影响,但不受动态变量的影响。

Verilog中的generate块创建了新的作用域和新的层次结构,就像实例化模块一样。因此在尝试对generate块中的信号进行引用时,很容易因此混乱,因此请记住这一点。

1.generate循环结构

generate循环的语法与for循环语句的语法很相似。但是在使用时必须先在genvar声明中声明循环中使用的索引变量名,然后才能使用它。genvar声明的索引变量被用作整数用来判断generate循环。genvar声明可以是generate结构的内部或外部区域,并且相同的循环索引变量可以在多个generate循环中,只要这些环不嵌套。genvar只有在建模的时候才会出现,在仿真时就已经消失了。

在“展开”生成循环的每个实例中,将创建一个隐式localparam,其名称和类型与循环索引变量相同。它的值是“展开”循环的特定实例的“索引”。可以从RTL引用此localparam以控制生成的代码,甚至可以由分层引用来引用。

Verilog中generate循环中的generate块可以命名也可以不命名。如果已命名,则会创建一个generate块实例数组。如果未命名,则有些仿真工具会出现警告,因此,最好始终对它们进行命名。

我们来看个关于generate循环的例子:

仿真代码如下:

仿真结果如上所述,那么generate for循环和普通的for循环相比有什么优点呢?通常,generate for循环和普通 for循环之间的主要区别在于generate for循环正在为每次迭代生成一个实例。这意味着在上述示例中将始终有2个实例块(与常规循环情况下的1个块相反)。

2.条件if-generate构造

条件语句从很多的备选块中选择最多一个generate块,请注意,在这我说的是最多,因为有可能是一个也不选择的。在建模中,条件必须为常量表达式。

条件if-generate不关心是否命名,并且可以不具有begin / end。当然,上述两个条件只能包含一项。它也会创建单独的范围和层次结构级别,这个和generate循环是一样的。由于最多选择一个代码块,因此在单个的if-generate中以相同的名称命名所有的备用代码块是合法的,而且这有助于保持对代码的分层引用。但是,不同的generate构造中必须具有不同的名称。

仿真结果如下:因此,generate可以代替if..else,并且是在不需要时钟的情况下,可以选择实例化不同的模块。注意,此种写法中,是不含有genvar的。

3.条件case-generate构造

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

此generate构造将最多选择一个名为u1的块。该块中的门实例的层级名称为test.u1.g1。

4.断言和形式验证

在编写断言时,generate构造也非常有用,这反过来有助于形式验证。例如,如果有一个具有8个REQquest输入和8个ACK输出的仲裁器块,那么与其编写单个断言来覆盖所有8个REQ / ACK对,不如将其分解为具有1个REQ / ACK的8个独立断言每个声明对。

换个例子,假设我们需要对一个双向的系统,含有客户端和服务器端,需要对双向进行断言,我们可以使用generate构造,将属性定义为assert或者assume等。

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

前面也提到过,使用generate会产生层次化,并且选择的模块或者产生的模块都会具有一个名称。如果未命名,则编译器将自动分配一个通用名称。

要访问generate块中的模块项,您必须使用<generate_blk_name>.<module_item_name>进行分层访问。

总结

generate构造是创建可配置RTL的强大方法,该RTL可以根据参数设置具有不同的行为。generate循环允许代码由索引控制多次实例化。条件generate可以有条件地实例化代码。关于generate构造的最重要建议是始终为它们命名,这有助于简化层次结构引用和代码维护。

Verilog中generate的使用 - 数字IC小站的文章 - 知乎 https://zhuanlan.zhihu.com/p/107047600

Verilog中generate的使用相关推荐

  1. Verilog中generate语法和作用

    Verilog中generate语句的用法 在Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计 ...

  2. Verilog中generate用法总结

    Verilog中generate用法总结 1.generate-for 2.generate-if 3.generate-case 生成语句可以动态的生成verilog代码,当对矢量中的多个位进行 重 ...

  3. Verilog中generate的用法

    Generate 语句基本概念 generate 语句可以动态地生成 Verilog 代码,常用于编写许多结构相同但参数不同的赋值语句或逻辑语句,方便参数化模块的生成.generate 语句主要有以下 ...

  4. verilog中generate语句的使用

    原文地址:https://blog.csdn.net/qq_38428056/article/details/84821982 至芯科技的书上看到的,觉得还行吧,给大家分享一下. 一.为什么学习gen ...

  5. Verilog中generate语句的用法

    在Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计提供了方便,generate语句一般在循环和 ...

  6. 【FPGA】Verilog中generate用法

    创作时间:2021-08-18 1.一些说明: generate循环的语法与for循环语句的语法很相似. genvar只有在建模的时候才会出现,在仿真时就已经消失了. 但是在使用时必须先在genvar ...

  7. Verilog初级教程(12)Verilog中的generate块

    文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...

  8. verilog中数组的定义_开源仿真工具Icarus Verilog中的verilog parser

    前面提到用flex和bison开处理命令行参数,回顾一下:开源仿真工具Icarus Verilog中的命令行参数处理方法. 那么Verilog的parser又是怎么实现的呢?简单地说,与做命令行参数的 ...

  9. FPGA的设计艺术(18)如何使用Verilog中的数组对存储器进行建模?

    前言 Verilog中的二维数组很有用,可以使用for以及generate for配合二维数组进行使用,可以代替大量寄存器的场合,其实大量同类寄存器可以使用存储器进行代替,Verilog中可以使用二维 ...

最新文章

  1. 骚操作!用 CPU 烤肉,这位程序员做到了
  2. redhat 配置yum代理源
  3. 大数据搜索:Python编码实战
  4. Screen返回选择界面的问题
  5. python常用库教程_这几个python常用的库你必须知道!
  6. 微软在Skype推出LGBT骄傲月表情与贴纸
  7. 【nodejs笔记3】Express基本用法,和路由控制,和模板渲染ejs
  8. 吴恩达机器学习 -- 逻辑回归(Logistic Regression)
  9. 【LeetCode笔记】206. 反转链表(Java、迭代、递归、链表)
  10. Delphi 与 DirectX 之 DelphiX(80): TDIB.BlendPixel();
  11. mybatis There is no getter for property named 'xx' in 'class java.lang.String
  12. C++基础与深度解析第三章:数组、vector与字符串
  13. Pandas系列(十二)实现groupby分组统计
  14. arm linux开机第一屏,小白求助大神T1刷机提示成功,但开机卡在斐讯白屏界面。...
  15. 使用js计算字符串的长度
  16. 适合普通人的108个短视频项目:不用出镜也能赚钱的手机摄影玩法(3)
  17. Lua中保留两位小数
  18. 如何使用远程桌面连接远程计算机?
  19. SAP SE16N 如何显示英文
  20. Nice 片 之 兄 dei 一起来看看 MMKV 。。。

热门文章

  1. 输入法智能联想 Java_[Android6.0][MTK6737] 修改默认输入法为 Sogou
  2. 韩国济州魔米(JEJUMAMI)推出产自洁净济州的儿童零食“小小谷片”
  3. tomcat配置日志存放地址
  4. 用什么软件可以给视频变声?可以视频变声的软件推荐
  5. php表单输入内容换行,php中表单输入框中换行回车替换
  6. 解决:UnicodeDecodeError: 'gbk' codec can't decode byte 0x8b in position 21804: illegal multibyte seque
  7. JAVA求解橘子算法
  8. mysql workbench批量导出导入sql文件
  9. TensorFlow框架学习笔记
  10. 小米推出最新“全家桶”,为上市献礼?