跳转语句允许程序代码跳过一个或多个编程语句,SystemVerilog的jump语句是continue、break和disable。
continue 和 break跳转语句
continue和break-跳转语句在循环中用于控制循环中语句的执行。这些跳转语句只能用于for循环、while循环和foreach循环。它们不能在循环之外使用。
continue语句跳转到循环的结尾,并计算循环的结束表达式(end expression),以确定循环是否应继续进行另一次迭代。
下面的代码段使用for循环遍历一个小查找表的地址,该表被建模为16-bit的一维数组。使用continue语句跳过表中值为0的位置。对于非零位置,调用函数对该值进行某种操作(函数未显示)。
break语句立即终止循环的执行。循环退出,任何循环控制语句(如for循环步骤分配)都不会执行。
示例6-10说明了如何使用continue和break来查找在一个位范围内设置为1的第一位。图6-10显示了该示例的综合结果。
示例6-10:使用continue和break控制循环执行
//`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords module find_bit_in_range #(parameter N = 4) // bus size (input logic [N-1:0] data, input logic [$clog2(N)-1:0] start_range, end_range, output logic [$clog2(N)-1:0] low_bit ); timeunit 1ns; timeprecision 1ns; always_comb begin low_bit = '0; for (int i=0; i图6-10:示例6-10的综合结果end_range) break; // exit loop if ( data[i] ) begin low_bit = i; break; // exit loop end end // end of the loop // ... // process data based on lowest bit set end endmodule: find_bit_in_range //`end_keywords
disable跳转语句
SystemVerilog 的disable语句类似于其他编程语言中的go-to语句。disable跳转到一组命名语句的末尾或任务的末尾。disable跳转语句的一般用法是:
在这个代码片段中,begin-end语句组被命名为search_loop。disable语句指示仿真立即跳到名为begin-end 语句组的末尾。
最初的Verilog语言没有continue和break-跳转语句。相反,disable语句与通用go-to行为一样用于跳转到循环的末尾,但会继续执行循环的下一个过程。
disable语句通过跳过循环的末端,过早地跳出循环。要跳过循环中的语句,继续执行循环时,命名的begin-end语句组必须包含在循环中。要跳出循环,命名的begin-end语句组必须包含整个循环。
下面的示例显示了与示例6-10相同的功能,除了使用disable 跳转语句而不是continue和break语句,
最佳实践指南6-6 |
---|
使用continue和break-跳转语句控制循环迭代。不要使用disable跳转语句. |
disable 跳转语句提供与break和continue 跳转语句相同的功能,如上所示。然而,disable 跳转语句使代码更难读懂和维护,使用continue和break是一种更简单、更直观的编码方式。
disable跳转语句是一个通用的go-to语句,可以在验证中使用。综合编译器通常不支持使用disable的其他方法。
No-op声明
SystemVerilog编程语句以分号;(分号本身被视为完整的编程语句)表示没有要执行的功能。单独的分号执行空操作,通常被称为无操作语句(no-op语句)。
下面的代码片段表示存储数据变量的寄存器(使用触发器)。由case语句表示的多路输入确定要存储在数据寄存器中的值。
此代码段中的case语句不会对mode的2’b11值进行解码。虽然在本例中功能上是正确的,但不完整的case语句不是完美的,并且可能会在代码验证期间引发问题,或者其他工程师在维护或重用代码时引入歧义(解码模式值2’b11是不是故意的?还是模型中的疏忽(错误))。
在这个例子中,没有任何东西可以说明这种或那种方式。添加关于未使用的2’b11值的注释可能会很有帮助,但不是所有人都会用心的注释代码。
使用无操作语句有助于使RTL模型更加自我记录和可读。下面的代码片段在功能上与前面的示例相同,但是,即使没有注释,很明显,也很方便人们理解代码。
时序逻辑中的无操作语句将被综合编译器忽略。没有要实现的功能,因此寄存器将保留其初始值。然而,综合编译器不能忽略组合逻辑中的no-op语句。
当没有为变量赋值时,它将保留以前的值。综合时可能会添加一个锁存器,以便逻辑可以保存以前的值。
最佳实践指南6-7 |
---|
不要将no-op语句用于RTL建模, |
尽管综合编译器支持no-op,但它在RTL功能中没有任何用途,并且可能导致组合逻辑中出现意外的锁存器。为了完整性,我们讨论了no-op语句,但不建议在RTL代码中使用。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !