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

这篇具有很好参考价值的文章主要介绍了Verilog基础:task和function的使用(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相关文章

Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html


目录

4.function的声明和调用

4.1 function的声明

4.2 function的返回值

4.3 function的调用

4.4 function的规则

4.5 常数函数


4.function的声明和调用

        function的用途就是返回一个值,然后把他用在表达式中(即作为操作数使用)。

4.1 function的声明

        function的声明的语法如下:

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

        function声明的说明:

        1、第一种是Verilog-1995的语法,输入参数和函数内项目都在function_identifier;后面声明。

        2、第二种是Verilog-2001的语法,输入参数在function_identifier();括号内部声明,而函数内项目在function_identifier();后面声明,这是ANSI-C风格的声明。

        3、函数内项目包括各种类型的变量(reg[signed]、integer、time、real、realtime)、事件声明、本地参数声明和参数声明。

        4、没有使用automatic的function是静态的(Static),所有在function中声明的输入参数和函数内项目都是静态分配内存的,对于所有并发执行的同一个function,他们是共享的。

        5、使用automatic的function是动态的,可重入的,仿真器为每个并发执行的function动态地分配内存。

        6、function_range_or_type用于声明返回值的类型,它是可选的。如果没有说明,那么默认返回1位标量;如果说明,则返回值的类型可以是:[range][signed]、integer、time、realtime、real。

        7、function应至少有一个input参数。

4.2 function的返回值

        在定义function时,同时在function内部隐含地声明了一个和function名字一样的变量。他默认是1位的reg,或是用function_range_or_type指定的。当function返回时,就把这个变量返回。

4.3 function的调用

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

        函数调用被当做表达式中的操作数使用。函数调用时,输入参数的计算顺序是不定的。

4.4 function的规则

        与task相比,function有许多限制,下面是function的使用规则。

        1、function的定义不能包含任何时序控制的语句,即不能包含#、@和wait。因为function的参数输入,计算、返回都是在一个time-step完成的。

        2、function不能使能task,因为task中可能含有时序控制。

        3、function至少包含一个input参数。

        4、function不能包含任何output和inout参数。

        5、function中不能使用非阻塞赋值(<=),不能使用过程连续赋值。

        6、function内不能触发命名事件。

4.5 常数函数

        常数函数是Verilog-2001标准新加的,用于在elaboration时计算复杂的的值。常数函数要求综合和仿真工具在编译时就计算出函数的返回值。

        常数函数对IP开发非常重要,目的是允许设计人员为一个模块添加local parameters,这些local parameters是在模块实例化时传递的参数得来的。

        让我们考虑一个简单的RAM模型,为了使这个模型参数化,我们需要地址的宽度、存储的深度和数据的宽度。数据的宽度必须传递给模型,但对于地址的宽度和存储的深度,就只需要传递一个即可。如果传递地址的宽度,那么存储的深度可以通过常数函数计算出来;如果传递存储的深度,则地址的宽度可以通过常数函数计算出来。

        为了让工具厂商更加接受常数函数,Verilog标准化组织(Verilog Standard Group,VSG)在常数函数上加了明显的约束,而在常规函数上就没有这些约束。常数函数是常规函数的子集,具有以下的要求。

        1、常数函数不能包含层次引用。

        2、常数函数在调用模块内定义,且参数是常数。

        3、常数函数能调用参数为常数表达式的系统函数,而不能调用其他系统函数。

        4、常数函数将忽略系统任务。

        5、任何常数函数会使用到的parameters都要提前定义。

        6、常数函数使用的parameters不能直接或间接被defparam影响。        

        7、不能在generate块中声明常数函数。文章来源地址https://www.toymoban.com/news/detail-476498.html

到了这里,关于Verilog基础:task和function的使用(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Verilog HDL系统任务说明语句task

    task说明语句 如果传给任务的变量和任务完成后接受任务的变量已定义,就可以用一条语句启动任务,任务完成以后控制传回启动的过程。 1.1任务的定义 定义任务的语法如下: 1.2任务的调用及变量的传递 任务调用: 1.3例子 用两种不同的方法设计一个功能相同的模块,完成

    2024年02月03日
    浏览(32)
  • Unity C# 之 Task、async和 await 、Thread 基础使用的Task的简单整理

    目录 Unity C# 之 Task、async和 await 、Thread 基础使用的Task的简单整理 一、Task、async和 await 、Thread 基础概念 1、线程,多线程 2、Task  3、async (await ) 二、Task 的基础使用,Task 的创建 和 启动 1、创建并运行一个Task 2、创建有返回值的 Task 3、Task提供了 task.RunSynchronously()用于同步

    2024年02月12日
    浏览(34)
  • C#学习相关系列之多线程(七)---Task的相关属性用法

    任务是 架构在线程之上 的,任务最终的执行还是要给到线程去执行的。 任务和线程之间不是一对一的关系,任务更像线程池,任务相比线程池有很小的开销和精确的控制。 (总的来说Task的用法更为先进,在多线程的时候应该优先考虑Task) 1. status 当前状态类属性(较多)  C

    2024年02月06日
    浏览(27)
  • Verilog教程系列文章导航

            学习FPGA,最重要的是要先掌握开发语言Verilog。         这10篇文章来自网站 FPGA Tutorial ,都是一些综合、总结型的文章。         ⚡第1篇:Verilog Tutorial(1)如何编写一个基本的 Verilog Module(模块)         ⚡第2篇:Verilog Tutorial(2)数据类型和数组简介

    2024年02月06日
    浏览(40)
  • (增加细粒度资源管理)深入理解flink的task slot相关概念

    之前对flink的task slot的理解太浅了,重新捋一下相关知识点 我们知道,flink中每个TaskManager都是一个 JVM 进程,可以在单独的线程中执行一个或多个 subtask(线程)。 但是TaskManager 的计算资源是有限的,并不是所有任务都可以放在同一个 TaskManager 上并行执行。并行的任务越多

    2024年03月11日
    浏览(34)
  • Verilog基础:避免混合使用阻塞和非阻塞赋值

    相关阅读 Verilog基础 https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482         “避免在一个always块中混杂阻塞赋值和非阻塞赋值”,这条原则是著名的Verilog专家Cliff Cummings在论文SUNG2000中提出的,这个观点在公众讨论时受到了广泛的质疑。有人认为可以在时钟

    2024年02月05日
    浏览(32)
  • 【0基础学会Verilog】004. 学会使用Vivado自带仿真器

    编写好实现指定功能的Verilog模块后,需要对其进行仿真来验证 模块 的正确性,这需要用到EDA开发工具的仿真器,我们选择Xilinx公司的Vivado自带的仿真工具进行仿真。 在前面的章节已经学习了为Verilog模块编写基本的测试模块,即testbench的基本步骤和方法。本文不再赘述,直

    2024年02月04日
    浏览(33)
  • Unity C# 之 使用 HttpWebRequest 基础知识/HttpWebRequest 进行异步Post 网络访问/数据流形式获取数据(Task/async/await)的代码简单实现

    目录 Unity C# 之 使用 HttpWebRequest 基础知识/HttpWebRequest 进行异步Post 网络访问/数据流形式获取数据(Task/async/await)的代码简单实现 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、关键代码 附录 : HttpWebRequest 的一些基础知识 1、HttpWebRequest 常用属性 2、HttpWebRequest 

    2024年02月05日
    浏览(48)
  • ESLint 中的“ space-before-function-paren ”相关报错及其解决方案

    在 VScode 中,在使用带有 ESLint 工具的项目中,保存会发现报错,并且修改好代码格式后,保存会发现代码格式依然出现问题: “ space-before-function-paren ” 英文 翻译为 中文 为“函数参数前的意外空格” 报这个错误的原因是 函数名称 或 function 与开始参数之间缺少空格

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包