case/casez/casex 的区分与使用

参考:http://www.cnblogs.com/poiu-elab/archive/2012/11/02/2751323.html

与  verilog数字系统设计基础

一般来说,使用最多的是CASE语句,casez和casex基本上很少使用,不过因为它们的功能强大,不能不学会它的使用。

一般性的常识是使用casez,强烈的建议不要使用casex。首先要明确的是‘?‘代表的不是don‘t care,而是‘z‘。再有就是case/casez/casex其实都是可综合的,这一点也要记住。

区分:

case语句的表达式的值有4中情况:0、1、z、x。4种是不同的,故表达式要严格的相等才可以操作分支语句。

casez语句中的表达式情况有三种:0、1、x。不用关心z,z可以和任何数值相等,即z =0.z= 1,z=x;

casex语句的表达式情况有二种:0、1.不用关心x和z。即x=z=0,x=z=1.

另外表达式的值是按从上到下的顺序来与分支条件的比较,如果相等,则不再与下面的分支相比较而直接执行该分支的语句。

实例分析看不同:

一、simulation difference

1、先看case

case (sel)
    2‘b00:      y = a;
    2‘b01:      y = b;
    2‘bx0:      y = c;
    2‘b1x:      y = d;
    2‘bz0:      y = e;
    2‘b1?:      y = f;
    default :   y = g;
endcase

不同的sel,对应

Result:      sel     y  case item     00      a  00     11      g  default     xx      g  default     x0      c  x0     1z      f  1?     z1      g  default

为啥呢?就是因为case会认出每种情况,1/0/z/x,所以就得到了上面的结果。很是严格。

2. casez,就是会把z/?匹配成任意,也会把任意匹配成z/?的。

casez (sel)
    2‘b00:      y = a;
    2‘b01:      y = b;
    2‘bx0:      y = c;
    2‘b1x:      y = d;
    2‘bz0:      y = e;
    2‘b1?:      y = f;
    default:    y = g;
endcase

对应的

Result:      sel     y  case item     00      a  00     11      f  1?     xx      g  default      x0      c  x0 (would have matched with z0(item 5) if item 3 is not present.)     1z      d  1x (would have matched with z0(item 5) & 1?(item 6) also.)     z1      b  01 (would have matched with 1?(item 6) also.)

首先,case的描述,匹配都是从上到下进行的,如果使用了casez,看上面的casez的列表,只要输入有z/?的话,就能和任意匹配,只要列表的index项有z/?,就能匹配任意项,再对照上面的例子,就明了了。

3、casex呢,再来

casex (sel)
    2‘b00   :   y = a;
    2‘b01   :   y = b;
    2‘bx0   :   y = c;
    2‘b1x   :   y = d;
    2‘bz0   :   y = e;
    2‘b1?   :   y = f;
    default :   y = g;
endcase 

结果呢?

Result:
    sel     y  case item
    00      a  00
    11      d  1x (would have matched with 1? also)
    xx      a  00 (would have matched with 1? also)
    x0      a  00 (would have matched with all items except 01)
    1z      c  x0 (would have matched with all items except 00,01)
    z1      b  01 (would have matched with 1x, 1? also) 

还是一样的道理,casex也是从上到下匹配,当出现x/z/?的输入的时候,都不会care,只管不是大大情况来匹配,上面的解释也是很容易看懂。就不多说了。

二、synthesis difference

综合的时候又是另一番景象了,因为综合工具其实都不会管你什么x/z/?之类的,他能认识什么呢?让我们再来测试一下,case/casez/casex不同写法的综合结果,例子都是同样的

1、例子1

case (sel)
    2‘b00   :   mux_out = mux_in[0];
    2‘b01   :   mux_out = mux_in[1];
    2‘b1?   :   mux_out = mux_in[2];
    default :   mux_out = mux_in[3];
endcase 

     

2、例子2

case (sel)
    2‘b00   :   mux_out = mux_in[0];
    2‘b01   :   mux_out = mux_in[1];
    2‘b1x   :   mux_out = mux_in[2];
    default :   mux_out = mux_in[3];
endcase

     

通过上面两个例子我们得到的结论是:

1. Case statement will not consider for synthesis, the items containing x or z. 
2. Casez and Casex will give the same output after synthesis, treating both x, z in case items as dont cares.

就是说你的case(不是casez/casex的时候)的index列表里面的x和z,都被综合工具认为是不可达到的状态就被去掉了。

casez和casex里面的x/z都被认为是don‘t care,所以综合出的电路会是一致的。

三、simulation vs synthesis

例子

casez (sel)
    2‘b00   :   mux_out = mux_in[0];
    2‘b01   :   mux_out = mux_in[1];
    2‘b1?   :   mux_out = mux_in[2];
    default :   mux_out = mux_in[3];
endcase

再看simulation与synthesis的结果

+---+-----------------------------------+-----------------------------------+|   |               casez               |               casex               ||sel|   Pre-synthesis   Post-synthesis  |   Pre-synthesis  Post-synthesis   |+---+-----------------------------------+-----------------------------------+|xx |   mux_in[3]       x               |   mux_in[0]       x               ||1x |   mux_in[2]       mux_in[2]       |   mux_in[2]       mux_in[2]       ||0x |   mux_in[3]       x               |   mux_in[0]       x               ||zz |   mux_in[0]       x               |   mux_in[0]       x               ||1z |   mux_in[2]       mux_in[2]       |   mux_in[2]       mux_in[2]       ||0z |   mux_in[0]       x               |   mux_in[0]       x               |+---+-----------------------------------+-----------------------------------+

作者此时说了两句话就是Another interesting, very important observation is that when ever there is a mismatch, post-synthesis result will become x. During RTL simulation if sel becomes xx, casez executes default statement(which is the intended behaviour) but casex executes case item1 (which is not the intended behaviour), clearly a mismatch.

看上面的表这就能说明问题了,不管用casez还是casex,simulation和synthesis的结果都会有出入的,所以在写代码的时候,考虑到综合,casez与casex都是完全等同的了,就不必要非得纠结写哪个比较好了。

或许casez有那么一点好处,能体现在

casez (sel)
    000: y = a;
    001: y = b;
    01?: y = c;
    1??: y = d;
endcase

这样的代码,如果用case写的话

case (sel)
    000             :   y = a;
    001             :   y = b;
    010,011         :   y = c;
    100,101,110,111 :   y = d;
endcase

就是这点有点罢了~

四、summary

1、我们在写代码的时候如果用了case,那么就不要在index列表里面出现x/z/?,综合工具认不出这些,都会当做don‘t care2、casez和casex综合的结果是一致的。3、casez稍好用一些,因为它可以用来代表don‘t care的值4、最重要的一点就是,casez和casex其实没有孰优孰劣

就这样,以后我用的时候没准会更多的用casez,case其实也是好东西,最好弄明白了自己真正要表达的意思是什么再动手写代码,还要深刻理解case/casez/casex到底起到的什么作用~

时间: 2024-08-25 22:57:53

case/casez/casex 的区分与使用的相关文章

FPGA代码设计规范整理

1.设计中的FIFO.状态机接口需要有异常恢复状态和状态上报机制,格雷码电路防止被综合电路优化掉. a)自行设计的格雷码FIFO(一般用于连续数据流跨时钟域)用Synplify综合时,为了防止被优化需要添加综合引导语句:“synthesis_syn_preserve = 1”: b)各种综合工具均有状态机安全模式,综合时候建议打开. 2.电路中所以寄存器.状态机.计数器.FIFO在单板上电复位时以及使用前必须处于一个已知状态. a)对电路中的寄存器.状态机.计数器.FIFO必须进行异步复位(不依

《Verilog数字系统设计教程》第3版 夏宇闻

目录 [toc] 第1章 Verilog的基本知识 数字电路系统设计: 从上到下(从抽象到具体)逐层描述自己的设计思想,用一系列分层的模块来描述极其复杂的数字系统. 利用EDA工具逐层进行仿真验证 将需要编程具体物理电路的模块组合经过自由综合工具转换到门级电路网表. ASIC或者FPGA实现功能. Verilog HDL和VHDL的比较: 重点是Verilog简单啊,入门容易. 逻辑网表EDIF: EDIF是电子设计交换格式(Electronic Design Interchange Forma

case、casez和casex的区别

参考博客:https://www.cnblogs.com/guolongnv/articles/6906929.html 1.基本概念 1)?表示z,而不是“dont care” 2)区分: case语句的表达式的值有4中情况:0.1.z.x.4种是不同的,故表达式要严格的相等才可以操作分支语句.   casez语句中的表达式情况有三种:0.1.x.不用关心z,z可以和任何数值相等,即z =0.z= 1,z=x;  casex语句的表达式情况有二种:0.1.不用关心x和z.即x=z=0,x=z=

SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-3 CASE表达式

● 虽然CASE表达式中的ELSE子句可以省略,但为了让SQL语句更加容易理解,还是希望大家不要省略. ● CASE表达式中的END不能省略. ● 使用CASE表达式能够将SELECT语句的结果进行组合. 什么是CASE表达式 CASE 表达式是在区分情况时使用的,这种情况的区分在编程中通常称为(条件)分支. CASE表达式的语法 下面就让我们赶快来学习一下搜索 CASE 表达式的语法吧. CASE表达式的使用方法  ELSE 子句也可以省略不写,这时会被默认为 ELSE NULL.但为了防止有

对Verilog 初学者比较有用的整理(转自它处)

对Verilog 初学者比较有用的整理(转自它处) ******************************************************************************************************************** *作者: Ian11122840    时间: 2010-9-27 09:04                                                                   

Verilog HDL设计进阶:有限状态机的设计原理及其代码风格_zt

http://www.21ic.com/app/eda/201308/189781_1.htm 由于Verilog HDL和 VHDL 行为描述用于综合的历史还只有短短的几年,可综合风格的Verilog HDL 和VHDL的语法只是它们各自语言的一个子集.又由于HDL的可综合性研究近年来非常活跃,可综合子集的国际标准目前尚未最后形成,因此各厂商的综合器所支持的HDL子集也略有所不同. 本书中有关可综合风格的Verilog HDL的内容,我们只着重介绍RTL级.算法级和门级逻辑结构的描述,而系统级

我的学习记录--grep , egrep

概念: grep (Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. grep:传统的grep程序,支持基本正则表达式 egrep:扩展的grep程序,支持扩展正则表达式 正则表达式:简单来说就是,用一串自己定义的条件字符串,去匹配检索文档中符合条件的字符. grep基本格式: grep [OPTIONS] PATTERN [FILE...] 常用选项: -o:只显示被模式匹

正则表达式grep和egrep的基本使用

正则表达式grep和egrep的使用 正则表达式(REGular EXPression REGEXP)就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找.删除.替换某特定字符串的处理程序.正则表达式中的模式(pattern)以正则表达式的元字符,以及正常字符组合而成. 正则表达式的字符串依照不同的严谨度而分为基础正则表达式与扩展正则表达式. 一.基础正则表达式(grep) Grep全称: Global search Regular

Linux grep,egrep及相应的正则表达式用法详解

linux在进行文本处理过程中的文本搜索工具称为正则表达式.文本搜索工具有grep.egrep.fgrep,egrep为正则表达式的扩展正则表达式,fgrep用于搜索文本字符串,与 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式.grep的含义为: global search Regular expression and Print out the line. 正则表达式(REGular EXPression REGEXP)是由元字符及正常字符所书写的模式,其中的