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语句相同,但它们分别以关键字 casez 和 casex 开头。
在casez或casex的比较过程中,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吧!