continue和break跳转语句介绍

描述

跳转语句允许程序代码跳过一个或多个编程语句,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 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

锁存器 图6-10:示例6-10的综合结果

 

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代码中使用。





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分