SystemVerilog-跳转语句

数字硬件建模SystemVerilog-跳转语句

ee38dfd76c128df5c46a55fc2b93ce68.png

经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式和运算符。

马上HDLBits-SystemVerilog版本也开始准备了,基本这一部分完成后就开始更新~

33b152f922d594f9168d250cf5728c72.png

跳转语句允许程序代码跳过一个或多个编程语句,SystemVerilog的jump语句是continue、break和disable。

continue 和 break跳转语句

continue和break-跳转语句在循环中用于控制循环中语句的执行。这些跳转语句只能用于for循环、while循环和foreach循环。它们不能在循环之外使用。

continue语句跳转到循环的结尾,并计算循环的结束表达式(end expression),以确定循环是否应继续进行另一次迭代。下面的代码段使用for循环遍历一个小查找表的地址,该表被建模为16-bit的一维数组。使用continue语句跳过表中值为0的位置。对于非零位置,调用函数对该值进行某种操作(函数未显示)。

2e990a9ea28ec65d7283a76acdca4ddb.png

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<N; i++) begin 
     if (i < start_range) continue;  // skip rest of loop
     if (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
e6f0b78262063c419d74a0d21463b771.png图6-10:示例6-10的综合结果

disable跳转语句

SystemVerilog 的disable语句类似于其他编程语言中的go-to语句。disable跳转到一组命名语句的末尾或任务的末尾。disable跳转语句的一般用法是:

bc04eb5b36e0b15227359331e6c1ded1.png

在这个代码片段中,begin-end语句组被命名为search_loop。disable语句指示仿真立即跳到名为begin-end 语句组的末尾。

最初的Verilog语言没有continue和break-跳转语句。相反,disable语句与通用go-to行为一样用于跳转到循环的末尾,但会继续执行循环的下一个过程。disable语句通过跳过循环的末端,过早地跳出循环。要跳过循环中的语句,继续执行循环时,命名的begin-end语句组必须包含在循环中。要跳出循环,命名的begin-end语句组必须包含整个循环。

下面的示例显示了与示例6-10相同的功能,除了使用disable 跳转语句而不是continue和break语句,

374bfcebb7d47f2ae14895995769118c.png
最佳实践指南6-6
使用continue和break-跳转语句控制循环迭代。不要使用disable跳转语句.

disable 跳转语句提供与break和continue 跳转语句相同的功能,如上所示。然而,disable 跳转语句使代码更难读懂和维护,使用continue和break是一种更简单、更直观的编码方式。

disable跳转语句是一个通用的go-to语句,可以在验证中使用。综合编译器通常不支持使用disable的其他方法。

No-op声明

SystemVerilog编程语句以分号;(分号本身被视为完整的编程语句)表示没有要执行的功能。单独的分号执行空操作,通常被称为无操作语句(no-op语句)。

下面的代码片段表示存储数据变量的寄存器(使用触发器)。由case语句表示的多路输入确定要存储在数据寄存器中的值。

2cf929517378dbb6a4054631810cb9dc.png

此代码段中的case语句不会对mode的2’b11值进行解码。虽然在本例中功能上是正确的,但不完整的case语句不是完美的,并且可能会在代码验证期间引发问题,或者其他工程师在维护或重用代码时引入歧义(解码模式值2’b11是不是故意的?还是模型中的疏忽(错误))。在这个例子中,没有任何东西可以说明这种或那种方式。添加关于未使用的2’b11值的注释可能会很有帮助,但不是所有人都会用心的注释代码。

使用无操作语句有助于使RTL模型更加自我记录和可读。下面的代码片段在功能上与前面的示例相同,但是,即使没有注释,很明显,也很方便人们理解代码。

613f918e85c6bbb903abe496d5fffe47.png

时序逻辑中的无操作语句将被综合编译器忽略。没有要实现的功能,因此寄存器将保留其初始值。然而,综合编译器不能忽略组合逻辑中的no-op语句。当没有为变量赋值时,它将保留以前的值。综合时可能会添加一个锁存器,以便逻辑可以保存以前的值。

最佳实践指南6-7
不要将no-op语句用于RTL建模,

尽管综合编译器支持no-op,但它在RTL功能中没有任何用途,并且可能导致组合逻辑中出现意外的锁存器。为了完整性,我们讨论了no-op语句,但不建议在RTL代码中使用。

往期推荐

数字硬件建模SystemVerilog-循环语句

SystemVerilog-决策语句-case语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OpenFPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值