返回介绍

8.4 选择语句

发布于 2020-09-09 22:55:47 字数 2850 浏览 1040 评论 0 收藏 0

conditional_statement ::=                                       // 引用自附录A.6.6
    if (cond_predicate) statement_or_null [else statement_or_null]
  | unique_priority_if_statement

unique_priority_if_statement ::=
    [unique_priority] if (cond_predicate) statement_or_null
        {else if (cond_predicate) statement_or_null}
        [else statement_or_null]

unique_priority ::= unique | priority

cond_predicate ::=
    expression_or_cond_pattern {&& expression_or_cond_pattern}

expression_or_cond_pattern ::=
    expression | cond_pattern

cond_pattern ::= expression matches pattern

case_statement ::=                                           // 引用自附录 A.6.7
    [unique_priority]case_keyword(expression) case_item {case_item} endcase
  | [unique_priority]case_keyword(expression) matches case_pattern_item {case_pattern_item}
        endcase

case_keyword ::= case | casez | casex

case_item ::=
    expression {,expression} : statement_or_null
  | default [:] statement_or_null

case_pattern_item ::=
    pattern [&&expression ] : statement_or_null
  | default [:] statement_or_null

语法 8-3—选择语句语法(摘录自附录A)

在Verilog中,if (expression) 被计算成一个布尔值,因此,如果表达式的值是0或X,那么条件检查被认为是“假”的。

SystemVerilog加入了关键字unique和priority,它们可以在if之前使用。除非有一个显式的else语句,在没有条件匹配的情况下,只要使用了这两个关键字,就会引起运行时错误。例如:

unique if ((a==0) || (a==1)) $display("0 or 1");
else if (a == 2) $display("2");
else if (a == 4) $display("4"); // 值3,5,6,7会引起一个错误

priority if (a[2:1]==0) $display("0 or 1");
else if (a[2]==0) $display("2 or 3");
else $display("4 or 7"); // 覆盖了所有可能的其他值,因此没有错误。

unique if指示在一系列 if...else...if条件中不应该有任何交迭,也就是说,这些条件是互斥的,这就使得表达式能够并行计算。如果软件工具发现有多于一个条件为“真”,那么它应该发布一条错误信息。另外,如果软件工具发现没有条件为“真”,或者可能没有条件为“真”,并且最后的if没有对应的else语句,软件工具也应该发布一条错误信息。

priority if指示一系列if...else...if条件应该按列出的顺序计算。在前面的例子中,如果变量a的值为0,那么它可以满足第一个条件和第二个条件,这就要求一个优先级逻辑。如果软件工具发现没有条件为“真”,或者可能没有条件为“真”,并且最后的if没有对应的else语句,软件工具也应该发布一条错误信息。

unique和priority关键字适用于整个if...else...if条件。在前面的例子中,在任何一个else的后面插入这两个关键字都是非法的。为了在这一系列中的条件中嵌套另外一个if语句,应该使用begin...end块。

在Verilog中,具有三种类型的case语句,分别为case、casez和casex。在SystemVerilog中,这三个中的任何一个都可以使用priority或unique限定。priority case仅仅作用于第一个匹配。unique case应该检查case条目的交迭,允许case条目能够并行计算。如果多于一个case条目匹配于case表达式,那么unique case应该发布一条警告信息。如果case被限定为priority或unique,那么,如果没有case条目匹配的话,仿真器应该发布一条警告信息。这些警告信息可以在编译时发布也可以在运行时发布,只要仿真器能够确定这些无效条件。

注意:通过指定unique或priority,我们没有必要编码一个default条件来包含不期望的条件值。例如:

bit [2:0] a;

unique case(a)   // 值3,5,6,7会引起一个运行时警告
    0,1: $display("0 or 1");
    2: $display("2");
    4: $display("4");
endcase

priority case(a) // 值4,5,6,7会引起一个运行时警告
    3'b00?: $display("0 or 1");
    3'b0??: $display("2 or 3");
endcase

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文