• 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控制循环执行
    1. //`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
    2. module find_bit_in_range
    3. #(parameter N = 4// bus size
    4. (input  logic [N-1:0]         data,
    5. input  logic [$clog2(N)-1:0] start_range, end_range,
    6. output logic [$clog2(N)-1:0] low_bit
    7. );
    8.  timeunit 1ns; timeprecision 1ns;
    9.  always_comb begin 
    10.    low_bit = '0;
    11.    for (int i=0; i
    12.      if (i < start_range) continue;  // skip rest of loop
    13.      if (i > end_range)   break;     // exit loop
    14.      if ( data[i] ) begin 
    15.        low_bit = i;
    16.        break;                        // exit loop
    17.      end 
    18.    end  // end of the loop
    19.    // ...  // process data based on lowest bit set
    20.  end 
    21. endmodule: find_bit_in_range
    22. //`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语句

  • 相关阅读:
    Docker安装MongoDB
    整车级虚拟标定:降本增效
    【音视频基础】视频基础理论
    NOIP1998-2018年普及组 CSP-J2 2019 2020 解题报告及视频
    如何快速生成项目目录结构树?
    .Net Core/.net 6/.Net 8 实现Mqtt服务器
    MyBatis使用注解操作及XML操作
    三十六、openlayers官网示例Earthquake Clusters解析——在聚合图层鼠标触摸显示五角星
    基础的SpringMvc开发
    力扣leetcode算法-搜索插入位置
  • 原文地址:https://blog.csdn.net/Pieces_thinking/article/details/127781199