Verilog中Generate语句的使用

1、Generate语句基本介绍

        Generate语句又称为生成语句,可以动态地生成Verilog代码,是Verilog-2001从VHDL借鉴而来。这一声明语句方便了参数化模块化的生成。例如:

        (1)当对矢量中的多个位进行重复操作时;

        (2)当进行多个模块的实例引用的重复操作时;

        (3)在根据参数的定义来确定程序中是否应该包括某段Verilog代码时。

 使用生成语句能够大大简化程序的编写过程。

        生成语句能够控制变量的声明、任务或函数的调用,还能对实例引用进行全面的控制。编写代码时必须在模块中说明生成的实例范围,关键字generate - endgenerate用来指定该范围。生成实例可以是以下的一个或多种类型:

        (1)模块;

        (2)用户定义原语;

        (3)门级原语;

        (4)连续赋值语句;

        (5)initial和always块。

       生成的声明和生成的实例能够在设计中被有条件地调用(实例引用)。在设计中可以多次调用(实例引用)生成的实例和生成的变量声明。生成的实例具有唯一的标识名,因此可以用层次命名规则引用。为了支持结构化的元件与过程块语句的相互连接,Verilog语言允许在生成范围内声明下列数据类型:

        (1)net(线网)、reg(寄存器);

        (2)integer(整型数)、real(实型数)、time(时间型)、realtime(实数时间型);

        (3)event(事件)。 

        生成的数据类型也具有唯一的标识名,可以被层次引用。此外,究竟是使用按照秩序或者参数名赋值的参数重新定义,还是使用defparam声明的参数重新定义,都可以在生成范围内定义。(注意:生成范围中定义的defparam语句所能够重新定义的参数必须是在同一个生成范围内,或者是在生成范围的层次化实例当中。) 

        任务和函数的声明也允许出现在生成范围之中,但是不能出现在循环生成当中。生成任务和函数同样具有唯一的标识符名称,可以被层次引用。

        不允许出现在生成范围之中的模块项声明包括:

        (1)参数,局部参数;

        (2)输入、输出和输入/输出声明;

        (3)指定块。

2、三种生成语句

        在Verilog中有3种创建生成语句的方法,它们分别是:循环生成、条件生成、case生成,接下来将详细介绍这3种生成语句。

2.1、循环生成语句

        循环生成语句允许使用者对下面的模块或模块项进行多次实例引用:

        (1)变量声明;

        (2)模块;

        (3)用户定义原语、门级原语;

        (4)连续赋值语句;

        (5)initial和always块。

        在仿真开始之前,仿真器会对生成块中的代码进行确立(展平),将生成块转换为展开的代码,然后对展开的代码进行仿真。因此,生成块的本质是使用循环内的一条语句来代替多条重复的Verilog语句,简化用户的编程。循环生成语句允许使用for循环多次实例生成块,它需要使用循环变量,需要使用genvar声明的变量。genvar当做整数在elaboration时使用,用于计算generate循环,创建生成块实例。genvar是VGS(Verilog Standard Group)争吵的结果,只可用于generate语句,不可用于其他地方,而且在仿真时不可见。VGS认为增加一个限制用途的变量类型是最安全的办法,因为他们不想在integer上加入一些用于generate语句的规则。关于genvar的要求如下:

        (1)genvar既可以在generate语句的里面声明,也可以在generate语句的外面声明。

        (2)genvar是正整数,只能用于generate循环,在仿真时不存在。

        (3)两个使用同一个genvar的generate循环不能嵌套。

        (4)可以把genvar当做常量,用于修改模块的parameter。

        (5)genvar声明的生成变量,只能用在生成块之中,并且生成变量的值只能由循环生成语句来改变。

2.2、条件生成语句

        条件生成语句类似于if_else_if的生成构造,该结构可以在设计模块中根据经过仔细推敲并确定并确定表达式,有条件地调用(实例引用)以下这些Verilog结构:

        (1)模块;

        (2)用户定义原语、门级原语;

        (3)连续赋值语句;

        (4)initial或always块。        

2.3、case生成语句

        case生成语句可以在设计模块中, 根据仔细推敲确定多选一case构造,有条件地调用(实例引用)下面这些Verilog结构:

        (1)模块;

        (2)用户定义原语、门级原语;

        (3)连续赋值语句;

        (4)initial或always块。 

        无论是条件生成语句还是case生成语句,在elaboration时,基于常数表达式的值从一组生成块中最多选择一个,然后把它实例化到模块中。因为最多只能选择一个生成块实例化,所以这些生成块的名字可以相同。

~OVER~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Panda 皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值