full case与parallel case

full case

parallel case

作用

指示综合器:case里没提到的状态不用管

指示综合器:此case无优先级的概念

使用这个选项可能的后果

如果case不完全,那么仿真器会产生latch,而使用这个选项后综合器综合出来的电路不会有latch。

导致仿真和综合结果不一致。

如果此case有优先级(导致优先级的原因:使用Verilog编程时使用case可能会有多重匹配或者使用casez、casex都可以导致多重匹配。多重匹配会自动匹配第一个,可能会导致优先级编码),那么在仿真的时候会有优先级,而使用这个选项后综合出来的电路却没有优先级。

导致仿真和综合结果不一致。

问题的实质

使用不完全的case一定会导致latch。

当使用了这一个选项后,导致综合器不产生latch,而仿真器却产生latch(的行为),从而产生问题。

如果verilog存在多重匹配时,一定会有优先级现象。

当使用了这一个选项后,导致综合器不产生优先级现象,而仿真器却产生优先级(的行为),从而产生问题。

被误用的最初目的

防止产生因为case不完全导致的latch

仿制因为各匹配项不互斥产生优先级现象

解决最初目的的替代方法

1、对reg赋初值

2、使case的分支覆盖所有,如果不可能或者求简便,加入default分支。(本质的解决方法)

1、如果想使用优先级,那么使用if-else

不想使用优先级,那么使用case。

2、不使用casez和casex。

3、让所有匹配项互斥。(本质的解决方法)

 

 

 

注:

1、为何VHDL的case不会产生优先级而Verilog的case会产生优先级?

VHDL的case:值必须为常数,并且必须彼此不同,故天生就是parallel,没有优先级。

Verilog的case:值可以为各种值或者信号;并且在casex、casez中“?”(或者“z”)的使用(比如:11?? 和??11可以作为同一个case的分支),导致多重匹配,语法规定第一个匹配者为执行的分支,故产生了优先级。

2、关于casex和casez:

casez:把z和?当作“not-care”比特,z和?可以出现在case后面的表达式或者匹配项的表达式中。

casex:把z、?和x当作“not-care”比特,z和?可以出现在case后面的表达式或者匹配项的表达式中。

3、作者说的唯一可以使用这两个选项的地方

Adding either or both "// synopsys full_case parallel_case"directives to the Verilog FSM source code is generally beneficial when codingone-hot or one-hot with zero-idle FSMs. In these cases, it is given that onlyone bit of the state vector is set and that all other bit-pattern combinations shouldbe treated as "don't cares." It is also given that there should be nooverlap in the list of case items.

比如下例:

以上内容是《“full_caseparallel_case”, the Evil Twins of Verilog Synthesis》的笔记

猜你喜欢

转载自blog.csdn.net/childbor/article/details/78633541
今日推荐