-
GENERATE VERILOG
2020-02-18 11:30:35引言 在设计中,很多情况下需要编写很多结构相同但是参数不同的赋值语句或者逻辑语句,...generate语句有generate-for,generate-if,generate-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);
-
Should Migen generate explicit Verilog for mismatched bit vector lengths (rather then relying on ...
2020-11-20 15:48:17s (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:51Verilog-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语句,根据条件不同产生不同的实例化。
用法:- generate语法有generate for, genreate if和generate case三种
- generate for语句必须有genvar关键字定义for的变量
- for 的内容必须加begin和end
- 必须给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
-
Verilog中generate的用法
2020-05-09 10:42:19Verilog-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语句,根据条件不同产生不同的实例化。
用法:- generate语法有generate for, genreate if和generate case三种
- generate for语句必须有genvar关键字定义for的变量
- for 的内容必须加begin和end
- 必须给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[8i+: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
- generate语法有generate for, genreate if和generate case三种
-
Verilog中generate用法
2012-03-18 11:35:00Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continous assignment,initial和always。在generate语句中可以引入if-else和case语句... -
Verilog中generate用法总结
2021-03-15 13:55:13Verilog中generate用法总结1、generate-for2、generate-if3、generate-case 生成语句可以动态的生成verilog代码,当对矢量中的多个位进行 重复操作 时,或者当进行多个模块的实例引用的重复操作时,或者根据参数的...Verilog中generate用法总结
生成语句可以动态的生成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块。
-
verilog中generate的用法
2015-07-27 16:49:08一:generate Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 用法: 1. generat -
verilog generate 生成语句
2020-04-09 09:06:091always块中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:162. generate if 3. generate case 条件编译在图像处理领域非常有用,特别是图像处理的算法处理方面。由于资源限制,处理尺寸不可能像软件那样到运行时调整,但是有时候需要对不同尺寸进行测试,或者算法需要两个... -
verilog中generate用法及参数传递
2011-07-14 17:20:00一: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 -
Problems with wires declared inside verilog generate blocks
2015-01-06 19:10:28http://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 -
verilog语法 — for/generate语句的用法
2021-03-30 21:53:38generate 语句2.1 generate 语法2.2 generate-for2.3 generate-case3. 比较 1. for语句 1.1 always-for 从初始值开始,如果表达式为真就执行。写一个5位的左移器,代码有: always @(posedge clk or negedge ... -
(原创)verilog2001中generate的精妙用法
2008-12-24 22:50:00verilog2001中有generate这个语法,近日有用到,简单归纳如下: 语法: 1。genvar后面的for,变量必须是genvar变量;generate+if,不如`ifdef `else `endif; 2。for里必须有begin,哪怕只有一句; 3。begin必须... -
verilog-1995 和verilog-2001的区别
2019-12-16 08:50:21下面对Verilog-2001新增特性进行详细说明,部分说明用实例进行解析。 l generate语句 Verilog- 2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多...在generate语句中可以引入if-el... -
verilog程序——模块化,parameter和localparam的使用,Generate使用
2021-03-02 17:07:44脉冲计数器, 实验一:进行模块化复用 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:00l generate语句 Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 为此,Verilog-20... -
Verilog-2001新增特性
2016-03-10 11:03:00l generate语句 Verilog-2001添加了generate循环,允许产生 module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 为此,Verilog-2... -
verilog 生成块_Verilog中的生成块应该怎样理解?
2020-12-20 23:15:42书上是说有三种生成语句,for,if-else,case。verilog里面本身就有for,if-else,case.这三种语句,这是否重复了呢?...》优质解答generate相关的有generate for, generate if, generate case, gen... -
verilog语法注意部分(转)
2016-01-12 16:00:30generate语句Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。为此,Verilog-2001还增加了以 -
verilog-2001语法注意部分(转)
2019-09-03 09:43:58l generate语句 Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个...在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。 为此,Verilo... -
FPGA之道(74)Verilog生成语句
2020-03-24 11:57:44为什么要把这一节单独拎出来,因为个人原因,平时觉得用的Verilog生成语句,generate for居多,generate if以及generate case没用过,因此,也没在意过。 -
ASE fails to simulate IP cores with sub-libraries that contain non-verilog/system-verilog files
2020-12-09 15:47:02generate_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,算术左移右移 ... -
Using Python to Formal Verify Verilog and VHDL Files
2020-12-25 22:16:50I 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 ( ...