我注意到在 Verilog 中使用 if-else 條件時有分配優先級。例如在下面的代碼中:
if(counter < 6)
z <= 1;
else if(counter < 12)
z <= 2;
else
z <= 3;
我注意到,在計數器小于 6 之前,為 的值z分配值 1 ( z <= 1),并且一旦計數器的值超過 6 且小于 12,z則分配值 2 ( z <= 2)。
如果在下面的代碼中條件句中使用了不同的變數怎么辦?
if(wire1_is_enabled)
z <= 1;
else if(wire2_is_enabled)
z <= 0;
當兩個條件都為真時會發生什么?賦值運算子在這里的行為是什么?我相信這是糟糕的編程習慣。
uj5u.com熱心網友回復:
是的,嵌套if-else分支陳述句自然會按執行順序假定優先級。考慮使用case陳述句而不是if更易讀的深度嵌套陳述句。
這種編碼風格沒有任何問題,除非你有如下代碼:
if(counter < 6)
z <= 1;
else if(counter < 2)
z <= 2; // unreachable
else
z <= 3;
然后該陳述句z <= 2;變得不可達,因為當第一個條件為假時,第二個條件永遠不會為真。幸運的是,有許多工具可以為您標記此問題。
雙方if并case宣告承擔優先邏輯。但是,您可以選擇在priorityorunique關鍵字之前顯式添加iforcase關鍵字來宣告和檢查您的意圖。請參閱IEEE 1800-2017 SystemVerilog LRM中的第 12.4 和 12.5 節。
uj5u.com熱心網友回復:
2 個if/else陳述句的行為方式相同;第一個為真的條件具有最高優先級。一旦條件評估為真,else則忽略以下所有子句。因此,z <= 1如果兩個wire1_is_enabled和wire2_is_enabled是真實的。這很容易通過簡單的模擬向自己證明。
這不是一個糟糕的編碼習慣。這種情況在 Verilog 中很常見。當您說 時programming,也許您正在考慮軟體語言。請記住,這些是硬體信號而不是軟體變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/408141.html
標籤:
