在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。使綜合工具可以自動檢查各種細節,降低了設計失誤的可能。