verilog語法之generate語句的基本認識

         <!--一個博主專欄付費入口結束-->
        <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

S=6時的RTL視圖
S=8時的RTL視圖
由上面我們可以看出模塊參數不同,選擇的電路就不相同。
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

當S=8時的RTL視圖

S=0時的RTL視圖

S=1時的RTL視圖
由上面3副圖其實就可以看出generate_if和generate_case功能其實是一樣的。但是比較常用的就是generat_for語句。希望大家能好好學一學,畢竟generate語句還是很有用的噢~
未完待續!!!!!!!

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
                </div>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章