Menu Close

Verilog 中generate 语句

generate语句在Verilog中也是经常使用的语句,在并发语句中可以由generate引导的语句实现分支和循环,其使用形式特别类似always中的分支和循环语句,但是用法与含义却又不同,本节内容分如下几个部分介绍,generate的语法结构,generate语句的特点,generate语句的使用举例。

  1. generate语句的语法结构

generate语句的语法结构是由generate… endgenerate组成块构成的,其内部可以由case,if,for等引导的分支或循环语句构成,分支或循环也可以嵌套。

    • generate分支语句结构(case)


 

    • generate分支语句(if)

    • generate循环语句(for)

    • generate  for 循环语句嵌套

  • generate语句的特点:

    • generate语句只能用在并发过程中,不能用在always引导的顺序过程中。

    • generate语句内可以有多个并发过程,即可以使用assign赋值语句,也可以使用always过程。甚至可以使用带时钟边沿的always过程形成时序电路。但是always过程一定要在case,if或for之内,这一点与普通的always引导的分支与循环语句完全不同。例:利用generate for 实现8个数求最小值。假设数据m为 8-bit 位宽,8位深度的二维数组 。


从上例可以看出,在第二个for循环中使用了时序电路,但always必须在for循环之内。

  • generate 语句真正含义是实现例化,可以显式例化module模块,也可例化由赋值语句或always过程引导的块(block),如上例中的语句。


该for循环例化了4个比较电路,并将结果赋给m_tmpa[3],m_tmpa[2],m_tmpa[1]和m_tmpa[0]。

  • 应用举例

例1:参数化例化多个I2C接口


 

例1中利用generate for 例化多个I2C接口,所有的接口信号的握手关系也都通过generate 块结构实现。实际上在generate 引导的块中都是例化的结果,有的显式例化,如:


有的隐式例化(注意:Quartus下for格式必须显式例化),比如代码可以书写如下:


相当于隐式例化了NUM个always block组成的电路。

例2:利用 generate if 设计功能可参数化子模块,并提供例化模型

利用generate if生成的模型如下,


 

例3,利用generate case 生成的模型如下:


 

仿真激励程序(testbench) tb.v


 

在仿真程序中 例化了4个模块,分别为加(add),减(sub),乘( MUL)以及other, 在other中实现位拼接。

Modelsim的仿真波形如图1:

图1

可以在Quartus 下查看生成RTL电路,操作步骤如下:

  • 将tb.v设置成顶层文件,
  • Start Analysis and Elaboration
  • 鼠标左键单击菜单Tools–>Netlist Views–>RTL View,可以看到图2的结果

图2

  • 点击gen_if_case: gen_if_case_mul 查看底层模块,如图3,

图3

从图3中可以看出,例化名可以传递到底层。

  1. 练习题:
    1. 在Vivado下创建工程
    2. 在Vivado下综合本文中的例2和例3
    3. 仿真
    4. 查看RTL电路

 

对应视频:

Posted in FPGA, FPGA 教材教案, Quartus II, Verilog, Vivado, 教材与教案, 文章