Verilog case coding style


1、一般情況下,綜合器將case語句綜合成多路選擇器,但也可能綜合成優先級譯碼器。

2case語句中,如果條件列舉不完全,將綜合出不必要的鎖存器。

綜合器指令://synopsys parallel_case & //synopsys full_case

使用//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則可以避免生成不必要的鎖存器。

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的優先級關系更清楚明了。

Guideline2:使用case實現查表類語句,這能提高代碼可讀性。

Guideline3:一般情況下不要使用”full_case parallel_case”指令在verilog case語句中,其可能造成綜合器和仿真器行為的不一致。

Guideline4:3的例外情況,可使用”full_case parallel_case”指令優化狀態機編碼。原因很簡單,未列完的條件,視為dont care 其賦值由

綜合器自動選擇01。比起人為的賦值01,它能簡化邏輯,這點可通過卡諾圖化簡進行解釋。

3、避免case語句生成不必要latchverilog推薦風格:使用default語句賦default值(01),或者在進入case語句后立馬賦default值,再對各條件做case分析。

 

4case代碼舉例分析。

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時,ydont 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時,ydont 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。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM