verilog中if-else和case的比較
比較if-else_if-else和case:
1、if(a==2'b00)
語句1;
else if(a==2'b01)
語句2;
else
語句3;
case(a)
2'b00: 語句1;
2'b01: 語句2;
default: 語句3;
endcase
在這種情況下,判斷條件中只有一個能滿足,不管先判斷哪個條件,都不影響結果,即可視為不存在優先順序關係。兩者綜合後的RTL和Tech結果一樣。
2、if(a==1'b1)
語句1;
else if(b==1'b1)
語句2;
else
語句3;
case({a,b})
2'b10: 語句1;
2'b01: 語句2;
default: 語句3;
endcase
這種情況下,將else-if中的條件視為b==1'b1&&a!=1'b1,兩者邏輯就不一樣,沒有比較的必要。case語句可改為如下形式。
3、case({a,b})
2'b10: 語句1;
2'b01: 語句2;
2'b11: 語句1;
2'b00: 語句3;
endcase
這種情況下,RTL結果可能會不一樣,但Tech結果一樣。
其他:
1、無復位置位端
2、同步置位或復位(if語句將0或1賦給輸出),將最外層if語句作為復位或置位端。 FDR(同步D觸發器)
3、非同步復位或置位,必須要有if(!rst_n) data_out <= 1'b0 來複位或置位(1置位0復位) FDC(非同步D觸發器)
4、非同步復位端接入了可變的數值。LPM_DFF
有點亂,以後有空再整理。