Verilog 中的 If else 条件优先级

If else condition precedence in Verilog

我注意到在 Verilog 中使用 if-else 条件语句时存在赋值优先级。例如下面的代码:

if(counter < 6)
  z <= 1;
else if(counter < 12)
  z <= 2;
else
  z <= 3;

我注意到,直到计数器小于 6,z 的值被赋值为 1 (z <= 1),一旦计数器的值超过 6 并且小于 12,z 赋值为 2 (z <= 2).

如果像下面的代码那样在条件语句中使用了不同的变量怎么办?

if(wire1_is_enabled)
  z <= 1;
else if(wire2_is_enabled)
  z <= 0;

当两个条件都为真时会发生什么?这里赋值运算符的行为是什么? 我认为这是不良的编程习惯。

2 if/else 语句的行为方式相同;第一个为真的条件具有最高优先级。一旦条件评估为真,所有以下 else 子句将被忽略。因此,如果 wire1_is_enabledwire2_is_enabled 都为真,则 z <= 1。这很容易通过简单的模拟向您自己证明。

这不是一个糟糕的编码习惯。这种情况在Verilog中很常见。当您说 programming 时,您可能会想到软件语言。请记住,这些是硬件信号而不是软件变量。

是的,嵌套的if-else 分支语句在执行顺序中自然具有优先级。考虑使用 case 语句而不是深度嵌套的 if 语句,这样可读性更高。

这种编码风格没有任何问题,除非你有这样的代码:

if(counter < 6)
  z <= 1;
else if(counter < 2)
  z <= 2; // unreachable
else
  z <= 3;

然后语句 z <= 2; 变成 unreachable 因为当第一个条件为假时,第二个条件永远不会为真。幸运的是,有许多工具可以为您标记此问题。

ifcase 语句都采用优先逻辑。但是,您可以选择在 ifcase 关键字之前明确添加 priorityunique 关键字以声明和检查您的意图。请参阅 IEEE 1800-2017 SystemVerilog LRM.

中的第 12.4 和 12.5 节