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~