verilog HDL -生成块 - generate——endgenerate

参考:vrilog数字系统设计 夏宇闻 【第3版】 5.7

生成块理解

 
生成语句可以动态的生成verilog代码,方便参数化模块的生成,大大的简化程序的编写过程,常用于以下情况:

  • 对矢量中的多个位进行重复操作
  • 进行多个模块的实例引用的重复操作
  • 根据参数的定义来确定程序中是否应该包含某段Verilog代码

生成语句对primitive 和module 进行复制结构建模, 除了允许复制产生 primitive 和 module 的多个实例化,同时也可以复制产生多个net、reg、parameter、assign、always、initial、task、function。编写代码必须在关键字generate-endgenerate指定范围内 。

generate 语句有 generate-for、genreate-if 和 generate-case 三种语句。

generate-for 语句

  1. generate-for 语句必须用 genvar 关键字定义 for 的索引变量;索引变量必须是正整数,不可用“X”或”Z“或者“负值“。
  2. for 的内容必须用 begin…end 块包起来,哪怕只有一句;
  3. begin…end 块必须起个名字;
  4. genvar 变量可以声明在 generate 语句内,也可以声明在 generate 语句外。

例 1:例化多个module

genvar xdata_i;

reg [15:0] xdata_delay[xdata_delay_num-1:0];
reg xdata_en[xdata_delay_num-1:0];
reg [31:0] xdata_in[xdata_delay_num-1:0];

generate for(xdata_i=0; xdata_i<2; xdata_i = xdata_i + 1) begin: xdata_load_delay
    xdata_load_ram xdata_delay (
        .rst(~drophead_end), 
        .clk(sys_clk), 
        .delay(xdata_delay[xdata_i]), 
        .xdata_en(xdata_en[xdata_i]), 
        .xdata(xdata_in[xdata_i]), 
        .xdata_out(xdata_out_temp[xdata_i])
    );
    end

例化图示:
在这里插入图片描述

例 2:多层 generate 语句用法

module GENERATE_FOR_2;
localparam SIZE = 2;    
           
genvar i,j,k,l;

generate 
for(i=0; i<SIZE; i=i+1) begin:B1
    DEMO1 INST1();
    for(j=0;j<SIZE; j=j+1) begin:B2
        DEMO2 INST2();
        for(k=0; k<SIZE; k=k+1) begin:B3
            DEMO3 INST3();
        end
    end
    if(i>=0)
        for(l=0; l<SIZE; l=l+1)begin:B4
            DEMO4 INST4();
        end
end

endgenerate

endmodule

例化图示:
在这里插入图片描述

例3:定义局部变量以及赋值

本例实现3个方面:在 begin…end 内部定义局部变量,genvar 变量声明在语句内,实现赋值。

module generate_for_3#(
parameter DATA_WIDTH = 2
)(
input clk,
input rst_n,
input [DATA_WIDTH-1:0] a,
input [DATA_WIDTH-1:0] b,
input [DATA_WIDTH-1:0] c,
output [DATA_WIDTH-1:0] out
);
reg [DATA_WIDTH-1:0] sum_reg;
wire [DATA_WIDTH-1:0] sum;

generate

genvar i;

    for(i=0; i<DATA_WIDTH; i=i+1) begin: bit
        wire sum_temp; // generated net declaration
        xor out1 (sum_temp,a[i],b[i]);
        and out2 (sum[i],sum_temp,c[i]);
        assign out[i] = sum[i];
        always @(posedge clk)begin
            if(!rst_n)
                sum_reg <= 0;
            else
                sum_reg <= sum;
        end
    end
endgenerate

endmodule

仿真结果如下图:
在这里插入图片描述
testbentch代码如下:

//~ `New testbench
`timescale  1ns / 1ps

module tb_generate_for_3;

// generate_for_3 Parameters
parameter PERIOD      = 10;
parameter DATA_WIDTH  = 2;

// generate_for_3 Inputs
reg     clk=0;
reg     rst_n=0;
reg   [DATA_WIDTH-1:0]  a                  = 0 ;
reg   [DATA_WIDTH-1:0]  b                  = 0 ;
reg   [DATA_WIDTH-1:0]  c                  = 0 ;

initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

initial
begin
    #(PERIOD*2) rst_n  =  1;
end

generate_for_3 #(
    .DATA_WIDTH ( 2 ))
 u_generate_for_3 (
    .clk                       (clk ),
    .rst_n                       (rst_n ),
    .a                       ( a  [DATA_WIDTH-1:0] ),
    .b                       ( b  [DATA_WIDTH-1:0] ),
    .c                       ( c  [DATA_WIDTH-1:0] )
);
initial
begin
    a = 2'b01;
    b = 2'b11;
    c = 2'b10;
    #500;
    a = 2'b11;
    b = 2'b00;
    c = 2'b01;
    #500;
    a = 2'b10;
    b = 2'b01;
    c = 2'b00;
    #1500;
    $finish;
end

endmodule

generate-if 语句

generate-if语句根据条件不同产生不同的实例化:根据模块参数(常量)的条件是否满足来选择其中一段代码生成相应的电路

例:

module generate_if_1;

localparam SIZE = 3;

wire [7:0] o_tdata;
wire o_tvalid;

   generate
      if(SIZE>9)
	       DEMO1 inst_1();
      else if(SIZE==2)
	       begin
               assign o_tdata = 8'd255;
               assign o_tvalid = 1'd1;
	       end
	   else 
	       DEMO2 inst_2();
   endgenerate
   
endmodule

例化示意图如下:
在这里插入图片描述

generate-case 语句

用法跟 generate-if 语句一样,参数也必须是常数,只是采用 case 语句的形式。

例:

module generate_case;

localparam WIDTH = 3;

generate
    case(WIDTH)
        1:DEMO1 INST_1();
        2:DEMO2 INST_2();
        default: DEMO3 INST_3();
    endcase
endgenerate

endmodule

例化示意图如下:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Verilog HDL 是一种硬件描述语言 (HDL),它主要用于描述数字电路和系统级集成电路 (System-on-Chip, SoC) 的行为和功能。它是一种高级语言,常用于硬件设计和仿真。使用 Verilog HDL,设计人员可以描述数字电路的逻辑功能和时序特性,然后使用仿真器进行验证和调试。 在 Verilog HDL 中,我们可以使用不同的关键字和语法来创建模、端口、端口方向、数据类型、信号赋值等。模Verilog HDL 中的基本单位,它可以包含多个输入和输出端口。端口定义了模与其他模之间的通信接口。端口方向可以是输入 (input)、输出 (output) 或双向 (inout),用于指定数据的流向。数据类型包括整数 (integer)、实数 (real) 和位 (bit),不同的数据类型用于表示不同的数据。信号赋值用于将数值或逻辑表达式赋予给信号。 Verilog HDL 还支持层次化设计和模化开发。通过将整个系统划分为多个模,可以提高设计的可维护性和可重用性。模之间可以通过端口连接和信号赋值实现数据传输和通信。 Verilog HDL 还具有强大的编译和仿真工具支持,如常用的 Xilinx ISE、Mentor Graphics ModelSim 等。这些工具可以将 Verilog HDL 代码编译成目标设备的配置文件,然后进行仿真和验证。通过仿真,我们可以验证设计的正确性和功能。 总的来说,Verilog HDL 是一种用于描述数字电路和 SoC 的硬件描述语言,它具有丰富的语法和语义,支持层次化设计和模化开发,通过编译和仿真工具可以实现设计的验证和验证。 ### 回答2: Verilog是一种硬件描述语言(HDL),用于设计和实现数字电路。它是一种硬件描述语言,用于描述数字系统的行为和结构,并用于验证和生成模拟和数字电路。 Verilog可以被用于设计各种数字电路,包括处理器、存储器、控制器和其他集成电路。它被广泛应用于数字系统设计和验证领域,尤其是在硬件加速和嵌入式系统开发中。Verilog具有强大的建模和仿真能力,便于开发人员对数字系统进行建模、仿真和调试。 Verilog HDL支持结构化编程,可以用模化的方式设计电路。每个模可以包含输入、输出和内部信号,并定义模的行为和逻辑。通过将模相互连接,可以构建较大的数字系统。 Verilog HDL还具有丰富的语言元素,包括逻辑运算、控制结构、分支、循环和延迟元素,使开发人员能够以可读性强的方式描述电路的行为。 Verilog HDL在电子设计自动化工具中得到了广泛的应用。这些工具可以将Verilog代码综合为门级描述,然后使用此描述进行布局、布线和物理验证。此外,还可以使用仿真工具对Verilog代码进行验证,以确保电路的正确性。 总之,Verilog HDL是一种强大而灵活的硬件描述语言,用于设计和实现数字电路。它在数字系统设计和验证领域具有广泛的应用,并为开发人员提供了丰富的建模和仿真能力。 ### 回答3: Verilog HDL(硬件描述语言)是一种用于设计和描述数字逻辑电路的语言。它具有与硬件相关的特性和生产力增强功能,被广泛应用于数字逻辑设计和FPGA(可编程逻辑门阵列)工程中。 Verilog HDL 提供了一种有效的脚本化方法,使工程师能够描述电路的功能和结构。使用Verilog HDL,我们可以描述和设计包括寄存器、门、触发器、复杂的计算单元等在内的各种数字电路。 通过使用Verilog HDL,我们可以实现从简单的逻辑门到复杂的计算系统的设计。此外,它也支持分层设计,这意味着我们可以将电路划分为模并在更高的层次上组合和连接这些模。 通过建立逻辑关系和时序约束,Verilog HDL 可以生成完整的电路图,这可以帮助设计师进行系统级验证和功能验证。此外,Verilog HDL 也可以与其他验证工具(如模拟器、综合器和布线工具)集成,以确保设计的正确性和可靠性。 总的来说,Verilog HDL 是一种强大的硬件描述语言,用于描述和设计数字逻辑电路。它具有并行处理能力和层次化设计的优势,并与其他工具集成,以实现可靠而高效的数字电路设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值