verilog中的三目運算符

 

(1)
assign c=(sel)?a:b;
(2)
always @(sel or a or b) begin
        if(sel)
              c = a;
       else
              c = b;
end

      
這兩段代碼,我用quartus綜合出來的結果都是一個選擇器,可是我私覺得,這樣兩種風格的代碼,咱們都會偏向使用第一種,除了書寫方便外,是否還有別的優點?如資源分配等?
發表於 2012-9-25 21:18 | 只看該做者

第一種好。
if else的邏輯是:只要條件不符合,就走else路。
試想若是上級電路出錯,出現sel=1'bx的時候,那麼代碼(2)的c就會走else路=b。
而? :的運行結果跟實際電路更接近:連控制端sel都是不定值了,那c毫無疑問地應該是x,除非a=b。
總之,代碼(1)在綜合結果、資源利用等方面和(2)是徹底一致的,但(1)的前仿結果跟後仿、跟實際電路更接近。
php

發表於 2012-10-1 09:46 | 只看該做者

編碼規範嚴格的企業裏,是規定要用第二種的,
可靠性比第一種高,不容易寫錯
ide

請教各位大蝦,關於 Verilog 中三目運算符的用法
發佈: 2010-7-12 10:43 | 做者: shxr來源: EETOP 賽靈思(Xilinx) 社區 |
就是這個 out=s?a:b;這個用法只能用在assign中嗎?謝謝各位了
well_fish (2010-7-12 11:39:09)
always initial均可以
gdarboux (2010-7-12 17:17:28)
樓上正解
shxr (2010-7-13 09:21:40)
那可以用非阻塞賦值如「out<=s?a:b;」嗎?
MOSFET (2010-7-13 16:58:17)
回樓上能夠你這至關於 assign out_t=s?a:b; always@(...) out<=out_t;
xinyuliujian (2010-7-14 17:06:17)
謝謝!指點
neptune1983 (2010-7-14 20:24:15)
這條語句就至關於一個if---else語句
 
 
 
注意: if 語句和 case 語句都只能用於 always 語句內部,若是要在 always 語句以外應用條件語句,可用三目運算符 :以下:
              assign data = ( sel ) ? a : b ;
相關文章
相關標籤/搜索