Verilog case coding style

1、通常状况下,综合器将case语句综合成多路选择器,但也可能综合成优先级译码器。ide

2case语句中,若是条件列举不彻底,将综合出没必要要的锁存器。优化

综合器指令://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”指令优化状态机编码。缘由很简单,未列完的条件,视为dont care 其赋值由class

综合器自动选择01。比起人为的赋值01,它能简化逻辑,这点可经过卡诺图化简进行解释。module

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。

相关文章
相关标签/搜索