1. 程式人生 > >verilog中assign和[email protected](*)兩者描述組合邏輯時的差別

verilog中assign和[email protected](*)兩者描述組合邏輯時的差別

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

    1.被assign賦值的訊號定義為wire型,被[email protected](*)結構塊下的訊號定義為reg型,值得注意的是,這裡的reg並不是一個真正的觸發器,只有敏感列表為上升沿觸發的寫法才會綜合為觸發器,在模擬時才具有觸發器的特性。

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

    wirea;

      regb;

   assigna = 1'b0;

   [email protected](*)

       b= 1'b0;

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

    這種寫法由於1'b0一直沒有變化,所以b的訊號狀態一直沒有改變,由於b是組合邏輯輸出,所以復位時沒有明確的值(不定態),而又因為[email protected]

(*)塊內沒有敏感訊號變化,因此b的訊號狀態一直保持為不定態。事實上該語句的綜合結果有可能跟assign一樣(本人沒有去嘗試),但是在功能模擬時就差之千里了。