我們知道在書本上都說讓我們盡量使用不帶優先級的的數據選擇器,今天我們就來探討一下二者的區別。
例子1:帶優先級的的數據選擇器,綜合成功,且沒有任何警告。

module detection_prio #( parameter NUM = 4, parameter DSIZE = 8 ) ( input [1:0] sel, input [NUM*DSIZE-1:0] din, output reg[DSIZE-1:0] dout ); always@(*)begin if(sel == 0) dout = din[0*DSIZE+:DSIZE]; else if(sel==1) dout = din[1*DSIZE+:DSIZE]; else if(sel==2) dout = din[2*DSIZE+:DSIZE]; else if(sel==3) dout = din[3*DSIZE+:DSIZE]; end endmodule
我們觀察一下其RTL視圖與路徑時序分析報告,最長路徑為LUT6加輸入輸出的buff延遲為1.103。
接着我們觀察一下低層的Technology Schematic視圖,我們可以看出來這個數據選擇器的每一個輸出其實是有一個6輸入的LUT6構成的,同樣從資源消耗圖上我們也可以看出來其實是有8個LUT構成的。
例子2,不帶優先級的case

module detection_prio #( parameter NUM = 4, parameter DSIZE = 8 ) ( input [1:0] sel, input [NUM*DSIZE-1:0] din, output reg[DSIZE-1:0] dout ); always@(*)begin case(sel) 0:begin dout = din[0*DSIZE+:DSIZE]; end 1:begin dout = din[1*DSIZE+:DSIZE]; end 2:begin dout = din[2*DSIZE+:DSIZE]; end 3:begin dout = din[3*DSIZE+:DSIZE]; end default:begin end endcase; end endmodule
同樣觀察RTL等,可以看出在這種情況下,二者生產的電路是一摸一樣的。
這里你可能會有疑問了,明明第一個是帶有優先級的,為什么會是一摸一樣的電路呢?
回答這個問題,首先拋開if els if case等代碼形式,我們探討一下我們為什么需要優先級,什么情況下有優先級和沒有優先級是一樣的的輸出。
很簡單,當判斷的條件里出現兩個或者多個條件成立的話,我們就需要優先級來確定我們需要選擇哪個。換句話說,當所有判斷條件有且僅有一個成立的情況下,我們就不需要優先級,因為結果也僅有一個。這時編譯器就會根據里面的算法優化給你優化成一個較好的電路結構,來完成你所需要的功能。