天天看點

Verilog:generate、for、always 語句用法與電路結構對比

文章目錄

    • 1、always-for
    • 2、 for-always
    • 3、generate_for_always
    • 3.1、generate-always-for
    • 4、for-assign
    • 5、generate-for-assign
    • 6、[email protected](*)-for
    • 7、[email protected](*)
    • 8、[email protected](*)
    • 仿真結果

最近寫Verilog時,對于generate-for 和 for循環相關不是很清楚,是以寫了一些代碼對比一下不同寫法的結果,記錄一下,如有錯誤請多多指正,不喜輕噴。

1、always-for

代碼:

reg	[data_width-1:0]	in1_reg	[0:depth-1];
	integer i;
	[email protected](posedge clk or negedge rst_n)
	begin
		if(!rst_n)
		begin
			for(i=0;i<depth;i=i+1)
				in1_reg[i] <= 0;
		end
		else
		begin
			for(i=0;i<depth;i=i+1)
				in1_reg[i] <= in1+i;
		end
	end
           

仿真結果說明:in1_reg 在第一個有效時鐘沿後,資料均變為目标值

ANALYSIS得到的結構圖

Verilog:generate、for、always 語句用法與電路結構對比

綜合後的電路圖:

Verilog:generate、for、always 語句用法與電路結構對比

2、 for-always

代碼:

//integer j;							// Error:j is not a genvar;j is not a constant
	genvar j;
	reg [data_width-1:0]	in2_reg	[0:depth-1];
	for(j=0;j<depth;j=j+1)
	begin:in2_loop
		[email protected](posedge clk or negedge rst_n)
		begin
			if(!rst_n)
				in2_reg[j] <= 0;
			else
				in2_reg[j] <= in2+j;
		end
	end
           

仿真結果說明:in2_reg 在第一個有效時鐘沿後,資料均變為目标值

ANALYSIS得到的結構圖

Verilog:generate、for、always 語句用法與電路結構對比

綜合後的電路圖:

Verilog:generate、for、always 語句用法與電路結構對比

3、generate_for_always

代碼:

reg [data_width-1:0]	in3_reg	[0:depth-1];
	genvar k;
	generate
		for(k=0;k<depth;k=k+1)
		begin:generate_case
			[email protected](posedge clk or negedge rst_n)
			begin
				if(!rst_n)
					in3_reg[k] <= 0;
				else
					in3_reg[k] <= in3+k;
			end
		end
	endgenerate
           

仿真結果說明:in3_reg 在第一個有效時鐘沿後,資料均變為目标值

ANALYSIS得到的結構圖

Verilog:generate、for、always 語句用法與電路結構對比

綜合後的電路圖:

Verilog:generate、for、always 語句用法與電路結構對比

3.1、generate-always-for

代碼:

reg [data_width-1:0]	in31_reg	[0:depth-1];
	//genvar k1;		// Error:procedural assignment to a non-register k1 is not permitted, left-hand side should be reg/integer/time/genvar 
	integer k1;
	generate
		[email protected](posedge clk or negedge rst_n)
		begin
			if(!rst_n)
			begin
				for(k1=0;k1<depth;k1=k1+1)
				begin:for_rst
					in31_reg[k1] <= 0;
				end
			end
			else
			begin
				for(k1=0;k1<depth;k1=k1+1)
				begin:generate_always_for
					in31_reg[k1] <= in31+k1;
				end
			end
				
		end
	endgenerate
           

仿真結果說明:in31_reg 在第一個有效時鐘沿後,資料均變為目标值

ANALYSIS得到的結構圖

Verilog:generate、for、always 語句用法與電路結構對比

綜合後的電路圖:

Verilog:generate、for、always 語句用法與電路結構對比

4、for-assign

代碼:

wire[data_width-1:0]	in4_wire	[0:depth-1];
	//integer n;			// Error: n is not a genvar;n is not a constant
	genvar n;
	for(n=0;n<depth;n=n+1)
	begin:for_assign
		assign in4_wire[n] = in4+n;
	end
           

仿真結果說明:wire型,仿真開始即有值,随輸入信号變化而變化

ANALYSIS得到的結構圖

Verilog:generate、for、always 語句用法與電路結構對比

綜合後的電路圖:

Verilog:generate、for、always 語句用法與電路結構對比

5、generate-for-assign

代碼:

wire[data_width-1:0]	in5_wire	[0:depth-1];
	genvar m;
	generate
		for(m=0;m<depth;m=m+1)
		begin:generate_for_assign
			assign in5_wire[m] = in5+m;
		end
	endgenerate
           

仿真結果說明:wire型,仿真開始即有值,随輸入信号變化而變化

ANALYSIS得到的結構圖

Verilog:generate、for、always 語句用法與電路結構對比

綜合後的電路圖:

Verilog:generate、for、always 語句用法與電路結構對比

6、[email protected](*)-for

代碼:

reg [data_width-1:0]	in6_reg	[0:depth-1];
	[email protected](*)
	begin
		for(i=0;i<depth;i=i+1)
			in6_reg[i] = in6+i;
	end
           

仿真結果說明:wire型,仿真開始即有值,随輸入信号變化而變化

ANALYSIS得到的結構圖

Verilog:generate、for、always 語句用法與電路結構對比

綜合後的電路圖:

Verilog:generate、for、always 語句用法與電路結構對比

7、[email protected](*)

可以用 for-assign 替換

8、[email protected](*)

可以用generate-assign 替換

仿真結果

Verilog:generate、for、always 語句用法與電路結構對比

可以看到,時序信号in1_reg,in2_reg,in3_reg,in31_reg 都在第一個有效時鐘邊沿後變為目标值;組合邏輯信号in4_wire, in5_wire, in6_reg 在電路開始仿真時即被指派進行運算,輸入資料變化後随之發生變化

2、根據電路結構,generate-for 和 for 循環對于always 和 assig 語句的作用相同,但書寫方法不同

generate-for / for循環在alway塊外面時,循環變量要定義為 genvar 型

for 循環在always 塊内時,循環周遊要定義為 integer 類型

3、結論:

若要在循環/條件/分支語句中調用子產品,須使用 generate-for語句,注意要用genvar 定義循環變量,并在for循環的 begin: 後跟上 循環名稱;

其他情況可根據自身情況而定

generate-for和for循環使用說明可見 Verilog:generate-for 語句(用法,及與for語句差別)

文中的代碼等可見https://download.csdn.net/download/weixin_44544687/13117406

繼續閱讀