2013-03-14 95 views
2

我遇到了優先級編碼器設計,並找到了一種使用case語句的新方法。 唯一令人困惑的是,案件陳述是否優先處理案件? 例子:verilog中的case語句

case(1'b1)         
    A[3]: Y<=4'b1000;    
    A[2]: Y<=4'b0100; 
    A[1]: Y<=4'b0010; 
    A[0]: Y<=4'b0001; 
    default:Y<=4'b0000; 
endcase 

在這裏,如果我給A1111Y得到1000即它優先考慮的第一個case語句。 這是爲什麼呢?

回答

5

是的,有一個優先順序,根據訂單。據了Verilog-2001規範,9.5節:

情況下項表達式應進行評估,並在其給出的確切順序進行比較。在線性搜索期間,如果其中一個case項目表達式與括號中給出的大小寫表達式匹配,則應執行與該案例項目相關聯的語句。

+0

哦。那麼我有疑問。這不像寫一個if else語句嗎?那麼爲什麼要寫一個案例陳述? – aditya3524 2013-03-14 20:24:47

+2

@ aditya3524 case語句更清晰,並且通常優先於其他鏈。 – Morgan 2013-03-14 20:27:52

+1

我個人很少看到用這種方式編寫的優先級編碼器。它應該相當於一堆if/else語句。這是更緊湊,但我發現它很難閱讀,因爲case(...)內的值是一個常量。 – dwikle 2013-03-14 20:29:56

9

我會重構這個到:

casez(A)         
    4'b1???: Y<=4'b1000;    
    4'b01??: Y<=4'b0100; 
    4'b001?: Y<=4'b0010; 
    4'b0001: Y<=4'b0001; 
    default: Y<=4'b0000; 
endcase 

那麼就沒有必要擔心的優先級,每場比賽都是獨一無二的。

從IEEE標準1800年至2009年(IEEE標準的SystemVerilog)的情況下,語句
常量表達式

12.5.2常量表達式可以用於case_expression。常量表達式的值應與case_item_expressions進行比較。

logic [2:0] encode ; 

case (1) 
    encode[2] : $display("Select Line 2") ; 
    encode[1] : $display("Select Line 1") ; 
    encode[0] : $display("Select Line 0") ; 
    default $display("Error: One of the bits expected ON"); 
endcase 

12.5.3獨特情況,unique0-情況下,和優先級的情況下
的:

以下示例通過模擬的3位優先級編碼器演示了使用case,casez和casex關鍵字可以通過優先級,唯一性或unique0關鍵字進行限定,以執行某些違規檢查。這些統稱爲優先個案,獨特個案或獨特個案。優先案件只適用於第一場比賽。 Unique-case和unique0-case聲明不存在重疊的case_items,因此case_items可以並行評估。

...

priority casez(a) // values 4,5,6,7 cause a violation report 
    3’b00?: $display("0 or 1"); 
    3’b0??: $display("2 or 3"); 
endcase 

我不知道如何很好地支持優先case語句是由綜合工具雖然支持。

+0

完整SystemVerilog標準(2012)在這裏:https://standards.ieee.org/findstds/standard/1800-2012.html – 2017-02-25 02:17:35