【FPGA——基礎篇】verilog中assign和always@(*)兩者描述組合邏輯時的差別

verilog描述組合邏輯一般常用的有兩種:assign賦值語句和always@(*)語句。兩者之間的差別有:

    1.被assign賦值的信號定義爲wire型,被always@(*)結構塊下的信號定義爲reg型,值得注意的是,這裏的reg並不是一個真正的觸發器,只有敏感列表爲上升沿觸發的寫法纔會綜合爲觸發器,在仿真時才具有觸發器的特性。

    2.另外一個區別則是更細微的差別:舉個例子,

    wirea;

      regb;

   assigna = 1'b0;

   always@(*)

       b= 1'b0;

    在這種情況下,做仿真時a將會正常爲0,但是b卻是不定態。這是爲什麼?verilog規定,always@(*)中的*是指該always塊內的所有輸入信號的變化爲敏感列表,也就是仿真時只有當always@(*)塊內的輸入信號產生變化,該塊內描述的信號纔會產生變化,而像always@(*)b = 1'b0;

    這種寫法由於1'b0一直沒有變化,所以b的信號狀態一直沒有改變,由於b是組合邏輯輸出,所以復位時沒有明確的值(不定態),而又因爲always@(*)塊內沒有敏感信號變化,因此b的信號狀態一直保持爲不定態。事實上該語句的綜合結果有可能跟assign一樣(本人沒有去嘗試),但是在功能仿真時就差之千里了。

3.always@(*)描述組合邏輯時,begin和end之間是串行,一條一條語句執行;

而用assign則是並行,相當於描述的是連線。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章