各種好用的 SystemVerilog 語法 (02) - always

Share on:

本文內容採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.

Verilog 中我們會使用 always 來建立一個 block。這個語法其實沒有太大的問題,而 SystemVerilog 提供了數個更好的語法。

SystemVerilog 中引入了 always_comb always_ff 用來提供替換原本的 always,分別用在 combinational circuit 以及 register 使用。使用這兩個語法的話,如果 tool 支援的話,可以在不小心把 register 跟 combinational circuit 寫錯的時候,發出一些警告。tool 不支援的話也能多少當作註解來用。

因為沒什麼傷害性,基本上這個語法就是能用就用。

always_comb

在最早的 Verilog 裡面,combinational circuit 需要用 @ 語法加上 sensitive list 才能正確運作。然而隨語法的更新,根本沒有這個需求了,所以在 Verilog 中 always 後面一律是 @(*)

1always@(*) begin
2   x = y;
3end

這就導致了 @(*) 看起來很多餘,所以新版語法 always_comb 就直接去掉了,如下:

1always_comb begin
2   x = y;
3end

另外,因為不用加上 @(*),所以想把他當 assign 來用也是可以的。

1assign x = y;
2always_comb x = y;

always_ff

這個語法相比 always_comb 沒什麼好說,因為就是直接替換掉本來的 always 就好。

1always_ff@(posedge clk) begin
2   x <= y;
3end

最後,雖然也有 always_latch 這個語法用在 latch 的,但是在大部分同步電路中,這個不太常用,所以沒有介紹。