1. 程式人生 > >轉載:systemverilog新增的always_comb,always_ff,和always_latch語句

轉載:systemverilog新增的always_comb,always_ff,和always_latch語句

轉自:https://www.cnblogs.com/zeushuang/p/7966679.html

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