verilog case 避免锁存器生成synopsys parallel_case full_case

case使用

 case(data)

      0,1,2,3:   add <= 1;//列举取值,4‘b0000..

       4,5,6,7:   add <= 2;

       8,9,10,11:       add <= 3;

       12,13,14,15: add <= 4;

       default: ;

  endcase

避免方法

锁存器只存在于组合电路中,在时序电路上是不存在的。

1.case——————加default:

关于defalut的情况:一是可以 default:data=1‘bx;这个x表示未知,在综合时可以避免产生锁存器。在仿真时是红线表示。 二是 default:data=0;这样产生一个默认的情况。

2.if-----------------------一定要有else语句。

3.always---------如是说道:在赋值表达式右边参与赋值的信号都必须在always@(敏感电平列表)中列出。

Synopsys提供了引导语句,设计者可以使用这些引导语句控制DC综合的对象。
在设计代码中,引导语句“// synopsys translate_off”后直到“// synopsys translate_on”之间的语句被DC忽略。下面的例子给出了这两个引导语句的用法。
举例:

// synopsys translate_off
`ifdef ZTEIC
// synopsys_translate_on
   `define VENDOR_ID 16'h0083
// synopsys_translate_off
`else
   `define VENDOR_ID 16'h0036
`endif
// synopsys_translate_on

举例:

always @(cs_state)
begin
   case(cs_state) // synopsys parallel_case
         2'b00: next_state = 2'b01;
         2'b01: next_state = 2'b00;
         2'b10: next_state = 2'b10;
         default: next_state = 2'b00;
   endcase
end

在case语句中,如果列举的条件不完全,DC将生成不必要的锁存单元。在状态机描述中,可能没有一些状态,此时如果不加声明,DC将认为条件没有完全列举。在这种情况下,设计者可以使用full_case引导语句。
举例:

always @(cs_state)
begin
   case(cs_state) // synopsys full_case
      2'b00: next_state = 2'b01;
      2'b01: next_state = 2'b00;
      2'b10: next_state = 2'b10;
   endcase
end

parallel_case 和full_case引导格式
一般情况下,DC把case语句综合成选择器电路,但也可能把case语句综合成优先权译码电路。有时,优先权译码电路是不必要的,这是可以使用“// synopsys parallel_case”引导语句强迫DC把case语句综合成选择器电路。这种引导格式在case状态声明没有完全列举时应用较多。例3.2给出了这种引导格式。
Example

always @(cs_state)
begin
case(cs_state) // synopsys parallel_case
2’b00: next_state = 2’b01;
2’b01: next_state = 2’b00;
2’b10: next_state = 2’b10;
default: next_state = 2’b00;
endcase
end

在case语句中,如果列举的条件不完全,DC将生成不必要的锁存单元。在状态机描述中,可能没有一些状态,此时如果不加声明,DC将认为条件没有完全列举。在这种情况下,设计者可以使用full_case引导语句。见

always @(cs_state)
begin
case(cs_state) // synopsys full_case
2’b00: next_state = 2’b01;
2’b01: next_state = 2’b00;
2’b10: next_state = 2’b10;
endcase
end

你可能感兴趣的:(verilog)