最近在至芯科技的书上看到的,觉得还行吧,给大家分享一下。
一、为什么学习generate?在设计中,很多情况下需要编写很多结构相同但是参数不同的赋值语句或者逻辑语句,如果在参数量很大的的情况下,原本的列举就会显得心有余而力不足。c语言中常用for语句来解决此类问题,verilog则为我们提供了generate语句。二、generate的基本概念及语法generate语句的最主要功能就是对module、reg、assign、always、task等语句或者模块进行复制。generate语句有generate_for、generate_if、generate_case三种语句。下面开来看看这三种语句有什么不同?1、generate_for语句注:(1)、必须使用genvar申明一个正整数变量,用作for循环的判断。(genvar是generate语句中的一种变量类型,用在generate_for中声明正整数变量。)(2)、需要复制的语句必须写到begin_end语句里面。就算只有一句!!!!!!(3)、begin_end需要有一个类似于模块名的名字。例1、利用generate_for来复制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的tempgenvar 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]; endendgenerateassign 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/1psmodule 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;endgenerate_for generate_inst( .data_in (data_in ) , .t0 (t0 ) , .t1 (t1 ) , .t2 (t2 ) , .t3 (t3 ));endmodule
2、generate_if语句
generate_for用于复制模块,而generate_if则是根据模块的参数(必须是常量)作为条件判断,来产生满足条件的电路。相当于判断语句。例2、
module generate_if( input t0 , input t1 , input t2 , output d );localparam S = 6; //定义模块所需参数,用于判断产生电路generate if(S < 7) assign d = t0 | t1 | t2; else assign d = t0 & t1 & t2;endgenerateendmodule
module generate_case( input t0 , input t1 , input t2 , output d );localparam S = 8; //定义模块所需参数,用于判断产生电路generate case(S) 0: assign d = t0 | t1 | t2; 1: assign d = t0 & t1 & t2; default: assign d = t0 & t1 | t2; endcaseendgenerateendmodule