68,Verilog-2005标准篇:Case语句

case 语句是一种多向决策语句,用于测试一个表达式是否与其他多个表达式中的一个相匹配,并据此进行分支操作。case语句的语法如下表1所示:

表1:case语法

缺省(default)语句应为可选语句,在一个 case 语句中使用多个缺省语句是非法的。

Case的表达式(expression)和case_item的表达式可在运行时计算,这两种expression都不要求是常量表达式。

下面举例说明case的使用方法:

括号中的case表达式应在任何case项表达式之前精确地求值一次。case项表达式应按照给出的顺序进行计算和比较。如果存在default case项,则在线性搜索过程中忽略该项。在线性搜索过程中,如果其中一个case项表达式与括号中给出的case表达式相匹配,则应执行与该case项相关的语句,并终止线性搜索。如果所有比较都失败,且给出了default case项,则应执行default项语句。如果没有给出default项语句,且所有case项的比较都失败,则不会执行任何case项语句。

除了语法不同外,case 语句与if-else-if 结构还有两个重要的不同点:

a) if-else-if 结构中的条件表达式比 case 语句中的将一个表达式与其他多个表达式进行比较更通用。

b) 当表达式中有 x 和 z 值时,case 语句提供了一个确定的结果。

在 case 表达式比较中,只有当每个位与 0、1、x 和 z 值完全匹配时,比较才会成功。因此,在指定 case 语句中的表达式时需要小心谨慎。所有表达式的位宽必须相等,这样才能进行精确的比特匹配。所有case表达式的位宽应等于位宽最长的case表达式位宽。如果这些case表达式中有任何一个是无符号表达式,那么所有表达式都将被视为无符号表达式。如果所有这些表达式都是有符号的,则应将它们视为有符号表达式。

verilog提供可处理x和z值的case表达式比较的原因在于它提供了一种检测此类值的机制,并减少了因其存在而产生的不确定性。

Case用法例子1:

在例1中,如果select[1]为0且flaga为0,那么即使select[2]的值为x或z,结果也应为 0。

Case用法例子2:展示了使用 case 语句检测 x 和 z 值的另一种方法:

casez与casex语句

case语句还提供了另外两种特殊情况的语句,以便处理 "不关心 "条件。其中一种将高阻抗值( z )视为 "忽略"条件,另一种将高阻抗值( z )和未知值( x )均视为 "忽略"条件。这些 case 语句的使用方法与传统的case语句相同,但它们分别以关键字 casezcasex 开头。

casezcasex的比较过程中,case表达式中任何位的"忽略"值(casez的z值,casex的 z 和 x 值)都将被视为 "忽略不计"条件,该位的值将不予考虑。另外为了方便,verilog语法允许在case语句中使用问号(?)代替 z。

例1的casez 语句就使用了问号(?)来替代“忽略”的z值:

例2为casex 语句的用法示例:

case 语句中的常量表达式

常量表达式也可用于case中的表达式。常量表达式的值应与case项中的表达式进行比较。

例如下面的示例演示了如何使用3位优先级编码器建模:

在本例中,case表达式是常量表达式 (1)。case项是表达式(位选择),并与常量表达式进行匹配比较。

点赞加关注博主(ID:FPGA小飞)的博文,咱们一起系统学习verilog最终标准IEEE Std 1364-2005吧!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值