2014-09-20 147 views
1

我在這裏給出2個Verilog模塊,它們在模擬過程中表現相同。但我不明白爲什麼要在這些模塊中使用assign/deassign,即這兩個代碼有什麼區別?Verilog中需要分配/取消分配?

// Code 1 - Without assign-deassign 
module dff (q,qbar,clk,reset,d) 
    input clk, reset, d; 
    output reg q, qbar; 

    always @ (posedge reset, negedge clk) 
    begin 
    if(reset) 
    begin 
     q=1; 
     qbar=0; 
    end 
    else 
    begin 
     q=d; 
     qbar=~d; 
    end 
    end 
endmodule 

// Code 2 - With assign-deassign 
module dff (q,qbar,clk,reset,d) 
    input clk, reset, d; 
    output reg q, qbar; 

    always @ (negedge clk) 
    begin 
    q=d; 
    qbar=~d; 
    end 

    always @ (reset) 
    begin 
    if(reset) 
    begin 
     assign q=1; 
     assign qbar=0; 
    end 
    else 
    begin 
     deassign q; 
     deassign qbar; 
    end 
    end 
endmodule 
+0

IEEE Std 1800-2012對使用'deassign'有何評論? – toolic 2014-09-20 13:53:33

+0

因爲只有我很困惑,使用取消分配的效果可以被刪除。但我不知道它們究竟在哪裏可以使用? – 2014-09-20 14:29:13

回答

2

您的示例中過程分配/取消分配語句的最初目的是在兩個不同的過程中將同步邏輯與異步邏輯分開。這對於仿真更有效,因爲同步模塊不必在每個時鐘週期檢查一次復位信號。建模鎖存器對於仿真也更高效,因爲每次數據更改時都不必檢查使能信號,只有在鎖存器打開時才能檢查使能信號。

這種結構可以通過早期合成工具合成,但不幸的是,合成供應商決定不支持它,因此沒有人再使用這些程序結構。

+0

是的,但後來假設分配deassign,如果兩個事件同時發生,那麼會不會給多個驅動程序錯誤?在第一代碼中,情況並非如此。 – 2014-09-21 04:39:39

+0

程序控制**分配**優先於正常的程序分配。 – 2014-09-21 14:20:52

+0

好的,非常感謝@ dave_59的答案。 – 2014-09-21 14:33:32

1

而不assign該語句是一個@邊緣塊內,並在該邊緣被評估assign描述了組合連續邏輯,並且根據定義對其輸入敏感。

Code 1q將改變只有當clkreset變化,而不是d變化時。

Code 2具有當reset被斷言,此塊將繼續推動q=1效果(與任何其他驅動程序衝突的),但是當復位被否定,它就會停止駕駛q

這實際上可能是更爲不尋常的用途,可能是在@edge塊內分配。

更常規使用會像

assign out = (enable) ? data : 1'bz; 

這將改變每當啓用或數據的變化。

+0

另外,如果我沒記錯的話,程序性的'assign/deassign'結構會被標記爲廢棄(至少在SystemVerilog中),所以最好不要使用它們。 – 2014-09-20 06:40:51

+0

是的我知道連續賦值語句,我只是想知道在代碼中使用過程連續賦值 - 賦值是什麼? &他們可以在哪裏使用? – 2014-09-20 07:05:38