首先,一般性的常识是使用casez,强烈的建议不要使用casex,(虽然我没有这个常识)。这是为啥呢?待续。

首先要明确的是’?’代表的不是don’t care,而是’z’。这点一定要明确。

再有就是case/casez/casex其实都是可综合的,这一点也要记住。

好,再说区别

case treats ‘z’ & ‘x’ as it is
casez treats ‘z’ as dont care
casex treats ‘z’ & ‘x’ as dont care
这就是区别,下面来具体解释一下

一、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,所以就得到了上面的结果

  1. 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 caseitem 00a 00 11d 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 care
2、casez和casex综合的结果是一致的。
3、casez稍好用一些,因为它可以用来代表don’t care的值
4、最重要的一点就是,casez和casex其实没有孰优孰劣
就这样,以后我用的时候没准会更多的用casez,case其实也是好东西,最好弄明白了自己真正要表达的意思是什么再动手写代码,还要深刻理解case/casez/casex到底起到的什么作用~

case/casez/casex 区别与综合相关推荐

  1. 【 Verilog HDL 】case, casez, casex 之干货总结

    这几天在做一个无人机定位的项目,时间比较紧,自己也不太懂,所以就边忙别愁就没有了精力写博客了.可是想想这样也不好,还是抽出点时间写博客,即使写的比较简单也行,至少能解答自己的疑惑就够了. Verilo ...

  2. case/casez/casex 的区分与使用

    参考:http://www.cnblogs.com/poiu-elab/archive/2012/11/02/2751323.html 与  verilog数字系统设计基础 一般来说,使用最多的是CA ...

  3. case、casex、casez的区别

    一.case.casex.casez的区别 下表给出case.casex.casez的真值表: 在这里插入图片描述 在case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹 ...

  4. mysql8和5.7区别_综合布线产品类别之间有何种联系和区别?

    之前小编已经写过一篇关于超5类6类超6类7类综合布线产品之间的联系,但是总感觉不够清楚,这里小编在此基础上重新再来过一次,对于产品之间的关于超5类6类超6类7类之间的介绍再详细一点,以便我们一起交流和 ...

  5. Scala class和case class的区别

    在Scala中存在case class,它其实就是一个普通的class.但是它又和普通的class略有区别,如下: 1.初始化的时候可以不用new,当然你也可以加上,普通类一定需要加new: scal ...

  6. Verilog中case,casex,casez的区别

    在case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配. Note: casez与casex语句是case语句的两种变体, 在写testbench时用到,属于不可综合的 ...

  7. HDLBits 系列(3)Priority Encoder(Case/Casez)

    目录 抛砖引玉 使用CASEZ来解决 写在最后 抛砖引玉 优先级编码器是一种组合电路,当给定输入位向量时,输出该向量中第一个1位的位置. 例如,给定输入8'b10010000的8位优先级编码器将输出3 ...

  8. class与case class的区别(转载)

    在Scala中存在case class,它其实就是一个普通的class.但是它又和普通的class略有区别,如下: 1.初始化的时候可以不用new,当然你也可以加上,普通类一定需要加new: scal ...

  9. oracle中DECODE与CASE的用法区别

    对于CASE与DECODE其实并没有太多的区别,他们都是用来实现逻辑判断.Oracle的DECODE函数功能很强,灵活运用的话可以避免多次扫描,从而提高查询的性能.而CASE是9i以后提供的语法,这个 ...

最新文章

  1. 机器学习模型调参指南(附代码)
  2. 平安技术开放日质量保证技术专场第一期 [附部分 ppt]
  3. Eclipse导入import sun.misc.BASE64Decoder报错的解决办法
  4. 小强升职记梗概_解读《小强升职记》——一本关于时间管理的书
  5. 同步通信和异步通信的区别
  6. Qt中标准对话框实例,QObject::tr()的作用
  7. 组合问题 已知组合数_组合和问题
  8. JAVA费罗切测评_暴力美学的终极形态 JAVA Feroce 2评测
  9. 当你负债累累,看不到方向,众叛亲离时,该如何面对?
  10. 《网络攻防实践》 课程教学
  11. jdk和jre和jvm区别_JDK,JRE和JVM之间的区别
  12. 已知两点坐标,求两点连成的直线中的某一点坐标
  13. element上传附件(el-upload 超详细)
  14. 欢迎甲方跳槽到云厂商
  15. [C语言] 混合or连续使用getchar,scanf所出现的错误
  16. 哈希(散列)函数的一些应用
  17. 如何解读肠道菌群检测报告中维生素指标
  18. 天翼宽带政企网关B2-1P 如何获得超级管理员账号?
  19. EOS基础全家桶(九)官方测试网的使用
  20. 计算机数制详解及相互转换(二进制、八进制、十进制、十六进制)

热门文章

  1. java 线程耗尽_关于线程耗尽导致请求超时系统假死的思考
  2. 解决:AWVS(Acunetix)激活频繁失效(仅供学习)
  3. ddr4 lpddr4区别_笔记本内存LPDDR3就一定不如DDR4吗?宏旺半导体解释两者的区别?...
  4. Nand Flash基础知识
  5. 在manjaro下安装安卓投屏软件scrcpy详细过程
  6. APNS部署教程2(证书配置)
  7. 传智播客与英特尔结成合作伙伴,共同推动软件技术进步
  8. 数据结构复习 ---- 邻接矩阵
  9. HTTP协议与XML
  10. 实现图片中文的识别和获取图片上文字的坐标(java实现)