<!--一個博主專欄付費入口結束-->
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<!-- flowchart 箭頭圖標 勿刪 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<p>最近在至芯科技的書上看到的,覺得還行吧,給大家分享一下。<br>
一、爲什麼學習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語句
- 1
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
`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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
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;
endgenerate
endmodule
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
由上面我們可以看出模塊參數不同,選擇的電路就不相同。
3、generate_case語句
generate_case其實跟generate_if一樣,都是根據參數(都必須爲常量)作爲判斷條件,來產生滿足條件的電路,不同於使用了case語法而已。
例、3
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
由上面3副圖其實就可以看出generate_if和generate_case功能其實是一樣的。但是比較常用的就是generat_for語句。希望大家能好好學一學,畢竟generate語句還是很有用的噢~
未完待續!!!!!!!
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
</div>