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_enabled
和 wire2_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 因为当第一个条件为假时,第二个条件永远不会为真。幸运的是,有许多工具可以为您标记此问题。
if
和 case
语句都采用优先逻辑。但是,您可以选择在 if
或 case
关键字之前明确添加 priority
或 unique
关键字以声明和检查您的意图。请参阅 IEEE 1800-2017 SystemVerilog LRM.
中的第 12.4 和 12.5 节
我注意到在 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_enabled
和 wire2_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 因为当第一个条件为假时,第二个条件永远不会为真。幸运的是,有许多工具可以为您标记此问题。
if
和 case
语句都采用优先逻辑。但是,您可以选择在 if
或 case
关键字之前明确添加 priority
或 unique
关键字以声明和检查您的意图。请参阅 IEEE 1800-2017 SystemVerilog LRM.