2011-05-15 34 views
4

我有一個關於如何在verilog模塊中編寫always塊的簡單問題。
如果我在我的Verilog模塊以下輸入:Verilog總是禁止使用(*)符號

input  [31:0] PCplus4 ;  // Value of PC + 4 
input  [31:0] A;   // Value A, i.e. RSbus (Use Forwarded Value) 
input  [31:0] B;   // Value B, i.e. RTbus (Use Forwarded Value) 
input  [31:0] IMM;   // Extended Immediate Value 
input  [25:0] TARGET;   // Target Address for Jumps 
input   [3:0] BR;   // Branch Selector Input 

有什麼區別,如果我使用

always @ (*) 

,而不是

always @ (PCplus4 or A or B or IMM or TARGET or BR) 

這是否總是@(*)語法對所有版本的Verilog有效?

+1

值得一提的是,SystemVerilog引入了'always_comb'(和'always_ff' /'always_latch'),它們使工具鏈能夠對設計者的意圖做一些額外的檢查。 – Chiggs 2014-01-03 08:49:16

回答

10

always @(*)語法被添加到2001年的IEEE Verilog標準中。所有現代的Verilog工具(模擬器,綜合等)都支持這種語法。

下面是從LRM(一八零零年至2009年)報價:

事件控制的一個不完整的event_expression列表是在寄存器傳輸級(RTL)模擬 錯誤 公共源極。隱式 event_expression,@ *,是一個方便的 速記,通過增加由一個procedural_timing_ control_statement的 語句(可以是一個聲明 組)讀取到 event_expression所有網和 變量消除了這些 問題。

所以,你的兩行代碼可能是等價的(這取決於你的always塊的正文中的代碼)。但是,@*語法更易於維護。

3

always @(*)是該標準2001版修訂中對該語言的補充。它受到所有最新版本質量工具的支持。我不擔心在代碼中使用構造意圖以實現任意重用,但是,遇到不支持always @(*)的舊工具的可能性,尤其是涉及內部實用程序時。

0

這只是列出always塊依賴的所有電線的快捷方式。這些電線是「靈敏度清單」。使用它的一個優勢是綜合代碼不太可能關心你放在靈敏度列表中(posedge和negedge除外),因爲這些連線將被「物理地」連接在一起。模擬器可能依靠列表來選擇哪些事件應該導致塊執行。如果您更改了模塊並忘記更新列表,您的模擬可能會偏離實際的綜合行爲。

0

雖然兩者都相同,但使用[email protected](*)可以避免產生任何模擬合成不匹配。 讓我們假設你有如下的敏感列表15個信號:

[email protected](a1 or a2 or ... or a15) 

現在假設設計師已經錯過錯誤有在此列表中A14。綜合工具忽略了這個事實,並且假設該塊內的RHS上的所有信號都在靈敏度列表中,綜合代碼。模擬工具的行爲不同,因爲它取決於靈敏度列表。

0

對於第一個問題....如果在第二種情況下,我認爲這取決於那些是您感覺可以改變的唯一輸入,這會導致觸發輸出。理想情況下,使用*會更好,因爲它指示「用於輸入的任何更改」,而且它有助於避免冗長的代碼。

對於第二個問題.....它是在Verilog-2001中引入的,從那以後它被廣泛使用。