Verilog语言中case、casex、casez的用法和区别

Verilog语言中case、casex、casez的用法和区别
casez与casex语句是case语句的两种变体, 在写testbench时用到。

一、case、casex、casez的区别

下表给出case、casex、casez的真值表:

在这里插入图片描述

  1. case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配。

  2. casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。

  3. casex语句中,则把这种处理方式进一步扩展到对x的处理,即如果比较双方有一方的某些位的值是z或x,那么这些位的比较就不予考虑。

二、case/casez/casex 在simulation/synthesis的区别

有的网上说casex和casez属于不可综合语句,这是针对一般电路不会出现x状态来说的,但是综合工具并不会对x,z认识这个状态,所以综合出来的电路是一样的。

  1. 使用过程中许需要注意的问题:
    1)一般经常使用到的是casez语句,最好少用casex
    2)case/casez/casex其实都是可综合的
    3)在电路中,可以用?来表示无关值的z
    4)case的描述,匹配都是从上到下进行的
  2. 仿真的不同
    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

对于case来说,每一种情况都会识别(1/0/z/x)
当sel的状态是一下情况时,会出现以下结果

selycase item
00a00
11gdefault
xxgdefault
x0cx0
1zf1?
z1gdefault

2)对于casez

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

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

selycase item
00a00
11f1?
xxgdefault
x0cx0 (或者z0)
1zd1x(或者1?/z0)
z1b01(或者1?)

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

casex也是从上到下匹配,当出现x/z/?的输入的时候,都不会care,只管不是大大情况来匹配

selycase item
00a00
11d1x(或者1?)
xxa00(或者1?)
x0a00 (或者x0/1x/z0/1?)
1zcx0(或者1x/z0/1?)
z1b01(或者1x/1?)
  1. 综合的不同
    综合的时候,因为综合工具其实都不会管你什么x/z/?,对于综合工具来说是一样的,所以case/casez/casex不同写法的综合结果,例子都是同样的。

例一:

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 

例二:

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

这俩个例子的结果是一样的。
case(不是casez/casex的时候)的列表里面的x和z,都被综合工具认为是不可达到的状态就被去掉了。casez和casex里面的x/z都被认为是don’t care。

  1. 对于综合、仿真的结果
    1)在实际写代码的时候,如果使用case的时候,尽量不要用x/z/?,综合工具也会不care
    2)casez和casex综合的结果是一致的。
    3)casez稍好用一些,因为它可以用来代表don’t care的值
    4)最重要的一点就是,casez和casex其实没有孰优孰劣
    5)casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。所谓不必关心的情况,即在表达式进行比较时,不将该位的状态考虑在内。这样在case语句表达式进行比较时,就可以灵活地设置以对信号的某些位进行比较。
  • 80
    点赞
  • 335
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆渡沧桑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值