0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog generate语句的类型

数字前端ic芯片设计 来源:未知 作者:李倩 2018-03-16 14:34 次阅读

Verilog的generate语句能够帮助我们写出可配置可综合的RTL,主要用于重复性实例化模块或者有条件地实例化模块。这篇文章将简单回顾一下verilog generate语句。

Verilog generate语句的类型一

有两种不同的generate语句结构。

Generate loop能够将一段代码例化多次,通过一个index变量来控制。

conditional generate语句能够在多段代码中选择一段进行例化。Conditional generate包括了if-generate和case-generate两种不同模式。

Verilog的generate语句在仿真/综合的elaborate阶段进行分析,这个步骤发生在HDL语言解析之后,在仿真/综合之前。因此generate结构中包含的所有表达式在elaborate的时候都要是确定的表达式,不能包含动态变量。比如,generate中的语句能受parameter影响,但不能被动态变量影响。

一个verilog generate模块创建了一个新的层次,就像实例化了一个模块一样。

关键字generate和end generate(以及begin/end)实际上不是必须的,如果使用的话,那么他们就定义了一块generate的区域,generate的区域只能存在于在module这个scope里。

generate loop一

Generate loop的语法和for loop很类似。Index变量要先用genvar关键字来定义,genvar所定义的index变量会被用在elaboration中。Genvar可以存在于generate region(由generate-endgenerate关键字来限定)之内或之外。同一个genvar定义的index可以被用在多个generate loop中,只要这些loop没有互相嵌套。

如果将generate loop展开,在每个generate loop instance中,都会创建一个隐含的localparam,其名字和类型与genvar所定义的index相同,其值就是当前的循环次数。这个localparam能够用来控制生成代码。

Generate loop所生成的模块可以被命名也可以不被命名。如果被命名,那么将会生成以所给名字开头的一个数组,每个数组元素是一个模块hierarchy。有些工具对于未命名的generate loop会给予警告,因此最好将其命名。

下面的例子是一个使用verilog generate loop来生成的格雷码->二进制码的转换器

另外一个来自verilog-2005 LRM的例子阐述了每个verilog generate loop是如何生成一个新的scope的。注意到wire t1,t2,t3都是在generate loop中被声明的,每个loop iteration都创建了完全不冲突的三个t1,t2,t3。他们都被用于在每个不同的数组模块中连接相应的电路。并且注意到这些被实例化的xor,and的命名方式。

generate loop同样能嵌套。只需要单一一个generate/endgenerate来包裹这些嵌套的generate loop。每个generate loop都建立一个新的scope。

if-generate一

Conditional if-generate会从一组互斥的generate block中最多选择一个generate block。注意到这里说的是最多选择一个,也有可能一个都不选。而这个判断语句在elaborate的时候也必须是常量表达式。

与generate loop一样,conditional if-generate可以命名也可以不命名,可以使用也可以不使用begin-end。它同样会创建一个新的scope以及hierarchy层次。因为conditional generate选择至多一个block的代码,对于互斥的block code,在同一个if-generate结构里可以有同样的命名。这能够帮助保留层次名,无论哪个block的代码被选择。而不同的generate结构则一定要有不同的名字。

case-generate一

与if-generate类似。case-generate最多会从一组互斥的generate block中选择一个generate block。它的用法和传统的case语句一样。

嵌套的 conditional generate block没有用begin end来切割会被归为单独一个scope/hierarchy。这能够避免在同一个module中创建没变要的scope/hierarchy。下面的例子是一个嵌套conditional generate block的例子

generate结构会选择至多一个叫u1的generate block。而g1的hierarchcal名字是test.u1.g1。当嵌套if-generate 结构的时候,else永远属于最近的if。注意到这里任何多余的begin-end会违反这个direct nest规则,从而生成新的hierarchy。

generate模块命名一

推荐给generate construct命名来简化层次索引。并且有些工具对于不命名的generate block会报错。

如果不命名的话,首先,每个generate construct在一个scope中都被赋予了一个数字,从1开始。看其在rtl code中是第几个出现的generate就被赋值为几。这个数字对于命名和未命名的generate block都有。所有未命名的block都会被取一个叫genblk【n】的名字,n就是被赋予的数字。

很明显随着RTL规则的改动这些未命名的generate construct的名字也会改变。这样对于保证RTL层次化会有困难。因此建议总是对generate block进行命名。

小结一

Generate 结构在创建可配置的RTL的时候很有用。Generate loop能够让语句实例化多次,通过index来控制。而conditional generate能够选择性地实例化语句。最重要的是要记得对generate construct进行命名,这能够帮助简化层次对象以及代码维护。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1343

    浏览量

    109972

原文标题:Verilog——关于generate语句

文章出处:【微信号:ic_frontend,微信公众号:数字前端ic芯片设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Verilog之for语句

    以前很少用for语句,以为是不可综合的。在印象中好像只用循环生成(for...generate语句综合过多个模块。最近在仔细研读《轻松成为设计高手——Verilog HDL使用精解》
    发表于 08-13 14:59

    Veriloggenerate if 语句如何用systemc实现?

    Veriloggenerate if语句如何用systemc实现?例如:generateif (SIZE < 8)assign y = a & b & c;else
    发表于 08-28 12:06

    Veriloggenerate if语句如何用systemc实现?

    1.Veriloggenerate if语句如何用systemc实现?例如:generateif (SIZE < 8)assign y = a & b & c;else
    发表于 08-29 16:11

    新手求解verilog 中的生成块语句 的意思

    verilog 中的 generate for 语句好理解,但是 generate if 和 generate case
    发表于 12-21 12:44

    【梦翼师兄今日分享】 generate语句块的讲解

    的列举就会变得很笨拙甚至是不可行的。C语言处理这种问题通常情况下会使用如for循环语句来完成多次的相同操作。而verilog 语言呢?同样的为我们提供了generate语句块来帮助我们
    发表于 12-04 10:33

    veriloggenerate语句的用法分享

    generateverilog中的生成语句,当对矢量中的多个位进行重复操作时,或者当进行多个模块的实例引用的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog
    发表于 12-23 16:59

    generate语句的基本概念与用法

    生成语句GENERATE)是一种可以建立重复结构或者是在多个模块的表示形式之间进行选择的语句。由于生成语句可以用来产生多个相同的结构,因此使用生成
    的头像 发表于 11-21 07:08 5832次阅读

    Verilog可综合的循环语句

    Verilog中提供了四种循环语句,可用于控制语句的执行次数,分别为:for,while,repeat,forever。其中,for,while,repeat是可综合的,但循环的次数需要在编译之前就确定,动态改变循环次数的
    发表于 10-13 12:23 1.9w次阅读

    Verilog教程之Verilog HDL程序设计语句和描述方式

    本文档的主要内容详细介绍的是Verilog教程之Verilog HDL程序设计语句和描述方式。
    发表于 12-09 11:24 47次下载
    <b class='flag-5'>Verilog</b>教程之<b class='flag-5'>Verilog</b> HDL程序设计<b class='flag-5'>语句</b>和描述方式

    verilog中的initial语句说明

    解释verilog HDL中的initial语句的用法。
    发表于 05-31 09:11 0次下载

    简述Verilog HDL中阻塞语句和非阻塞语句的区别

      在Verilog中有两种类型的赋值语句:阻塞赋值语句(“=”)和非阻塞赋值语句(“=”)。正确地使用这两种赋值
    的头像 发表于 12-02 18:24 6023次阅读
    简述<b class='flag-5'>Verilog</b> HDL中阻塞<b class='flag-5'>语句</b>和非阻塞<b class='flag-5'>语句</b>的区别

    Verilog语法之generate for、generate if、generate case

    Verilog-2005中有3个generate 语句可以用来很方便地实现重复赋值和例化(generate for)或根据条件选择性地进行编译(ge
    的头像 发表于 12-28 15:21 2646次阅读

    Verilog中的If语句和case语句介绍

    我们在上一篇文章中已经看到了如何使用程序块(例如 always 块来编写按顺序执行的 verilog 代码。 我们还可以在程序块中使用许多语句来控制在我们的verilog设计中信号赋值的方式
    的头像 发表于 05-11 15:37 4293次阅读
    <b class='flag-5'>Verilog</b>中的If<b class='flag-5'>语句</b>和case<b class='flag-5'>语句</b>介绍

    如何使用参数化编写可重用的verilog代码

    我们将介绍如何使用verilog参数和generate语句来编写可重用的verilog 代码。 与大多数编程语言一样,我们应该尝试使尽可能多的代码可重用。这使我们能够减少未来项目
    的头像 发表于 05-11 15:59 1082次阅读

    Verilog常用的循环语句及用途

    本文主要介绍verilog常用的循环语句,循环语句的用途,主要是可以多次执行相同的代码或逻辑。
    的头像 发表于 05-12 18:26 2310次阅读