当前位置: 首页 > article >正文

Verilog基础:task和function的使用(一)

相关文章Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html一、前言任务(task)和函数(function)即提供了从不同位置执行公共过程的能力因为这样可以实现代码共享也提供了把大过程分解成小过程的能力因为小过程更便于阅读和调试。下面将介绍task和funtion之间的不同点介绍如何定义和调用task和function。注意函数和任务都是可以综合的但是有诸多的要求和限制所以要谨慎使用。二、简述task和function的不同下面列出了task和function之间的不同点。语句限制function不能包含时序控制语句如#延迟、事件、wait语句只能在一个仿真时间点进行而task可以包含时序控制语句因此从task开始执行到结束可能需要一段时间。互相调用function不能调用task这很好理解因为task可能包含时序控制语句而task可以调用function。参数传递function至少要有一个input类型的参数而不能有output和inout类型的参数通过返回值传递输出而不是输出端口而task既可以没有任何参数就像testbench一样也可以有各种类型的参数。调用限制function调用相当于一个右值就像C语言里面的函数一样task调用只能作为语句使用。功能限制function只能对输入值返回一个结果值而task可以支持各种用途可以计算并返回多个结果值。对于task只有使用output和inout才能把结果值传递回来。function可以在表达式中当做操作数使用操作数的值就是function的返回值。三、 task的声明和使能task的使能就是调用但是在标准中对task使用的是enable对function使用的是call就是从一条可包含输入和输出的调用语句控制从调用的过程转到task。当task完成时控制再返回调用的过程所以如果task包含时序控制的语句那么调用task的时间和退出task的时间可能不同。task可以再使能调用其他task没有数量的限制。1、task的声明task声明的语法如下Verilog-1995Verilog-2001task声明的说明1. 第一种是Verilog-1995的语法传递的参数在task_identifier;后面依次声明。2. 第二种是Verilog-2001的语法传递的参数还可以在task_identifier();的括号内部定义这是ANSI-C的风格。3. 可以在task内的所有语句之前声明各种类型的变量reg、integer、time、real、realtime需要注意的是变量类型是块级的所以不能像非块级变量那样赋初值。parameter、local parameter以及event也是支持的声明的。4. Verilog-2001新增了task的automatic特性没有automatic的task是静态的所有task声明的参数和变量都是静态分配存储空间仿真器对所有并发执行的同一个task共享这些参数和变量。5. 使用automatic的task是可重入的(Reentrant)仿真器对每个并发执行的task动态分配存储空间即每个task拥有属于自己独有的一套变量但在automatic task结束时这些变量会被销毁。2、task的使能和参数传递task的使能就是把括号内以逗号分隔的表达式列表作为实际参数传递给task语法如下注意其中使用的是层次task名这意味着在定义一个task的模块外也是可以调用该task的只要它能够在使用处利用层次名引用到详见该文Verilog基础标识符的层次名引用一。task使能的规则如下1. 如果task没有参数那么使能时可以使用task_identifier();或者task_identifier;2. 如果task有参数那么表达式实参的个数要与task定义的参数对应不能出现未连接的端口module可以出现未连接的端口。3. 表达式列表中表达式的计算顺序是不定的。4. 如果task的形参是input类型那么对应的表达式实参可以是任何表达式。5. 如果task的形参是output类型那么对应的表达式实参要符合过程赋值LHS的规则这与module不一样module的output端口只能连接外部的线网型信号。6. 执行task是使能语句时对应表达式的值实参被传入到input和inout形参中只在执行时传入一次这和module输入端口的连接不一样。7. 从task返回时output和inout形参的值会被自动传回对应表达式实参中只在返回时传回一次这和module输出端口的连接不一样。8. 所有的参数按值传递而不是按引用传递。即task内对输入形参的操作不会影响输入实参。9. task语句没有返回值因此相当于一个语句而不是可被当作操作数的右值如下所示。module test; reg a; task test_task(); $display(This is a task); endtask initial a test_task; // 错误 initial test_task; // 正确 endmodule例子task定义上图以两种方式定义了task下面的表达式使能task。task使能语句的实参v,w,x,y,z对应task形参a,b,c,d,e在task被使能的时刻input和inout类型的形参ab和c分别接受实参vwx传递的值就好像执行了以下的赋值语句。实际上task的输入输出端口默认都是reg类型这和module不同module的输入端口默认也只能是wire类型module的输出端口可以被定义为reg类型或wire类型。在task执行的过程中task计算并改变形参cde的值在task结束时将cde的值赋值给实参xyz就好像执行了以下的赋值语句。例子使用task描述信号灯3、task的内存使用和并发进程可重入任务(Reentrance task)对验证工程师非常重要因为这些工程师需要多次并发地调用同一个task。但是很多人并不知道Verilog-1995的任务使用静态变量这就意味着在第一次任务调用还在运行的时候对这个任务再做第二次调用那么这两次任务调用使用的是同样的一组静态变量这会给testbench带来严重的问题。Verilog-2001对task和function作了扩充增加了一个可选的属性automatic每次在task或function调用时局部变量要用的存储空间才被分配这样就可以实现task和function的重入。重入就是在一个task或function执行期间可以再次调用这个task或function。下面是关于static task和automatic task之间的对比。1. 对于static task它的所有参数和变量都是静态的不管并发地使能task多少次。所谓静态是指对于模块的每个实例仿真器只在初始时为static task声明的参数个变量分配一次存储空间然后就一直使用在执行时不再分配。注意对于模块的不同实例每个static task还是使用自己独立的存储空间。2. static task中声明的变量包括input、output和inout参数会保持最后一次使用时候的值因为是reg类型。3. 对于automatic task 当每次并发地使能它时仿真器会为它的所有参数和变量分配新的存储空 间。因为automatic task声明的参数和变量在task完成时要释放所以task完成后就不能再使用他们。4. automatic task中声明的变量和参数包括input、output和inout参数在仿真开始时的时候被初始化为默认值(x)而input和inout在使能时被初始化为表达式列表传进来的值。对于static task和static function它们的参数和变量具有静态的生命时间就是这些变量只是在开始的时候分配一次然后就一直使用它。这就导致这些参数和变量始终保持最后一次使用时的值。但是综合工具不这么看综合工具认为task和function不会依赖这些参数和变量以前的值认为每次调用的时候都要重新初始化这些参数和变量。这就有可能导致仿真和综合不一致。所以为了得到一致的结果为了每次都重新分配这些参数和变量我们应该使用automatic。图源IEEE Verilog-2001 Standard

相关文章:

Verilog基础:task和function的使用(一)

相关文章 Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html 一、前言 任务(task)和函数(function)即提供了从不同位置执行公共过程的能力(因为这样可以实现代码共享),也提供了把大过程分解成小过程的能力&…...

从演示到实战:基于快马平台构建一个功能完整的AI绘画社区应用

今天想和大家分享一个很有意思的实战项目 - 在InsCode(快马)平台上构建一个功能完整的AI绘画社区应用。这个想法来源于阿里悟空官网展示的AI绘画应用场景,但我们要做的是更贴近真实产品的综合性解决方案。 项目整体规划 首先需要明确,一个完整的AI绘画社…...

新手零门槛部署openclaw:快马ai生成手把手配置教程与验证代码

最近在尝试部署openclaw这个开源爬虫框架时,发现网上资料比较零散,对新手不太友好。经过一番摸索,我总结了一套适合零基础同学的部署方案,整个过程在InsCode(快马)平台上测试通过,特别适合想快速上手的朋友。 硬件和系…...

手机怎么把deepseek对话导出

手机端 DeepSeek 对话怎么导出?原生功能缺口与三方工具全景对比摘要:根据 QuestMobile 2025年数据,DeepSeek 日活用户于2月1日突破3000万,成为史上最快达成该里程碑的应用。用户量激增后,“对话如何导出”"记录怎…...

从“只会聊天“到“全能员工“:2026年你需要了解的AI黑话(收藏版:小白程序员必备)

AI不再是一个聊天框。它已经进化成你的数字化同事。而你需要学会和它相处的"行话"。 引言:你的AI同事已经到岗还记得2023年人们第一次用ChatGPT的时候吗?大家的反应是:"哇,AI能写诗和画画!"然后就…...

【CW32无线抄表项目】W25Q+CW32程序示例

资料下载: https://telesky.yuque.com/bdys8w/01/zr02y6vd0r7mnzcl?singleDoc# 参考仓库: https://gitee.com/Armink/SFUD 一、程序分析 硬件总线映射(引脚与时钟的“避坑点”) #define FLASH_SPIx CW_SPI2 // 注意&…...

告别慢查询:用快马ai智能生成postgresql性能优化与索引方案

告别慢查询:用快马AI智能生成PostgreSQL性能优化与索引方案 在电商系统中,订单查询是最常见的操作之一。随着业务量的增长,数据库查询性能往往会成为瓶颈。最近我在优化一个电商平台的订单查询模块时,发现几个典型的性能问题&…...

SELinux 导致 K8s 日志 logrotate 无法轮询压缩

1. 问题现象在某 Linux 环境中,Kubernetes 日志无法自动轮询、无法压缩归档,具体表现如下:/var/log/kubernetes/kubelet.log 持续增大,达到 90MB 不再切割日志压缩包停留在某一时间点,之后不再生成新归档系统日志&…...

收藏必备!小白程序员轻松入门大模型,带你理清AI核心概念全框架

AI浪潮已经刮了一年多,身边越来越多人聊AI,张口就是“agent”“skill”,听得人只能点头附和,似懂非懂?其实不是听不懂,而是没有把这些概念串起来,告诉你它们到底是什么、彼此有啥关系。 咱不聊复…...

ObsPy地震学工具箱:从数据采集到科学发现的完整Python解决方案

ObsPy地震学工具箱:从数据采集到科学发现的完整Python解决方案 【免费下载链接】obspy ObsPy: A Python Toolbox for seismology/seismological observatories. 项目地址: https://gitcode.com/gh_mirrors/ob/obspy ObsPy是地震学领域的Python工具箱&#xf…...

React Native Boilerplate组件库终极指南:AssetByVariant与IconByVariant高级用法

React Native Boilerplate组件库终极指南:AssetByVariant与IconByVariant高级用法 【免费下载链接】react-native-boilerplate A React Native template for building solid applications 🐙, using JavaScript 💛 or Typescript &#x1f49…...

革命性终端网站构建工具LiveTerm:5分钟打造个性化网页终端

革命性终端网站构建工具LiveTerm:5分钟打造个性化网页终端 【免费下载链接】LiveTerm 💻 Build terminal styled websites in minutes! 项目地址: https://gitcode.com/gh_mirrors/li/LiveTerm LiveTerm是一款革命性的终端网站构建工具&#xff0…...

WireGuard排除私网地址聚类表(掩码形式)

事情缘由: 玩过WireGuard的都知道,它的配置文件是如下形式的: [Interface] PrivateKey *********************** Address **********/32 DNS 8.8.8.8 MTU1420 [Peer] PublicKey ************************ Endpoint 8.8.8.8:12345 A…...

绿联 安装SeaTable在线协同表格

绿联 安装SeaTable在线协同表格 1、镜像 seatable/seatable-developer:latest 2、安装 2.1、基础设置 重启策略:容器退出时总是重启容器。 2.2、网络 网络选择桥接(bridge)。 2.3、存储空间 装载路径/shared不可变更。 2.4、端口设置 容器端口固定80&#x…...

Pi0机器人控制实战:从模型下载到Web演示完整流程

Pi0机器人控制实战:从模型下载到Web演示完整流程 1. 项目概述与核心价值 Pi0是一个创新的视觉-语言-动作流模型,专为通用机器人控制设计。这个开源项目将深度学习与机器人技术相结合,通过自然语言指令和视觉输入来生成精确的机器人动作。项…...

DeepSeek架构深度解析:从原理到实践的完整指南

一、引言 2025年1月,DeepSeek-R1的发布在全球AI领域引发巨大震动——一个开源模型以远低于主流闭源模型的训练成本,实现了与之相匹敌的推理性能,直接导致英伟达股价单日下跌17%。在随后的时间里,DeepSeek团队持续迭代&#xff0c…...

数字记忆守护者:GetQzonehistory全攻略

数字记忆守护者:GetQzonehistory全攻略 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 一、数字记忆危机:我们正在失去什么? 在这个信息爆炸的时代&…...

nfs-subdir-external-provisioner核心配置参数详解:onDelete、archiveOnDelete、pathPattern

nfs-subdir-external-provisioner核心配置参数详解:onDelete、archiveOnDelete、pathPattern 【免费下载链接】nfs-subdir-external-provisioner Dynamic sub-dir volume provisioner on a remote NFS server. 项目地址: https://gitcode.com/gh_mirrors/nf/nfs-s…...

OpenClaw+Phi-3-vision-128k-instruct数据标注:半自动生成图像标签训练集

OpenClawPhi-3-vision-128k-instruct数据标注:半自动生成图像标签训练集 1. 为什么需要半自动数据标注 去年我在做一个宠物品种识别项目时,最头疼的就是数据标注环节。手动给5000多张猫狗图片打标签,不仅耗时耗力,还容易因为疲劳…...

Git-Credential-Manager-for-Windows安全存储机制深度解析:如何保护你的Git凭证安全 [特殊字符]

Git-Credential-Manager-for-Windows安全存储机制深度解析:如何保护你的Git凭证安全 🔐 【免费下载链接】Git-Credential-Manager-for-Windows Secure Git credential storage for Windows with support for Visual Studio Team Services, GitHub, and B…...

WebGLStudio.js虚拟文件系统完全指南:如何高效管理3D资源

WebGLStudio.js虚拟文件系统完全指南:如何高效管理3D资源 【免费下载链接】webglstudio.js A full open source 3D graphics editor in the browser, with scene editor, coding pad, graph editor, virtual file system, and many features more. 项目地址: http…...

文字的编码方式————不同UTF之间的区别

目录 1. 编码与字体 A. ASCII(American Standard Code for Information Interchange) B. ANSI C. UNICODE 2 . UNICODE 编码实现 (1)UTF-16 a. UTF-16 LE b. UTF-16 BE (2)UTF-8 (3&#xff…...

Protocol

在Python的世界里,Protocol这个概念,其实挺有意思的。它不是那种一上来就让人眼前一亮的语法糖,也不是什么解决具体问题的现成工具。它更像是一种约定,一种让代码“说清楚自己”的方式。如果你写过一段时间Python,尤其…...

TypeVar

## 关于Python里的TypeVar,你可能想知道的 最近在整理一些旧代码,翻到几年前写的一个通用缓存工具类,里面用到了TypeVar。当时注释里只简单写了一句“用于类型提示”,现在回头看,觉得可以展开聊聊这个东西。 TypeVar是…...

如何用Venera打造个性化漫画阅读体验?

如何用Venera打造个性化漫画阅读体验? 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 你是否曾经感到市面上的漫画阅读应用千篇一律,界面设计缺乏个性?或者希望在深夜阅读时,应…...

全方位解析GBFR Logs:《碧蓝幻想:Relink》战斗数据分析平台

全方位解析GBFR Logs:《碧蓝幻想:Relink》战斗数据分析平台 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors/gb/gbf…...

性能测试中的“假阳性”:如何识别与避免?

在软件性能测试领域,“假阳性”是一个令测试团队既头疼又难以回避的挑战。它指的是测试报告或监控工具错误地发出性能警报,声称系统存在性能瓶颈或缺陷,但经过深入分析或在实际环境中验证,发现系统运行状态良好,并不存…...

Node.js企业级应用部署与运维完整方案:Google Cloud Platform实战指南

Node.js企业级应用部署与运维完整方案:Google Cloud Platform实战指南 【免费下载链接】nodejs-docs-samples Node.js samples for Google Cloud Platform products. 项目地址: https://gitcode.com/gh_mirrors/no/nodejs-docs-samples 想要构建稳定可靠的No…...

hello-uniapp自定义组件开发:打造属于你的UniApp组件库

hello-uniapp自定义组件开发:打造属于你的UniApp组件库 【免费下载链接】hello-uniapp uni-app框架演示示例 项目地址: https://gitcode.com/gh_mirrors/he/hello-uniapp UniApp作为一款优秀的跨平台开发框架,让开发者能够使用Vue.js语法编写一次…...

3个维度解析PhpWebStudy新版本:打造更稳定安全的本地开发环境

3个维度解析PhpWebStudy新版本:打造更稳定安全的本地开发环境 【免费下载链接】PhpWebStudy Lightweight Native Local Dev Toolbox for Windows, macOS & Linux. Run OpenClaw/n8n/Apache/Nginx/Caddy/Tomcat/PHP/Node.js/Bun/Deno/Python/Java/Go/Ruby/Perl/R…...