SV中的task和function

SV中的Task和Function不需要,必须加一个begin..end来指明body。

task    muliple_line;

......body...

endtask :multiple_line

子程序在执行到子程序的最后一行就返回,将返回值赋给与函数同名的变量,也可以显式的调用return来返回。

SV中module和program的子程序默认是静态存储的,当需要动态存储时,仍然需要显式的用automatic显式指出。(class中默认是automatic的)

子程序中的参数缺省值是logic  input。verilog对子程序参数的处理是,在进入子程序时,将input和inout的值赋值给子程序本地变量,在子程序返回时将output和

inout的值赋值给模块中的变量。SV中增加了一种方式ref,指定为引用而不是复制。这种方式只能用在automatic的子程序中,这种参数的好处是在子程序中

修改变量对调用它的模块随时可见。

task  bus_read(input  logic [31:0] addr,  ref logic [31:0]data);                initial     fork

bus.request = 1‘b1;                                                                               bus_read(addr,data);

@(posedge bus.grant)  bus.addr =addr;                                                  thread2:  begin          //使用ref类型传递data,这样不需

@(posedge bus.enable)  data = bus.data;                                                                 @data;    //要等到bus_read进程结束,

.......                                                                                                                      $display; //thread2便可以看见data的变化

endtask:bus_read                                                                                                             end

join

时间: 2024-11-05 12:15:25

SV中的task和function的相关文章

Verilog HDL中task与function的区别

任务.函数的定义和调用都包括在一个module的内部,他们一般用于行为级建模,在编写Testbench时用的较多,而在写可综合的代码时要少用. function的定义: function<返回值类型和位宽> <函数名> <入口参量和类型声明> <局部变量声明> 行为语句: endfunction 定义function时,要注意以下几点: (1):  function定义结构不能出现在任意一个过程块(always块或者initial块)的内部: (2):  f

SV中的OOP

OOP:Object-Oriented Programming,有两点个人认为适合验证环境的搭建:1)Property(变量)和Method(function/task)的封装,其实是BFM模型更方便的应 用.2)继承(Inheritance)与合成(Composition)非常适合一个架构的搭建. 在SV中,类可以定义在program, module, package中,但是一般一个类或几个相关的类会单独写在一个文件中.最终在program中调用.而且在SV中,所有成员 默认都是public类

SV中的线程

SV中线程之间的通信可以让验证组件之间更好的传递transaction. SV对verilog建模方式的扩展:1) fork.....join 必须等到块内的所有线程都执行结束后,才能继续执行块后的语句.(所以使用的很少) 2) fork.....join_none 先执行块后的线程,而后再执行块内的线程.不会产生块后的线程必须等块内线程的情形. 3) fork.....join_any 只要块内的线程有一个执行结束,就执行块之后的线程. 需要说明一下,begin.....end之间的顺序操作,

RTL基本知识:task和function

在使用Verilog进行设计的过程中,使用task和function在同一个module中多次调用,充分提高了代码的复用性,有效增强设计的可维护性和复用性,可以避免不同模块间代码复制导致的不必要的错误.本文主要探讨task和function的使用以及两者之间的异同点. 1    task 定义不能出现在过程性语句快中,但是必须在"module-end"结构中. 格式一: 格式二: task可以没有或者有一个或多个参数,值通过参数传入和传出task.输入输出在任务开始处声明,且输入与输出

vivado对task和function的可综合支持

手册UG901,对vivado可综合的语句支持进行了描述,HDL包括:verilog-2001,system-verilog,VHDL: verilog-2001扩展了对task和function的支持. ug901手册中,章节7对支持的语法进行详细描述. 1 Filename: functions_1.v 2 // 3 // An example of a function in Verilog 4 // 5 // File: functions_1.v 6 // 7 module funct

Linux中的task,process, thread 简介

本文的主要目的是介绍在Linux内核中,task,process, thread这3个名字之间的区别和联系.并且和WINDOWS中的相应观念进行比较.如果你已经很清楚了,那么就不用往下看了. LINUX版本:2.6.18ARCH: X86 首先要明确的是,按照LKD 2里面的说法,LINUX和其他OS 比如WINDOWS, SOLARIS之间一个很大的不同是没有严格定义的线程(thread).那么你也许会问,如果LINUX中没有线程,那么如何来表示类似WINDOWS 线程的那种执行观念呢?答案是

无法解析的外部符号 _ ,该符号在函数 &quot; __main中被引用 &amp;&amp; This function or variable may be unsafe.

加上winsock2的运行库看看吧,一般不用加的啊 #pragma comment(lib,"Ws2_32.lib") 应该就没有问题了吧^_^ 以下为转载 http://blog.chinaunix.net/uid-20672257-id-2955771.html 1.将过去的工程用VS2010打开的时候.你有可能会遇到一大堆的警告:warning C4996. 比如:warning C4996: 'sprintf': This function or variable may be

jquery中的$(document).ready(function(){})和$(window).load()比较

1.执行时间 window.onload()即jquery写法中的$(window).load(function(){})必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同 window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个(最后一个)$(document).ready()可以同时编写多个,并且都可以得到执行 3.简化写法 window.on

PHP中Call to undefined function mb_substr()处理方法!

最近开发微信扩展功能,用到了mb_substr()函数.系统在windows下测试都是正常的,但是放到aliyun(选用的Centos系统)下面就出现了问题,Call to undefined function mb_substr(),报出这个异常. 很显然,这是调用了没有定义的函数,可是环境都采用yum安装的,Apache和PHP都是自动安装的.怎么会出现这个错误呢?其实PHP本身也是可配置的,安装时候除了必须的扩展库会自动安装上之外,其他的库默认是不会安装的. 解决办法: yum insta