一,爲什麼要學習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的temp
genvar i;
generate
for(i=0;i<4;i=i+1)
begin:gfor
assign temp[i]=data_in[2*i+1:2*i];
end
endgenerate
assign t0=temp[0];
assign t1=temp[1];
assign t2=temp[2];
assign t3=temp[3];
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_fro generate_inst(
.data_in(data_in),
.t0(t0),
.t1(t1),
.t2(t2),
.t3(t3)
);
endmodule
2,generate_if語句
generate_for用於複製模塊,二generate_if則是根據模塊的參數(必須是常量)作爲條件判斷,來產生滿足條件的電路。相當於判斷語句。
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;
endgenerate
endmodule
由上面我們可以看出模塊參數不同,選擇的電路就不相同。
3,generate_case語句
generate_case其實和generate_if一樣,都是根據參數(都必須爲常量)作爲判斷條件,來產生滿足條件的電路,不同於使用了case語法而已。
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;
endcase
endgenerate
endmodule