天天看點

Verilog初級教程(11)Verilog中的initial塊

文章目錄

    • 前言
    • 正文
      • 文法格式
      • initial塊是用來幹什麼的?
      • initial塊何時開始又何時結束?
      • 一個子產品中允許有多少個initial塊?

仿真中通常會依次執行一組Verilog語句。這些語句被放置在一個程式塊中。在Verilog中主要有兩種類型的程式塊–initial塊和always塊。

initial塊可以了解為一個初始化塊,在initial的起始位置的語句在0時刻即開始執行,之後如果遇到延時,則延時之後執行接下來的語句。

其文法如下:

initial
	[single statement]

initial begin
	[multiple statements]
end
           

如果initial中有多條語句,則置于begin …end之間。

初始塊是不可綜合的,是以不能将其轉化為帶有數字元素的硬體原理圖。是以初始塊除了在仿真中使用外,并沒有太大的作用。這些塊主要用于初始化變量和用特定的值驅動設計端口。

注意:在晶片邏輯設計中,initial塊确實隻能用于行為仿真,但是在FPGA設計中,簡單的使用initial進行變量的初始化是可以綜合的。

例如:

reg a, b, c;

initial begin
a = 0;
b = 0;
c = 0;
end
           

但我們更多地在變量定義時刻就進行了初始化,這是推薦的用法。

reg a = 0;
           

或者使用複位信号進行初始化,但這會增加綜合布線的負擔,可以有意識的減少,除非不得不。

reg a;

always@(posedge i_clk) begin
	if(i_rst) begin
		a <= 0;
	end

end
           

在仿真開始時,在時間0機關開始一個初始塊。在整個仿真的過程中,這個代碼塊隻執行一次。一旦initial塊中的所有語句被執行,initial塊的執行就結束了。

如果initial塊中就一條語句,那麼開始也是結束,語句執行完就結束這個initial塊,如:

Verilog初級教程(11)Verilog中的initial塊

下圖所示的代碼有一條額外的語句,它給信号b配置設定了一些值,但是這隻發生在執行前一條語句的10個時間機關之後。這意味着a首先被配置設定給給定的值,然後在10個時間機關之後,b被配置設定給0。

Verilog初級教程(11)Verilog中的initial塊

可以有多個(任意多)initial塊。

多個initial塊是同時執行的,都是從時刻0開始執行。

下圖所示的代碼有三個初始塊,所有的初始塊都在同一時間啟動并并行運作。然而,根據每個初始塊中的語句和延遲,完成該塊所需的時間可能會有所不同。

Verilog初級教程(11)Verilog中的initial塊

$finish是一個Verilog系統任務,它告訴仿真器終止目前的仿真。

initial begin
	#30 $finish;
end
           
  • 個人微信公衆号: FPGA LAB