systemverilog新增的always_comb,always_ff,和always_latch語句

Hoalen發表於2020-10-24

在Verilog中,設計組合邏輯和時序邏輯時,都要用到always:
always @(*) //組合邏輯
if(a > b)
out = 1;
else
out = 0;

always @(posedge clk) //時序邏輯 flip-flop觸發器
if(en)
out <= in;

僅從關鍵字上,看不出設計者想要一個什麼樣的電路。
 
SystemVerilog把always關鍵字細化了。對不同的設計要求有不同的關鍵字:
always_comb //組合邏輯
if(a > b)
out = 1;
else
out = 0;

comb是combinational的縮寫,always_comb表示設計者想要設計一個組合邏輯電路。同時不必再寫敏感訊號列表。我們在設計組合邏輯電路時,一件最重要的事就是不要一不小心搞一個latch出來。always_comb會告訴綜合工具,這裡需要的是一個組合邏輯電路。假如我們設計時,if語句或者case語句沒有寫完整,
always_comb //錯誤
if(a > b)
out = 1;

在綜合時,我們會收到警報:這裡應該是組合邏輯,你把他寫成了latch。使用always,則不會收到這樣的警告。
 
如果真的需要latch,SystemVerilog準備了專門的關鍵字:
 always_latch //latch
if(clk)
out = in;

always_latch是電平敏感的,它也不需要敏感訊號列表,它會告訴綜合工具,這裡我就是需要一個latch。
 
always_comb和always_latch極大的降低了unintentional latch的出現。這是對電路設計的一大提升。
 
對於flip-flop觸發器的設計,也有專門的關鍵字:
always_ff @(posedge clk) //flip-flop觸發器
if(en)
out <= in;

ff是flip_flop的縮寫,它需要敏感訊號列表,並且是邊沿觸發的,所以敏感訊號列表裡的訊號,都需要加關鍵字posedge或negedge。假如我們忘記了寫posedge或者negedge:
 always_ff @(clk) //錯誤
if(en)
out <= in;
綜合工具會發出警告:這裡應該是flip-flop,可你寫的不是flip-flop。使用always,則不會收到這樣的警告。
 
SystemVerilog把always細化成always_comb, always_ff, 和always_latch。使綜合工具可以自動檢查各種細節,降低了設計失誤的可能。

相關文章