天天看點

always assign的差別

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

    1. 被assign指派的信号定義為wire型,被[email protected](*)結構塊下的信号定義為reg型,值得注意的是,這裡的reg并不是一個真正的觸發器,隻有敏感清單為上升沿觸發的寫法才會綜合為觸發器,在仿真時才具有觸發器的特性。

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

    wire a;

      reg b;

   assign a = 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一樣(本人沒有去嘗試),但是在功能仿真時就差之千裡了。

繼續閱讀