Verilog中generate的用法

(一)generate语法

        generate 在设计中,很多情况下需要编写很多结构相同但是参数不同的赋值语句或者逻辑语句,如果在参数量很大的的情况下,原本的列举就会显得心有余而力不足。c语言中常用for语句来解决此类问题,verilog则为我们提供了generate语句。

        Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continous assignment,initial和always。在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。

        generate语法有generate for, genreate if和generate case三种 用法介绍如下:

(1)generate for

        (1)generate for语句必须有genvar关键字定义for的变量,generate_for用于复制模块;

        (2)for 的内容必须加begin和end

        (3) 必须给for语段起个名字

(2)generate_if

        是根据模块的参数(必须是常量)作为条件判断,来产生满足条件的电路。相当于判断语句。

(3)generate case

        generate case分支语句与generate if-条件语句类似,只不过将原来的分支语句换做了case*语句

  1. generate for例子:
    `generate
    genvar i;                             //generate 8 samll fifo for in_data[i] 8X72
        for(i=0; i<NUM_QUEUES; i=i+1) begin: in_arb_queues             //NUM_QUEUES = 8
            small_fifo
                #( .WIDTH(DATA_WIDTH+CTRL_WIDTH), .MAX_DEPTH_BITS(2))
            in_arb_fifo
                                        (// Outputs
                .dout ({fifo_out_ctrl[i], fifo_out_data[i]}),
                .full (),
                .nearly_full (nearly_full[i]),
                .prog_full (),
                .empty (empty[i]),
                                         // Inputs .din ({in_ctrl[i], in_data[i]}),
                .wr_en (in_wr[i]),
                .rd_en (rd_en[i]),
                .reset (reset),
                .clk (clk));
            end                          // block: in_arb_queues
    endgenerate`
    2.generate if例子:
    ​​​​​​​generate 
        if (REG_WIDTH == WRITE_WIDTH) 
            begin : new_data_a_generation 
                assign new_data_a = merge_update ? merge_wr_data : held_wr_data_a; 
            end 
        else 
            begin 
                assign new_data_a = merge_update ? {
        {(REG_WIDTH - WRITE_WIDTH - 1){merge_wr_data_sign}}, merge_wr_data} : {
        {(REG_WIDTH - WRITE_WIDTH){held_wr_data_sign_a}}, held_wr_data_a}; 
            end 
    endgenerate

    (二)generate还可以进行多个assign赋值!

            例如:对于a[8*i+:8],这就是所谓的“索引矢量部分选择”。

            在Verilog-1995中,可以选择向量的任一位输出,也可以选择向量的连续几位输出,不过此时连续几位的始末数值的index需要是常量。而在Verilog-2001中,可以用变量作为index,进行part select。

    [base_expr +: width_expr] //positive offset
    
    [base_expr -: width_expr] //negative offset

            其中base_expr可以是变量,而width_expr必须是常量。+:表示由base_expr向上增长width_expr位,-:表示由base_expr向上递减width_expr位。例如:

    reg [63:0] word;
    
    reg [3:0] byte_num; //a value from 0 to 7
    
    wire [7:0] byteN = word[byte_num*8 +: 8];

            如果byte_num的值为4,则word[39:32]赋值给byteN

    (三)参数传递

            类似VHDL的Generic语句,Verilog也可以在例化时传递参数。传递的参数是子模块中定义的parameter。

    传递的方法:

    1、module_name #( parameter1, parameter2) inst_name( port_map);
    
    2、module_name #( .parameter_name(para_value), .parameter_name(para_value)) inst_name (port map);

            用#方法和port map的写法差不多

相关推荐

  1. Veriloggenerate

    2023-12-09 18:14:05       57 阅读
  2. Verilog使用generate…for语句简化代码

    2023-12-09 18:14:05       29 阅读
  3. Python常见

    2023-12-09 18:14:05       65 阅读
  4. C++auto、decltype

    2023-12-09 18:14:05       50 阅读
  5. MATLABcell函数

    2023-12-09 18:14:05       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 18:14:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 18:14:05       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 18:14:05       82 阅读
  4. Python语言-面向对象

    2023-12-09 18:14:05       91 阅读

热门阅读

  1. 浅谈Elasticsearch备份和恢复

    2023-12-09 18:14:05       49 阅读
  2. 计算机网络知识点合集【王道计算机考研】

    2023-12-09 18:14:05       56 阅读
  3. 层三交换机解析(Layer 3 Switch)层3交换机

    2023-12-09 18:14:05       57 阅读
  4. 【npm】npm中classnames包是干嘛的

    2023-12-09 18:14:05       61 阅读
  5. CVE-2002-20001处理方法

    2023-12-09 18:14:05       56 阅读
  6. Oracle数组循环表存在则删除

    2023-12-09 18:14:05       66 阅读
  7. Linux常用命令

    2023-12-09 18:14:05       51 阅读
  8. MySQL:drop、delete与truncate区别

    2023-12-09 18:14:05       53 阅读