Verilog Case 语句

17 Mar 2025 | 6 分钟阅读

Case 语句检查给定的表达式是否与列表中的其他表达式匹配,并进行分支。它通常用于实现多路复用器。

如果要检查的条件很多,if-else 结构可能不适用,并且会综合成优先级编码器而不是多路复用器。

Verilog 中,case 语句包括 Verilog 关键字 case(“casez”,“casex”)和 endcase 之间的所有代码。 case 语句是一种多选一的结构,大致类似于 if-else-if 语句。

语法

Verilog case 语句以 case 关键字开头,以 endcase 关键字结尾。

括号内的表达式将被精确评估一次,并与书写顺序中的备选项列表进行比较。

并且执行与给定表达式匹配的选择的语句。多个语句块应该排序,并且在 begin 和 end 中。

如果 case 项均与给定表达式不匹配,则执行 default 项中的语句。 default 语句是可选的,并且在 case 语句中只有一个 default 语句。 Case 语句可以嵌套。

如果没有任何项与表达式匹配,并且未给出 default 语句,则执行将退出 case 块而不执行任何操作。

示例

以下风格模块包含一个 2 位选择信号,用于将三个不同 3 位输入之一路由到被称为 out 的信号。

case 语句用于根据 sel 的值将正确的输入分配给输出。由于 sel 可以是 2 位信号,因此它将有 22 种组合,即 0 到 3。 如果 sel 为 3,则 default 语句有助于将输出设置为零。

Case 语句头

case 语句头由 case(“casez”,“casex”)关键字后跟 case 表达式组成,通常都在一行代码中。

将 full_case 或 parallel_case 指令添加到 case 语句时,指令作为注释直接添加到 case 语句头末尾的 case 表达式之后,并在后续代码行的任何 case 项之前。

Case 项

case 项是用于与 case 表达式进行比较的位、向量或 Verilog 表达式。

与 'C' 等其他高级编程语言不同,Verilog case 语句包含隐式 break 语句。

与 case 表达式匹配的第一个 case 项会导致执行相应的 case 项语句,因此对于通过 case 语句的该过程,所有其余的 case 项都会被跳过。

Case 项语句

如果 case 项与 case 表达式匹配,则 case 项语句是一个或多个执行的 Verilog 语句。 与 VHDL 不同,Verilog case 项本身可以是表达式。

要更改 Verilog 代码文档的解析,如果对于特定的 case 项要执行多个语句,则 Verilog case 项语句应该包含在关键字"begin""end" 之间。

Casez

在 Verilog 中,有一个 casez 语句,它是 case 语句的一个变体,允许在 case 比较期间将“z”和“?”值视为“无关紧要”值。

如果“Z”和“?”位于 case 表达式内部,或者位于 case 项内部,则它们被视为无关紧要。

使用“无关紧要”编写 case 语句时,使用 casez 语句,并在 case 项中使用“?”字符而不是“z”字符,以指示“无关紧要”位。

Casex

在 Verilog 中,有一个 casex 语句,它是 case 语句的一个变体,允许在比较期间将“z”、“?”和“x”值视为“无关紧要”值。

如果“x”、“z”和“?”位于 case 表达式内部,或者位于 case 项内部,则它们被视为无关紧要。

完整 Case 语句

完整 case 语句是在其中所有可获得的 case 表达式二进制模式都与 case 项或 case default 匹配的 case 语句。

如果 case 语句不包含 case default,并且可以找到与任何打印的 case 项都不匹配的二进制 case 表达式,则该 case 语句不完整。

完整 case 语句是在其中每个可获得的二进制、非二进制以及二进制和非二进制的组合模式都作为 case 语句中的 case 项包含在内的 case 语句。

Verilog 不需要 case 语句是综合或 HDL 模拟完整的,但是可以通过添加 case default 使 Verilog case 语句完整。 VHDL 要求 case 语句是 HDL 模拟完整的,这通常需要一个“others”子句。

并行 Case 语句

并行 case 语句是在其中只能将 case 表达式与一个 case 项匹配的 case 语句。

如果可以找到可以与多个 case 项匹配的 case 表达式,则匹配的 case 项被称为重叠 case 项,因此 case 语句不是并行的。

硬件原理图

详细说明 RTL 代码以获得表示 4 对 1 多路复用器的硬件原理图。

Verilog Case Statement

执行上述设计后,当 sel 为 3 时,输出为零,并且对应于其他值的分配输入。

在 case 语句中,只有当表达式的每一位都与包括 0、1、x 和 z 在内的备选项之一匹配时,比较才会成功。 在上面的例子中,如果 sel 中的任何一位是 x 或 z,则将执行default 语句,因为没有其他备选项匹配。 在这种情况下,输出将全部为零。

如果设计中的 case 语句在 case 项备选项中包含 x 和 z,则结果会有所不同。

case 和 if-else 之间的区别

case 语句在两个方面不同于 if-else-if,例如

  • if-else 块中给出的表达式更通用,而在 case 块中,单个表达式与多个项匹配。
  • 当表达式中有 X 和 Z 值时,case 将提供明确的结果。

下一个主题Verilog 参数