1、通常狀況下,綜合器將case語句綜合成多路選擇器,但也可能綜合成優先級譯碼器。ide
2、case語句中,若是條件列舉不徹底,將綜合出沒必要要的鎖存器。優化
綜合器指令://synopsys parallel_case & //synopsys full_caseui
使用//synopsys parallel_case能夠引導綜合器生成多路選擇器。編碼
1 always @(cs_state) 2 begin 3 case(cs_state) // synopsys parallel_case 4 2’b00: next_state = 2’b01; 5 2’b01: next_state = 2’b00; 6 2’b10: next_state = 2’b10; 7 default: next_state = 2’b00; 8 endcase 9 end
使用//synopsys full_case則能夠避免生成沒必要要的鎖存器。spa
1 always @(cs_state) 2 begin 3 case(cs_state) // synopsys full_case 4 2’b00: next_state = 2’b01; 5 2’b01: next_state = 2’b00; 6 2’b10: next_state = 2’b10; 7 endcase 8 end
Guideline1:使用if-else-if編碼優先級編/譯碼器,if-else-if的優先級關係更清楚明瞭。code
Guideline2:使用case實現查表類語句,這能提升代碼可讀性。blog
Guideline3:通常狀況下不要使用」full_case parallel_case」指令在verilog case語句中,其可能形成綜合器和仿真器行爲的不一致。input
Guideline4:3的例外狀況,可以使用」full_case parallel_case」指令優化狀態機編碼。緣由很簡單,未列完的條件,視爲don’t care 其賦值由class
綜合器自動選擇0或1。比起人爲的賦值0或1,它能簡化邏輯,這點可經過卡諾圖化簡進行解釋。module
3、避免case語句生成沒必要要latch的verilog推薦風格:使用default語句賦default值(0或1),或者在進入case語句後立馬賦default值,再對各條件作case分析。
4、case代碼舉例分析。
ex1:
1 module mux3c(y,a,b,c,sel); 2 output y; 3 input [1:0] sel; 4 input a,b,c; 5 reg y; 6 7 always @(a or b or c or sel) 8 case(sel) 9 2'b00: y=a; 10 2'b01: y=b; 11 2'b10; y=c; 12 default: y=1'bx; 13 endcase 14 endmodule
上述代碼對綜合器:當sel=11時,y爲don’t care ,而且綜合器使用卡諾圖化簡的方式進行邏輯優化;
對於仿真器:當sel=11時,y值爲x,未知態。所以,這也會致使綜合器和仿真器行爲不一致(對綜合器而言,其效果和使用full_case同樣)。
ex2:
1 module mux3c(y,a,b,c,sel); 2 output y; 3 input [1:0] sel; 4 input a,b,c; 5 reg y; 6 7 always @(a or b or c or sel) 8 case(sel) //synopsys full_case 9 2'b00: y=a; 10 2'b01: y=b; 11 2'b10; y=c; 12 endcase 13 endmodule
上述代碼對綜合器,sel=11時,y爲don’t care,但對仿真器會是鎖存器(y值保持不變)。
ex3:使用default賦肯定的default值(非x值)
1 module mux3c(y,a,b,c,sel); 2 output y; 3 input [1:0] sel; 4 input a,b,c; 5 reg y; 6 7 always @(a or b or c or sel) 8 case(sel) 9 2'b00: y=a; 10 2'b01: y=b; 11 2'b10; y=c; 12 default: y=a;//or y=1'b0; 13 endcase 14 endmodule
經過肯定的值避免仿真器出現X值。
ex4:進入case語句後立馬賦default值
1 module mux3c(y,a,b,c,sel); 2 output y; 3 input [1:0] sel; 4 input a,b,c; 5 reg y; 6 7 always @(a or b or c or sel) 8 y=1'b0; 9 case(sel) 10 2'b00: y=a; 11 2'b01: y=b; 12 2'b10; y=c; 13 endcase 14 endmodule
經過先賦值的方式,避免忘記寫完整個case條件而出現latch。