精华内容
下载资源
问答
  • GENERATE VERILOG

    2020-02-18 11:30:35
    引言 在设计中,很多情况下需要编写很多结构相同但是参数不同的赋值语句或者逻辑语句,...generate语句有generate-for,generate-ifgenerate-case三种语句。 生成实例可以是以下的一个或多个类型: (1)模块;(2...

    引言

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

    generate语句有generate-for,generate-if,generate-case三种语句。

    生成实例可以是以下的一个或多个类型:
    (1)模块;(2)用户定义原语;(3)门级语句;(4)连续赋值语句;(5)initial和always块。

    用法

    • 必须使用genvar声明一个正整数变量,用作for循环的判断变量;
    • for循环内部的的语句必须写在begin-end里面;
    • begin-and语句快需要一个命名。

    generate for

    eg
    利用generate_for来复制assign语句

    尤其是当参数化位宽时,input[NUM-1:0],能够实现assign举例不能完成的功能

    module	generate_for(
    	input	[7:0]          		 data_in			       ,
    	output	[1:0]				 t0					,
    	output	[1:0]				 t1					,
    	output	[1:0]				 t2					,
    	output	[1:0]				 t3										
    );
    
    wire		[1:0] 		temp [3:0];	//定义位宽为2,深度为4的temp
    
    genvar	i;								//利用genvar声明正整数变量
    generate for(i=0;i<4;i=i+1)		//复制模块
    	begin : gfor						//begi_end的名字
    		assign temp[i] = data_in[2*i+1:2*i]; 
    	end
    endgenerate
    
    assign t0 = temp[0];//assign temp[0] = data_in[1:0];
    assign t1 = temp[1];//assign temp[1] = data_in[3:2];
    assign t2 = temp[2];//assign temp[2] = data_in[5:4];
    assign t3 = temp[3];//assign temp[3] = data_in[7:6];
    
    endmodule
    
    
    `timescale  1ns/1ps
    
    module  tb;
    reg	[7:0]      		       data_in				;
    wire	[1:0]				 t0					;
    wire	[1:0]				 t1					;
    wire	[1:0]				 t2					;
    wire	[1:0]				 t3					;
    
    initial begin
    		data_in=8'd0;
    		#200;
    		data_in = 8'b1100_0011;
    		#200;
    		data_in = 8'b0011_1100;
    		#300;
    end
    
    generate_for generate_inst(
    	.data_in	(data_in	)			,
    	.t0		(t0		)			,
    	.t1		(t1		)			,
    	.t2		(t2		)			,
    	.t3		(t3		)
    );
    
    endmodule
    
    

    传递的方法:
    1、module_name #( parameter1, parameter2) inst_name( port_map);

    2、module_name #( .parameter_name(para_value), .parameter_name(para_value)) inst_name (port map);

    在这里插入图片描述

    展开全文
  • s (and others) thoughts on this and if we want to fix it in some way? <p>Mismatches in bit vector lengths is kicked down the road to Verilog. So, </p><pre><code>python a = Signal(31) b = ...
  • Verilog generate循环

    2020-05-13 16:29:51
    Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continous assignment,initial和always。在generate语句中可以引入if-else和case语句...

    一:generate

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

    1. generate语法有generate for, genreate if和generate case三种
    2. generate for语句必须有genvar关键字定义for的变量
    3. for 的内容必须加begin和end
    4. 必须给for语段起个名字

    (1)generate for例子:

    
    genvar S_i;
    generate
    for(S_i=0;S_i<C_COEF_NUM;S_i=S_i+1)   //parallel calculation  并行计算
    begin:test
    wire [C_PRIMPOLY_ORDER-1:0] S_para1;
    reg [C_DWIDTH-1:0] S_para2;
    localparam C_POLY = C_GEN_POLY [S_i*C_PRIMPOLY_ORDER+:C_PRIMPOLY_ORDER];//每次15bit,从低位到高位
    localparam C_UPP  = C_GEN_UPP  [S_i*C_UPP_WIDTH+:C_UPP_WIDTH]-1;//每次4bit,从低位到高位 C_UPP = 14
    
    always @(posedge I_clk)
       begin
          if(I_rst)
             S_para2 <= 'd0;
          else 
    	     S_para2 <= I_data;
       end
    
    assign S_para1 = S_data_sof ? 'd0 : S_reg[S_i];
    
    always @(posedge I_clk)
       begin
          if(S_data_v) begin	   
    		    S_reg[S_i] <= F_reg_update(S_para1,S_para2,C_POLY,C_UPP);
    	   end	
       end
    
    end
    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
    

    3.generate还可以进行多个assign赋值!

    module anytest_v(
    input clk,
    input[7:0] datain,
    output[7:0] dataout,
    output finish
    );
    wire[7:0] mem[31:0];
    wire[32*8-1:0] xxx;
    //reg[7:0] i;
    generate
    genvar i;
    for(i=0;i<=31;i=i+1)
    begin :wiertech
    assign mem[i]= 8'b0;
    end
    endgenerate
    endmodule
    ps
    

    : 对于a[8*i+:8]
    this is the so-called “Indexed vector part selects”
    在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的写法差不多

    module multiplier (a, b, product);
    parameter a_width = 8, b_width = 8;
    localparam product_width = a_width+b_width;
    input [a_width-1:0] a;
    input [b_width-1:0] b;
    output[product_width-1:0]product;
    generate
    if((a_width < 8) || (b_width < 8))
    CLA_multiplier #(a_width, b_width) u1 (a, b, product);
    else
    WALLACE_multiplier #(a_width, b_width) u1 (a, b, product);
    endgenerate
    endmodule
    
    展开全文
  • Veriloggenerate的用法

    2020-05-09 10:42:19
    Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continous assignment,initial和always。在generate语句中可以引入if-else和case语句...

    一:generate

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

    用法:

    1. generate语法有generate for, genreate if和generate case三种
    2. generate for语句必须有genvar关键字定义for的变量
    3. for 的内容必须加begin和end
    4. 必须给for语段起个名字

      例子:

      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


      3).generate还可以进行多个assign赋值!

      module anytest_v(

      input clk,

      input[7:0] datain,

      output[7:0] dataout,

      output finish

      );

      wire[7:0] mem[31:0];

      wire[328-1:0] xxx;

      //reg[7:0] i;

      generate

      genvar i;

      for(i=0;i<=31;i=i+1)

      begin :wiertech

      assign mem[i]= 8’b0;

      end

      endgenerate

      endmodule

      ps: 对于a[8
      i+:8]

      this is the so-called “Indexed vector part selects”

      在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的写法差不多

      module multiplier (a, b, product);

      parameter a_width = 8, b_width = 8;

      localparam product_width = a_width+b_width;

      input [a_width-1:0] a;

      input [b_width-1:0] b;

      output[product_width-1:0]product;

      generate

      if((a_width < 8) || (b_width < 8))

      CLA_multiplier #(a_width, b_width) u1 (a, b, product);

      else

      WALLACE_multiplier #(a_width, b_width) u1 (a, b, product);

      endgenerate

      endmodule
    展开全文
  • Veriloggenerate用法

    2012-03-18 11:35:00
    Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continous assignment,initial和always。在generate语句中可以引入if-else和case语句...
  • Veriloggenerate用法总结1、generate-for2、generate-if3、generate-case 生成语句可以动态的生成verilog代码,当对矢量中的多个位进行 重复操作 时,或者当进行多个模块的实例引用的重复操作时,或者根据参数的...


    生成语句可以动态的生成verilog代码,当对矢量中的多个位进行 重复操作 时,或者当进行多个模块的实例引用的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog代码的时候,使用生成语句能大大简化程序的编写过程。

    生成语句生成的实例范围,关键字generate-endgenerate用来指定该范围。生成实例可以是以下的一个或多个类型:
    (1)模块;
    (2)用户定义原语;
    (3)门级语句;
    (4)连续赋值语句;
    (5)initial和always块。
    generate语句有generate-for,generate-if,generate-case三种语句。

    • generate-for:用来构造循环结构,用来多次实例化某个模块。
    • generate-if:构造条件generate结构,用来在多个块之间最多选择一个代码块
    • generate-case:构造条件generate结构,用来在多个块之间最多选择一个代码块

    1、generate-for

    必须遵守
    (1) 必须有genvar关键字定义for语句的变量。
    (2)for语句的内容必须加begin和end(即使就一句)。
    (3)for语句必须有个名字。

    例如,HDLBits官网有一道Bcdadd4的题目:

    You are provided with a BCD (binary-coded decimal) one-digit adder named bcd_fadd that adds two BCD digits and carry-in, and produces a sum and carry-out.
    module bcd_fadd {
    input [3:0] a,
    input [3:0] b,
    input cin,
    output cout,
    output [3:0] sum );

    Instantiate 4 copies of bcd_fadd to create a 4-digit BCD ripple-carry adder. Your adder should add two 4-digit BCD numbers (packed into 16-bit vectors) and a carry-in to produce a 4-digit sum and carry out.

    代码如下:

    module top_module( 
        input [15:0] a, b,
        input cin,
        output cout,
        output [15:0] sum );
        generate
        genvar i;		//也可以定义到generate语句外面
        wire [3:0]cout_1;
        bcd_fadd bcd_fadd_U0(
            .a(a[3:0]),
            .b(b[3:0]),
            .cin(cin),
            .cout(cout_1[0]),
            .sum(sum[3:0])
        );
        for(i = 1;i < 4;i++) begin:Bcdadd4
            bcd_fadd bcd_fadd_U1(
                .a(a[i*4+3:i*4]),
          	    .b(b[i*4+3:i*4]),
                .cin(cout_1[i-1]),
                .cout(cout_1[i]),
               .sum(sum[i*4+3:i*4]) 
            );
            end
        endgenerate
        assign cout = cout_1[3];
    endmodule
    

    上述for循环中就例化了99次,虽然代码中只有一个例化名,但实际编译过程中软件会对例化的99次起对应的例化名。

    注意事项:generate块最好命名

    Verilog中generate循环中的generate块可以命名也可以不命名。如果已命名,则会创建一个generate块实例数组。如果未命名,则有些仿真工具会出现警告,因此,最好始终对它们进行命名。
    generate for循环和普通的for循环相比有什么优点呢?通常,generate for循环和普通 for循环之间的主要区别在于generate for循环正在为每次迭代生成一个实例。

    2、generate-if

    条件if-generate不关心是否命名,并且可以不具有begin / end。generate可以代替if…else,并且是在不需要时钟的情况下,可以选择实例化不同的模块。注意,generate-if是可以不含有genvar的。

    3、generate-case

    与if-generate类似,case-generate也可用于从几个块中有条件地选择一个代码块。它的用法类似于基本case语句,并且if-generate中的所有规则也适用于case-generate块。

    展开全文
  • veriloggenerate的用法

    千次阅读 2015-07-27 16:49:08
    一:generate Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 用法: 1. generat
  • 1always块中if的条件内的量可以是变量,也可以是常量parameter (1)是输入变量时,那么综合出来会有一个选择器 module QQ(a,b,c,clk); input a,b,clk; parameter d=1; output reg c; always@(posedge clk) if(a==1) ...
  • Verilog语法:条件编译—Generate

    千次阅读 2019-06-03 11:17:16
    2. generate if 3. generate case 条件编译在图像处理领域非常有用,特别是图像处理的算法处理方面。由于资源限制,处理尺寸不可能像软件那样到运行时调整,但是有时候需要对不同尺寸进行测试,或者算法需要两个...
  • 一:generate Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 用法: 1. gene...
  • Verilog中生成语句(generate)的用法

    万次阅读 2016-12-18 23:36:50
    一:generate Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 用法: 1. generat
  • http://stackoverflow.com/questions/22200666/problems-with-wires-declared-inside-verilog-generate-blocks ...Within a generate block, I have multiple if statements. When I declare a wire in the firs
  • generate 语句2.1 generate 语法2.2 generate-for2.3 generate-case3. 比较 1. for语句 1.1 always-for   从初始值开始,如果表达式为真就执行。写一个5位的左移器,代码有: always @(posedge clk or negedge ...
  • verilog2001中有generate这个语法,近日有用到,简单归纳如下: 语法: 1。genvar后面的for,变量必须是genvar变量;generate+if,不如`ifdef `else `endif; 2。for里必须有begin,哪怕只有一句; 3。begin必须...
  • 下面对Verilog-2001新增特性进行详细说明,部分说明用实例进行解析。 l generate语句 Verilog- 2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多...在generate语句中可以引入if-el...
  • 脉冲计数器, 实验一:进行模块化复用 pulse_counter为基础脉冲计数器,为被复用模块 `timescale 1ns/1ps module pulse_counter( input clk, ... output reg[3:0] pulse_cnt, ... if(!rst_n) pulse_cnt=0; else i
  • generate

    2016-06-13 08:50:00
    一:generate Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 用法: 1. gen...
  • verilog语法注意部分

    2017-11-30 13:15:00
    l generate语句 Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 为此,Verilog-20...
  • Verilog-2001新增特性

    2016-03-10 11:03:00
    l generate语句 Verilog-2001添加了generate循环,允许产生 module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 为此,Verilog-2...
  • 书上是说有三种生成语句,for,if-else,case。verilog里面本身就有for,if-else,case.这三种语句,这是否重复了呢?...》优质解答generate相关的有generate for, generate ifgenerate case, gen...
  • verilog语法注意部分(转)

    千次阅读 2016-01-12 16:00:30
    generate语句Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。为此,Verilog-2001还增加了以
  • l generate语句 Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 为此,Verilo...
  • 为什么要把这一节单独拎出来,因为个人原因,平时觉得用的Verilog生成语句,generate for居多,generate if以及generate case没用过,因此,也没在意过。
  • generate_ase_environment.py adds the generated verilog/system verilog files to a list that is appended to the vlog_files.list. Since vhdl files can be generated in the sub-libraries, despite the ...
  • verilog 2001中的一些新语法

    千次阅读 2018-01-02 10:54:03
    比较有用的:1,generate语句,但需注意,generate-for中变量范围是已知的确定值, generate-case,generate-if语句中变量都必须是固定的, generate必须跟endgenerate 中间begin加块名。 2,算术左移右移 ...
  • I thought using only formal verification part of the nMigen to generate that Verilog file. <p>AND Gate in VHDL <pre><code>vhdl library ieee; use ieee.std_logic_1164.all; entity and_gate is port ( ...

空空如也

空空如也

1 2 3 4
收藏数 80
精华内容 32
关键字:

generateifverilog