文章目錄
-
- 前言
- 正文
- 文法格式
- 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塊,如:
下圖所示的代碼有一條額外的語句,它給信号b配置設定了一些值,但是這隻發生在執行前一條語句的10個時間機關之後。這意味着a首先被配置設定給給定的值,然後在10個時間機關之後,b被配置設定給0。
可以有多個(任意多)initial塊。
多個initial塊是同時執行的,都是從時刻0開始執行。
下圖所示的代碼有三個初始塊,所有的初始塊都在同一時間啟動并并行運作。然而,根據每個初始塊中的語句和延遲,完成該塊所需的時間可能會有所不同。
$finish是一個Verilog系統任務,它告訴仿真器終止目前的仿真。
initial begin
#30 $finish;
end
- 個人微信公衆号: FPGA LAB