sv标准研读第十三章-task和function

news2024/12/23 5:49:38

书接上回:

sv标准研读第一章-综述

sv标准研读第二章-标准引用

sv标准研读第三章-设计和验证的building block

sv标准研读第四章-时间调度机制

sv标准研读第五章-词法

sv标准研读第六章-数据类型

sv标准研读第七章-聚合数据类型

sv标准研读第八章-class

sv标准解读第九章-进程

sv标准研读第十章-赋值语句

sv标准研读第十一章-操作符和表达式

sv标准研读第十二章-过程性编程语句

第13章 task和function

13.1 总览

-task声明

-function声明

-调用task和function

13.2 概述

Task和function的区别:

-function不消耗仿真时间,task可以消耗仿真时间

-function里不可以调用task,但是task里可以调用function和task

-function可以return一个返回值,但是task不可以

-function可以放在一个表达式里当做一个操作数,这个操作数的值就是function的返回值

13.3 task

Task声明格式:

声明task时,形式参数可以指明数据类型和传输方向,如下:

方向有下面四种:

当没有指明方向时,默认方向是input。一旦一个参数指明了是某个方向,后面没有指明方向的参数的方向和这个参数的方向保持一致。举例:

a/b的方向是input,u/v的方向是output。

当没有指明数据类型时,默认数据类型是logic。一旦一个参数指明了是某个数据类型,后面没有指明数据类型的参数的数据类型和这个参数的数据类型保持一致。

Task的参数还可以是数组,举例:

13.3.1 static和automatic task

在module、interface、program、package里定义的task默认是static。

把task变成automatic有以下两种方式:

-声明时加上关键字automatic

-如果module、interface、program、package是automatic的,那里面定义的task也是automatic的

在class里定义的task总是automatic的。

可以在automatic task里声明一部分变量是static的,另外也可以在static task里声明一部分变量是automatic的。

13.3.2 task的内存使用和并发激活

Static task里面的变量是所有task实例共享的,而automatic task里面的变量对于不同task实例都是相互独立的。因此,automatic task里的变量在该task之外是不能调用的,它们的生命周期只存在于该task内部。

13.4 function

Function使用时有一些限制:

-function里面不能出现时间控制语句,包括:#、##、@、fork-join、fork-join_any、wait、wait_order、expect

-function里不能调用task

声明语法如下:

Function如果有返回值,默认是logic类型,function也可以没有返回值。

声明举例:

方向和task一样也有四种:

当没有指明方向时,默认方向是input。一旦一个参数指明了是某个方向,后面没有指明方向的参数的方向和这个参数的方向保持一致。

当没有指明数据类型时,默认数据类型是logic。一旦一个参数指明了是某个数据类型,后面没有指明数据类型的参数的数据类型和这个参数的数据类型保持一致。

function的参数还可以是数组。

在事件表达式、过程连续赋值表达式、非过程语句表达式中,不能调用带有output、inout、ref参数的function,但是可以调用带有const ref参数的function。

Function里也可以不写任何语句,此时返回的就是与函数同名的变量的值。

13.4.1 返回值和void function

Function隐式声明了一个变量,该变量与function的名字相同。Function的返回值可以通过两种形式返回,一种就是通过return语句返回,另一种就是通过将值赋给与函数同名的变量。举例:

Function的返回值可以是结构体或者union。

Function的返回值也可以是void,表示没有返回值。

如果function有返回值,但是表达式中不使用返回值,那么可以用void进行强制转换,如下:

13.4.2 static和automatic function

在module、interface、program、package里定义的function默认是static的,因此在所有function实例中这些function里的变量是共享的,里面的变量也是static的。

可以通过下面两种方式将function变成automatic的:

-在function声明时加上关键字automatic

-如果module、interface、program、package是automatic的,那么里面的function默认也是automatic的

在class里面定义的function总是automatic的。

Static function里面的变量默认是static的,但是也可以显式声明为automatic的,同理,automatic function里面的变量默认是automatic的,但是也可以显式声明为static的。

13.4.3 常量函数

常量函数有以下约束:

-常量函数不能有output、inout、ref参数

-void function不是常量函数

-DPI import函数不是常量函数

-常量函数在return语句后面不能包含事件调度语句

-常量函数不能有任何fork语句

-常量函数不能有hierarchical引用

-常量函数中调用的函数也必须是常量函数

-常量表达式中可以调用的系统function包括:$bits和数组查询系统函数,但是调用其他系统function是非法的

-常量函数中调用系统task将被忽略

-常量函数可以引用在package或者$unit里定义的参数

-如果常量函数里的形参受到defparam语句的影响,那么返回值是不确定的,这可能造成不可预期的后果

-generate块里不能声明常量函数

-常量函数的参数可以有默认值,但参数必须都是常量表达式

常量函数的调用发生在elaboration阶段。

13.4.4 函数调用产生的后台进程

因为function是无延迟的,所以调用function的进程是立即返回的。那么,在function里面可以出现的语句包括:非阻塞赋值、event触发、clocking驱动、fork join_none。

13.5 子程序调用和参数传递

子程序的调用可以通过位置或者名字传参,参数也可以设置默认值。

13.5.1 按值传递

按值传递的方式是调用子程序进行传参的默认方式。参数在子例程中会被复制,子例程中操作的对象也是复制后的对象,因此,如果在子例程中对参数进行了修改,不影响子例程外参数的值。考虑到内存问题,如果参数占用内存很大,建议将该参数声明为一个共享的参数,而不要通过传参的方式交给子例程处理,否则,复制操作会使得内存占用很大。

13.5.2 按引用传递

按引用传递指的是在参数声明时加上ref关键字,那么就不会进行复制操作,子例程里使用的参数就是子例程外声明的参数。Static的function或者task不允许出现ref传递参数。因此,子例程中如果修改了该参数,也会影响子例程外该参数的值。

按引用传递的参数只能是下面几种:

-变量

-class property

-unpacked结构体的成员

-unpacked数组的成员

Nets或者net的bit-select/part-select不允许出现在ref参数中。

如果想要ref 参数不被子例程修改,那么可以加上const关键字,此时该参数就会变成一个只读变量,强行修改参数的值会报编译错误,如下:

13.5.3 参数的默认值

格式如下:

调用子例程时,声明了默认值的参数可以不传递实参,但是没有声明默认值的参数必须传递实参。举例:

上面j/data都声明了默认值,那么调用时有以下几种情况:

13.5.4 按名字绑定参数

Sv支持按照位置或者名字绑定参数,举例:

如果在调用子例程时既使用了按位置绑定参数的方式,又使用了按名字绑定参数的方式,那么前者一定要放在后者前面,如下:

13.5.5 可选的参数列表

如果function不需要传参,那么()是可以省略的。

13.6 import function和export function

可以通过DPI的当时导入C语言里定义的函数,同样也可以导出sv的函数到C语言环境使用,参考第35章DPI的介绍。

13.7 task和function的名字

Task名字和function名字的解析具体见第23章。

13.8 参数化的task和function

参数化task和function要结合类的静态方法来实现。举例:

上面的例子中,参数化function的实现用到了参数类的参数DECODE_W,使得参数的传递位宽能够得到灵活的控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【直接原地起飞】3DMAX2025热门插件合集来啦!

强烈推荐8款3DMAX2025热门插件! 在3DMAX的广阔世界里,插件如同魔法工具,为设计师们打开了无限创意的大门。今天,我们精心挑选了8款热门插件,它们不仅功能强大,而且易于上手,定能让你的3D设计之旅…

Python从0到100(六十二):机器学习实战-预测波士顿房价

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

增强分析:新时代的数据洞察工具

随着数据科学和人工智能的迅猛发展,分析数据的方式也发生了显著的变化。增强分析(Augmented Analytics)是近年来涌现出的新概念,它将人工智能(AI)、机器学习(ML)和自然语言处理&…

操作系统 | 学习笔记 | 王道 | 4.2 目录

4.2 目录 4.2.1 目录的基本概念 文件目录指FCB的有序集合,一个FCB就是一个文件的目录项。与文件管理系统和文件集合相关联的是文件目录,它包含有关文件的属性、位置和所有权等。 目录管理的基本要求: 从用户的角度看,目录在用户…

win11下AMD CPU支持WSL2

除开常规的配置: 1.打开虚拟机 2.打开hyper-v 3.bios启用虚拟机 还需要做如下操作: 管理员方式进入Powershell: bcdedit /set hypervisorlaunchtype auto 成功案例: win11: cpu: amd

00_概览_kafka

kafka 概述kafka版本流程启动zk配置zk启动命令 启动kafka修改server.properties启动命令 kafka脚本-命令行操作命令行创建主题脚本查看主题主题详情修改主题删除主题大量日志解决方案 控制台生产者消费者代码 生产者 消费者kafka-toolkafka数据文件 扩展横向扩展纵向扩展分区消…

【小沐学GIS】QGIS导出OpenStreetMap数据(QuickOSM、OSM)

文章目录 1、简介1.1 OSM1.2 QuickOSM1.3 Overpass Turbo 2、插件安装3、插件使用3.1 快速查询(boundary边界)3.2 快速查询(railway铁路)3.3 快速查询(boundaryadmin_level行政边界)3.4 快速查询&#xff0…

OpenFeign-查询参数-日期格式化:LocalDate、Date、@DateTimeFormat(低版本无效)

创建时间:2024-10-08 本文适用的依赖版本: spring-boot-starter-parent:3.3.3 spring-cloud-starter-openfeign:4.1.3 一、场景 在 REST API 的查询接口中,日期查询参数 的格式一般是标准(ISO 8601&#x…

BiGRU-Transformer时间序列预测(多输入单预测)——基于Pytorch框架

1 介绍 本文将介绍一种基于Transformer和BiGRU(双向门控循环单元)的混合模型及其在时间序列预测中的应用。本模特适用于多输入单输出预测,适合风电预测,功率预测,负荷预测等等。 2 方法 首先,从Excel文件…

常见数据库等保测评检查命令汇总

MySQL数据库 select user, host FROM mysql.user;查看管理用户 show variables like validate%; 查看口令策略 show variables like %password%; 查看口令策略 show variables like %general%; 查看日志是否开启 show variables like general_log%; 可以看查询日…

电磁兼容(EMC):PCB设计里的镜像面究竟是个啥?

目录 1. 镜像面概念 2. 镜像面示意 3. 镜像面工作原理 4. 总结 PCB设计中涉及到高频信号处理时经常会听到一个叫做镜像面的概念。镜像面究竟是哪个面?和我们平时所说的地平面和电源平面有什么区别? 1. 镜像面概念 镜像面是指高频信号在完整平面上的…

退货单不能反价值重估的操作

财务的工作效率几何级式倍增。29号做的退货单,30号就做了发票。业务员工作质量却是堪忧,退货单做了2次。这样的问题是常态,该如何避免呢? 从提示文字分析,不能弃审, 一般是单据被下游单据锁定导致的&#…

算法 | 模拟

目录 替换所有的问号 题解: 提莫攻击 题解: Z字形变换 题解: 外观数列 题解: 数青蛙 题解: 替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode)https://leetcode.cn/problems/re…

AFSim仿真系统 --- 系统简解_03( Warlock模块 - 人在环路 在仿真领域中指的是AFSIM的操作员互动可视化应用程序)

我们就用保留单词 Warlock Warlock(在仿真领域中指的是AFSIM的操作员互动可视化应用程序--人在环路 ) Warlock是AFSIM的操作员环环相扣(Operator-in-the-Loop)视觉应用程序。它提供了一个图形环境,用于在运行时查看和…

【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL45

异步FIFO 描述 请根据题目中给出的双口RAM代码和接口描述,实现异步FIFO,要求FIFO位宽和深度参数化可配置。 电路的接口如下图所示。 双口RAM端口说明: 端口名 I/O 描述 wclk input 写数据时钟 wenc input 写使能 waddr input 写…

Qt程序国际化

目录 程序的国际化 第一步:生成ts文件 第二步:生成并加载qm文件 程序的国际化 第一步:生成ts文件 Ts文件格式上实际是xml,记录界面的字符和代码中tr包含的字符的具体位置(文件位置,行号列号等&#xff0…

QT 实现图片查看工具

QT 实现图片查看工具 1、选择图像文件 单文件选择 QFileDialog::getOpenFileName多文件选择 QFileDialog::getOpenFileNamesQList<QString> imageNames = QFileDialog::getOpenFileNames(this,tr("打开图片"),"",tr("图片文件 (*.png *.jpg *.b…

【STM32 Blue Pill编程实例】-OLED显示DHT22传感器数据

OLED显示DHT22传感器数据 文章目录 OLED显示DHT22传感器数据1、DHT22介绍2、硬件准备与接线3、模块配置3.1 定时器配置3.2 DHT22引脚配置3.3 OLED配置4、代码实现在本文中,我们将介绍如何将 DHT22 温度和湿度传感器与 STM32 Blue Pill 开发板连接,并使用 HAL 库在 STM32CubeI…

车载音频焦点(二)

目录 1 可延迟的音频焦点 2 多音频区焦点管理 3 HAL 音频焦点 4 OEM 车载音频焦点服务 1 可延迟的音频焦点 在 Android 11 中,AAOS 开始支持请求获得可延迟的音频焦点。 当非瞬态焦点请求 与 当前焦点持有者交互 遭到拒绝时,前者可以延迟。 一旦焦点的变化导致延迟的请…