请问怎么才可以下载到nature文献免费下载的APP

verilog中的function与task的区别&&转载
verilog中的function与task的区别&&
13:25:24|&&分类:|&&标签:|字号大中小&订阅
一个复杂的testbench是非常冗长且复杂的。解决这种复杂性的一种途径是将代码分割由一些小的段落组合而成。verilog中的function和task可以帮助我们完成复杂代码段的分割。function包含输入声明并返回一个值(一般为reg类型或者integer类型),当被调用时,函数立即执行因此在函数中不可以有时间控制结构。相比而言,task结构更加的灵活,该结构可以包含有输入,输出以及双向端口的声明同时可以包含有时间控制结构。可以通过输出和双向端口返回多个值。
二者主要有以下四个不同点:
①、函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位;
②、函数不能启动任务,任务可以启动其他任务或者函数;
③、函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量;
④、函数返回一个值,而任务则不返回值。
二者的声明格式如下:
function [result_type] [func_id]
([input_arg]);&&&&&&&&&
//result-type specifies the data type of the returned result,
usually is reg with range or integer
[statements]
endfunciton&
task [task_id] ([arg]);&//arg is similar to the
port declaration of a module except that the default data type is
reg and the wire data cannot be used
[statements];
Examples :
module eq2_task
input wire [1:0]a,b,
&&& output
always @ *
&& equ_tsk (2, a[0], b[0],
&& equ_tsk (2, a[1],
& &aeqb = e0 &
task equ_tsk
input integer delay,
input i0, i1,
output eq1
#delay eq1 = (i0 & i1) | (~i0 &
module eq2_function(
input wire [1:0]a,b,
&&& output
always @ *
&& #2 e0 = equ_func ( a[0],
&& #2 e1 = equ_func ( a[1],
& &aeqb = e0 &
function (reg)&equ_func(input i0 ,i1)
&&&&&equ_func
= (i0 & i1) | (~i0 &
endfunction
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Verilog HDL硬件描述语言:task和function说明语句的区别
> Verilog HDL硬件描述语言:task和function说明语句的区别
Verilog HDL硬件描述语言:task和function说明语句的区别
和说明语句的区别本文引用地址:和说明语句分别用来定义任务和函数。利用任务和函数可以把一个很大的程序模块分解成许多较小的任务和函数便于理解和调试。输入、输出和总线信号的值可以传入或传出任务和函数。任务和函数往往是大的程序模块中在不同地点多次用到的相同的程序段。学会使用和语句可以简化程序的结构,使程序明白易懂,是编写大型模块的基本功。任务和函数有些不同,主要的不同有以下4点。(1)函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。(2)函数不能启动任务,而任务能启动其他任务和函数。(3)函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。(4)函数返回一个值,而任务则不返回值。函数的目的是通过返回一个值来响应输入信号的值。任务却能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出。
模块使用函数时是把它当作表达式中的操作符,这个操作的结果值就是这个函数的返回值。下面让我们用例子来说明。例如,定义一任务或函数对一个16位的字进行操作让高字节与低字节互换,把它变为另一个字(假定这个任务或函数名为:switch_bytes)。任务返回的新字是通过输出端口的变量,16位字的字节互换任务的调用源码如下:switch_bytes(old_word,new_word);任务switch_bytes把输入old_word的字的高、低字节互换放入new_word端口输出。而函数返回的新字是通过函数本身的返回值,16位字的字节互换函数的调用源码如下:new_word = switch_bytes(old_word);
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一1.task的说明
task的定义: task&任务名&;
&&&&&&&&&&&&&&&&&&& &端口及数据类型声明语句&
&&&&&&&&&&&&&&&&&& &语句1&
&&&&&&&&&&&&&&&&&& &语句2&
&&&&&&&&&&&&&&&&&&&&.....
&&&&&&&&&&&&&&&&& &语句n&
&&&&&&&&&&&&&&&&&&endtask
&&&&&&task 的调用及变量的传递
&&&&&&&&& &任务名&(端口1,端口2,...端口);
&& task可以启动其他的task,其他的task又可以启动别的task,可以启动的task是没有限制的,只有当所有的task都完成之后,控制才能返回。任务可以没有或者有多个输入输出类型的变量。
2.function说明
function的定义:&& function&返回值的类型或者范围&(函数名);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &端口说明语句&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &变量类型说明语句&
&&&&&&&&&&&&&&&&&&&&&&&&&&& && & begin
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & &语句&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & ....
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& end
&&&&&&&&&&&&&&&&&&&&&&&& & endfunction
&&&&&& &返回值的类型或者范围&为可选项,默认则返回值为一位寄存器类型数据。function的定义声明了与函数同名的、内部寄存器。函数的定义把返回值所赋值寄存器的名称初始化为与函数同名的内部变量。
&&& eg.&&& function [7:0]
&&&&&&&&&&& input [15:0]
&&&&&&&&&&&&&& &begin
&&&&&&&&&&&&&&&& &....
&&&&&&&&&&&&&&&&& &getbyte = result_
&&&&&&&&&&&&&&& end
&&&&&&&&&&& endfunction
&&&&function的调用:& word =& getbyte(lsbyte);
&& 注意:函数的定义不能包含有任何时间控制语句,即任何的#、@、wait表示的语句。函数不能启动task,定义函数时至少要有一个输入参量。在函数的定义中必须有一条赋值语句,给函数中的一个内部变量赋以函数的结果值,该内部变量具有和函数名相同的名字。
旗下网站:
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号SV中的task和function
时间: 12:47:20
&&&& 阅读:830
&&&& 评论:
&&&& 收藏:0
标签:SV中的Task和Function不需要,必须加一个begin..end来指明body。
&&&&&&&&&&&&&&&& task&&&&muliple_
&&&&&&&&&&&&&&&&&&&&&&&&&& ......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 =&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&thread2:& begin&&&&&&&&&&//使用ref类型传递data,这样不需
&&&&&&&&&&&&&&&&&&&&& @(posedge bus.enable)& data = bus.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& @&&&&//要等到bus_read进程结束,
&&&&&&&&&&&&&&&&&&&&& .......&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$ //thread2便可以看见data的变化
&&&&&&&&endtask:bus_read&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&end
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& join标签:
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!}

我要回帖

更多关于 nature论文下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信