目录

1.function/task

1.1 function函数

1.2 task任务及和function的不同点


1.function/task

function和task基本用法一致,但是有几个不同点,在后面阐述。

1.1 function函数

verilog中的函数必须有返回值并且必须被使用,且函数不能调用任务,sv中允许函数调用任务,前提是调用的任务不消耗时间:

仿真结果:

SV中的function函数和C语言中的用法非常相似;

其可以在参数列表中指定输入参数input、引用参数ref(类似于C语言中的指针)(可输入/出),但不可指定输出参数output、输入输出参数inout

可以返回数值或者不返回数值(void),如果调用具有返回值的函数,但没有使用该返回值,应添加void‘()进行转换:void'(some_function());

program example;int A;initial begin$display(“double of %0d is %0d”, 10, double1(10));//20print();//test functiondouble2(10,A);$display(“double of %0d is %0d”, 5, A);//10endfunction int double1(input int a);//SV中不指明输入输出默认是输入;不指明类型,默认是logic类型return 2*a;endfunctionfunction void print();//如果该function不返回值,则声明void,()内可不写形参,函数中也可不写return$display("test function");endfunctionfunction int double2(input int a,output int b);//不可用output返回A=2*a;endfunctionendprogram

仿真结果:

需要强调的是,若function( )中的形参是是input而不是ref类型,则function内部产生的行为不会对外部产生影响:

program example1;int x=3,y=5;initial begin$display("In main,互换前:x=%0d,y=%0d",x,y);swap(x,y);$display("In main,互换后:x=%0d,y=%0d",x,y);endfunction swap(input int x,input int y);int temp;$display("In funtion,互换前:x=%0d,y=%0d",x,y);temp=x;x=y;y=temp;$display("In function,互换后:x=%0d,y=%0d",x,y);endfunction
endprogram

仿真结果如下:

可见在函数内部x,y互换,但由于函数在运行时将实参单向传递给形参,因此函数内部的结果并不会影响外部。

如果将input改成ref类型:

program example2;int x=3,y=5;initial begin$display("In main,互换前:x=%0d,y=%0d",x,y);swap(x,y);$display("In main,互换后:x=%0d,y=%0d",x,y);endfunction swap(ref int x,ref int y);int temp;$display("In funtion,互换前:x=%0d,y=%0d",x,y);temp=x;x=y;y=temp;$display("In function,互换后:x=%0d,y=%0d",x,y);endfunction
endprogram

仿真结果如下:

可见由于ref相当于指针的作用,函数直接作用于x,y的内存,因此修改的外部的值。

1.1.1从函数中返回数组

方式一:

该方法利用函数init返回一个数组的方法,将该数组拷贝到f5中,若数组容量大,可能会导致运行缓慢

方式二:

该方法利用ref方式直接将f5改变,可以提高性能

1.2 task任务及和function的不同点

任务和函数的用法基本一致,但其相比于函数要更加灵活,有以下不同点:

  1. function可以通过return返回结果;而task无法通过return返回结果,因此只能通过output、inout或者ref的参数来返回
  2. task内可以置入耗时语句,而function则不能。常见的耗时语句包括@event、 wait event、# delay等
  3. function和task均可调用function;而task只可被task调用,而不可被function调用(如果task里有耗时语句)
  4. function如果不用return返回值则要声明void,如果用return返回值则需要声明返回什么类型的值;而task并不用声明返回什么类型的值

task mytask1 (output logic [31:0] x, input logic y);
...
endtask

SV学习笔记—function函数和task任务相关推荐

  1. Python学习笔记:函数(Function)

    Python学习笔记:函数(Function) 一.函数基本概念 函数是Python里组织与重用代码最重要的方法.一般来说,如果你期望多次重复相同或相似的代码,写一个可重用的函数可能是值得的.函数通过 ...

  2. php中声明一个函数,php学习笔记之 函数声明

    /* 函数定义: * 1.函数是一个被命名的 * 2.独立的代码段 * 3.函数执行特定任务 * 4.并可以给调用它的程序返回一个值 * * 函数的优点: * 1.提高程序的重用性 * 2.提高程序的 ...

  3. MySQL学习笔记—自定义函数

    MySQL学习笔记-自定义函数 注释语法: MySQL服务器支持3种注释风格: 从'#'字符从行尾. 从'– '序列到行尾.请注意'– '(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如 ...

  4. 《JavaScript语言精粹》学习笔记(函数(2))

    <JavaScript语言精粹>学习笔记(函数(2)) 函数(Functions) 参数(Arguments) 当参数被调用时,会得到一个"免费"的参数数组argume ...

  5. SV学习笔记—类型转换

    1.静态转换 静态转换操作不对转换值进行检查,格式是type'(value): program test;initial begin$display("int'(42+1.1) is&quo ...

  6. SV学习笔记—结构体及枚举类型及字符串

    目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...

  7. matlab 调用子函数返回值,matlab学习笔记13_1 函数返回值

    一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 函数返回一个值 返回值不必使用return语句,而是直接将需要返回的变 ...

  8. Python学习笔记12_函数

    Python学习笔记12_函数 文章目录 Python学习笔记12_函数 1.函数定义 2.函数调用 3.函数的参数 3.1.可更改对象和不可更改对象参数 3.2.必需参数(位置参数) 3.3.关键字 ...

  9. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

最新文章

  1. Deepin系统安装
  2. todo文件说明已停止工作_番茄ToDo,一款颜值功能兼备的番茄钟。
  3. Java与C#平台通信 WCF CXF SOAP
  4. LeetCode_2_两数相加
  5. python - hash类型操作
  6. ATEN—第九章OSPF多区域的配置
  7. Git 克隆远程项目到本地_01
  8. 计算机知识探索怎么写,计算机基础知识及探索.doc
  9. Linux 下查看线程信息
  10. 纪念我2014.1.4 中国银行广东分行面试
  11. uni-app 获取手机状态栏高度
  12. 模拟多线程给多用户发送短信
  13. 软件供应链安全现状分析与对策建议
  14. 科学计算机功能键介绍ndf,DNF:非常实用的五个小技巧,你不会还不知道吧!-dnf快捷键设置...
  15. N个元素中选最大最小
  16. 互联网企业安全建设之路:互联网企业为什么要做安全?
  17. pyside2安装后打开designer.exe文件提示丢失 MSVCP140.dll的处理方法
  18. CS0533隐藏继承的抽条成员/CS0534不实现继承的抽象成员
  19. GSI计算机,DAT或者GSI水准数据用科傻(COSA)软件平差
  20. Linux进阶_PAM认证机制

热门文章

  1. 老鱼Python数据分析——篇十八:消息推送(二)
  2. 用友nc软件被locked1勒索病毒攻击,解密恢复oracle数据库与用友nchome的配置文件
  3. 有容乃大--Java 集合
  4. 微信网页版协议的java封装
  5. 三、C++ 链接器 linker
  6. 设计模式之:解剖观察者模式【z】
  7. 与heater讨论旧信
  8. python接口自动化pdf悠悠_python接口自动化13-data和json参数傻傻分不清【悠悠】
  9. py语法基础008_for循环
  10. 求六个成等差数列且小于500的素数