synopsys full_case parallel_case、casez、casex、One-hot FSM的使用

先说结论:
① //synopsys full_case parallel_case在工作中非常不可控!在标准代码规范中,只能被应用于One-hot FSM的case语句。
② 如果你想将该语句应用于其他的case语句,你需要非常清楚的知道综合器会将你的代码综合成什么。在通常情况下,将case语句default描述完整,不会需要用到这种指令语句。
③ 尽量不在可综合的代码中使用casex、casez语句。

1、casex和casez
casez是指对item中的高组态不关心,即忽略含有高阻态位"?“的比较。
casex指对不确定态和高组态不关心。即忽略含有高阻态位”?"和不确定态位"x"的比较。例:

casez(sel)
        2'b00:y=2'd0;
        2'b01:y=2'd1;
        2'b1?:y=2'd2;
        default:y=2'd0;
 endcase

当sel=2’b10、2’b11、2’b1x、2’b1?时,全部执行y=2’d2;
当sel=2’b0?时,00,01均匹配,此时按顺序执行y=2’d0。
使用规范: 尽量不在可综合的代码中使用casex、casez语句

2、 parallel_case
该指令语句可以控制综合器,在综合时会生成什么样的硬件电路。
使用parallel_case,可以使case语句的item statement检查时没有优先级。
但是在规范情况下使用if-else语句对具有优先级的逻辑进行代码,使用case语句对真值表类型编码器进行编码。

3、 full_case

case(sel)
        2'b00:y=2'd0;
        2'b01:y=2'd1;
 endcase

在上例中没有default,在综合时会产生latch。为避免产生latch情况,使用full_case指令会控制综合器不产生Latch,(综合器会按照所有case的item statement已经列全的情况处理)
在代码规范中,除非你非常明确该指令加入的必要,否则不要使用该指令,而且加入default比使用这条指令语句要方便得多!

4、One-hot FSM中 synopsys full_case parallel_case
N位状态寄存器编码N个状态,每个状态中只有一位有效,如四个状态:4’b0001, 4’b0010, 4’b0100, 4’b1000。
通常synopsys full_case parallel_case只限制应用于One-hot FSM的case语句。例:

casex(sel)		//synopsys full_case parallel_case
        4'bxxx1:	y=2'd0;
        4'bxx1x:	y=2'd1;
        4'bx1xx:	y=2'd2;
        4'B1xxx:	y=2'd3;
 endcase

5、 引用:“full_case” and “parallel_case” directives are most dangerous when they work! It is better to code a full and parallel case statement than it is to use directives to make up for poor coding practices.

你可能感兴趣的:(Verilog)