




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、任务和函数,Verilog的任务及函数区别和联系,区别 任务(task) 通常用于调试,或对硬件进行行为描述 可以包含时序控制(#延迟,, wait) 可以有 input,output,和inout参数 可以调用其他任务或函数,函数(function) 通常用于计算,或描述组合逻辑 不能包含任何延迟;函数仿真时间为0 只含有input参数并由函数名返回一个结果 可以调用其他函数,但不能调用任务,共同点 任务和函数必须在module内调用 在任务和函数中不能声明wire 所有输入/输出都是局部寄存器 任务/函数执行完成后才返回结果。 例如,若任务/函数中有forever语句,则永远不会返回结果,
2、Verilog task 任务(task)”类似于其它编程语言中的“过程”。任务的使用包括任务定义和任务调用。任务既可表示组合逻辑又可表达时序逻辑,定义的形式如下 task ; begin . end endtask 任务可以没有或有一个或多个参数。值通过参数传入和传出 任务。除输入参数外(参数从任务中接收值),任务还能带 有输出参数(从任务中返回值)和输入输出参数。任务的定 义在模块说明部分中编写。,“局部变量说明”用来对任务内用到的局部变量进行宽度和类型说明,这个说明语句的语法与进行模块定义时的相应说明语句语法是一致的。 由“begin”和“end”关键词界定的一组行为语句指明了任务被调用
3、时需要进行的操作。在任务被调用时,这些行为语句将按串行方式得到执行。 任务定义与“过程块”、“连续赋值语句”及“函数定义”这三种成份以并列方式存在于行为描述模块中,它们在层次级别上是相同的。任务定义结构不能出现在任何一个过程块的内部。,任务的定义。 task read_mem; /任务定义结构的开头,指定任务名为“read_mem” input 15:0 address;/输入端口说明 output 31:0 data;/输出端口说明 reg 3:0 counter;/局部变量说明 reg7:0 temp 1:4;/局部变量说明 begin /语句块 ,指明任务被调用时需要进行的操作 for
4、(counter=1 ;counter=4;counter=counter+1) tempcounter=memaddress+counter-1; data=temp1,temp2,temp3,temp4; end endtask /任务定义结构的结尾,上例定义了一个名为“read_mem”的任务,该任务有一个16位的输入端口“address”、一个32位的输出端口“data”、一个4位的局部变量“counter”和一个8位的存储器“temp”。当上例所定义的任务被调用时,begin和end中间的语句得到执行,它们用来执行对存储器“mem”进行的四次读操作,将其结果合并后输出到端口“data
5、”。 在定义任务时必须注意如下几点: (1) 在第一行“task”语句中不能列出端口名列表。 (2) 在任务定义结构中的“行为语句”部分可以有延时语句、敏感事件控制语句等时间控制语句出现。 (3) 一个任务可以没有输入、输出和双向端口,也可以有一个或多个输入、输出和双向端口。 (4) 一个任务可以没有返回值,也可以通过输出端口或双向端口返回一个或多个返回值。 (5) 在一个任务中可以调用其它的任务或函数,也可以调用该任务本身。 (6) 在任务定义结构内不允许出现过程块(initial 或always过程块)。 (7) 在任务定义结构内可以出现“disable中止语句”,这条语句的执行将中断正在
6、执行的任务。当任务被中断后,程序流程将返回到调用任务的地方继续向下执行。,任务的调用 任务的调用是通过“任务调用语句”来实现的。任务调用语句的语法如下: ( 端口1,端口2,端口n ); 其中,“(端口1, 端口2, 端口n)”组成了一个端口名列表。 在调用任务时必须注意: (1) 任务调用语句只能出现在过程块内。 (2) 任务调用语句就像一条普通的行为语句那样得到处理。 (3) 当被调用的任务具有输入或输出端口时,任务调用语句必须包含端口名列表,这个列表内各个端口名出现的顺序和类型必须与任务定义结构中端口说明部分的端口顺序和类型相一致,注意只有寄存器类的变量才能与任务的输出端口相对应。,对任
7、务进行调用 module demo_task_invo; reg7:0 mem 128:0; reg15:0 a; reg31:0 b; initial begin a=0; read_mem(a,b); /第一次调用 #10; a=64; read_mem(a,b); /第二次调用 end endmodule,在上面的模块中,任务“read_mem”得到了两次调用,由于这个任务在定义时说明了输入端口和输出端口,所以任务调用语句内必须包含端口名列表“(a,b)”,其中变量a与任务的输入端口“address”相对应,变量b与任务的输出端口“data”相对应,并且这两个变量在宽度上也是与对应的端口
8、相一致的。这样,在任务被调用执行时,变量a的值通过输入端口传给了address;在任务调用完成后,输出信号data又通过对应的端口传给了变量b。,交通灯控制模块 module traffic_lights; reg clock, red, amber, green; parameter on=1, off=0, red_tics=350, amber_tics=30,green_tics=200; /交通灯初始化 initialred=off; initialamber=off; initialgreen=off; /交通灯控制时序 always begin red=on; /开红灯 ligh
9、t( red, red_tics); /调用等待任务 green=on; /开绿灯 light( green, green_tics); /等待 amber=on; /开黄灯 light( amber, amber_tics);/等待 end,交通灯开启时间的任务 task light; output color; input31:0 tics; begin repeat(tics) (posedge clock);/等待tics个时钟的上升沿 color=off;/关灯 end endtask /产生时钟脉冲的always块 always begin #100 clock=0; #100 c
10、lock=1; end endmodule,task总结 1.任务的定义与引用都在一个module模块内部 2.任务的定义与module的定义有些类似,同样 需要进行端口说明与数据类型说明。另外,任 务定义的内部没有过程块,但在块语句中可以 包含定时控制部分。 3.当任务被引用时,任务被激活。 4.一个任务可以调用别的任务或函数。,Verilog function 函数(function)类似于其它编程语言中的函数概念。与任务一 样,Verilog HDL语言中的函数使用包括了函数的定义和函数 的调用。 1. 函数的定义 函数定义的语法如下: function ; begin end endf
11、unction,返回值类型可以有三种形式: (1) “msb:lsb”:这种形式说明函数名所代表的返回数据变量是一个多位的寄存器变量,它的位数由msb:lsb指定,比如如下函数定义语句: function 7:0 adder; 就定义了一个函数“adder”,它的函数名“adder”还代表着一个8位宽的寄存器变量,其最高位为第7位,最低位为第0位。 (2) “integer”:这种形式说明函数名代表的返回变量是一个整数型变量。 (3) “real”:这种形式说明函数名代表的返回变量是一个实数型变量。,函数的主要特性: 函数定义中不能包含任何时序控制语句。 函数至少有一个输入,不能包含任何输出或
12、双向端口。 函数只返回一个数据,其缺省为reg类型。 传送到函数的参数顺序和函数输入参数的说明顺序相同。 函数在模块(module)内部定义。 函数不能调用任务,但任务可以调用函数。 虽然函数只返回单个值,但返回的值可以直接给信号连接赋值。这在需要有多个输出时非常有效。 如: o1, o2, o3, o4 = f_ or_ and (a, b, c, d, e);,函数定义 function 7:0 getbyte ; /函数定义结构的开头,注意此行中不能出现端口名列表 input 63:0 word; /说明第一个输入端口(输入端口1) input 3:0 bytenum; /说明第二个输入
13、端口(输入端口2) integer bit; /局部变量说明 reg 7:0 temp; /局部变量说明 begin for (bit=0; bit=7; bit=bit+1) tempbit=word (bytenum-1)*8)+bit ; /第一条行为语句 getbyte = temp; /第二条行为语句:将结果赋值给函数名变量getbyte end endfunction / 函数定义结束,函数定义时必须注意: (1) 与任务一样,函数定义结构只能出现在模块中,而不能出现在过程块内。 (2) 函数至少必须有一个输入端口。 (3) 函数不能有任何类型的输出端口(output端口)和双向端
14、口 (inout端口)。 (4) 在函数定义结构中的行为语句部分内不能出现任何类型的时间控制描述,也不允许使用disable终止语句。 (5) 与任务定义一样,函数定义结构内部不能出现过程块。 (6) 在一个函数内可以对其它函数进行调用,但是函数不能调用其它任务。 (7) 在第一行“function”语句中不能出现端口名列表。,函数的调用 函数调用的格式如下: (, ); 其中,m个“”与函数定义结构中说明的各个输入端口一一对应,它们代表着各个输入端口的输入数据。这些输入表达式的排列顺序及类型必须与各个输入端口在函数定义结构中的排列顺序及类型保持严格一致。,在调用函数时必须注意如下两点: (1
15、) 函数的调用不能单独作为一条语句出现,它只能作为一个操作数出现在调用语句内。 例如,下面这条语句对前面所定义的函数“getbyte”进行了调用: out = getbyte( input1,number); 在这条调用语句中,函数调用部分“getbyte( input1,number)”被看作是一个操作数,这个操作数的取值就是函数调用的返回值。在整个调用语句中,函数调用部分是作为“赋值表达式”出现在整条过程赋值语句中的,函数调用部分不能单独地作为一条语句出现,这就是说语句“getbyte(input1,number);”是非法的。 (2) 函数调用既能出现在过程块中,也能出现在assign连
16、续赋值语句中。比如语句:wire7:0 net1;reg 63:0 input1; assign net1= getbyte( input1,3 ); 中的函数调用就出现在一条连续赋值语句内,这条语句指定由函数调用返回值对8位连线型变量net1进行连续驱动。,函数的调用 module demo_function_call; reg7:0 call_output; reg63:0 input1; reg3:0 input2; initial begin input1=64h123456789abcdef0; input2=3; call_output=getbyte(input1,input2)
17、; /第一次调用 $display(after the first call,the returned value is : %b,call_output ); #100; $display(“second call,return value: %b ”,getbyte(input1,6) ); /第二次调用 end endmodule,上例模块中的initial过程块对函数“getbyte”进行了两次调用: 函数getbyte的第一次调用是作为过程赋值语句“call_output=getbyte(input1,input2);”右端的赋值表达式出现的,调用时的输入表达式分别为两个寄存器变量i
18、nput1和input2,它们将与函数定义结构中的第一个和第二个输入端口相对应,因此这两个寄存器变量的取值将分别被传递给函数输入端口“word”和“bytenum”。函数调用完成后,过程赋值语句中的“getbyte”将具有函数调用的返回值,这个返回值将作为“赋值表达式”参与对变量call_output进行的过程赋值操作。,阶乘运算函数 module funct(clk, n, result, reset); output31:0 result; input3:0 n; input reset, clk; reg31:0 result; always (posedge clk) /在clk 的上
19、升沿时执行运算 begin if(!reset) result=0; /复位 else result = 2 * factorial(n); /调用factorial 函数 end function31:0 factorial; /阶乘运算函数定义(注意无端口列表) input3:0 opa; /函数只能定义输入端,输出端口为函数名本身 reg3:0 i; begin factorial = 1; for(i= 2; i = opa; i = i+1) /该句若要综合通过,opa 应赋具体的数值 factorial = i* factorial; /阶乘运算 end endfunction e
20、ndmodule,对于子程序,如果满足下述所有条件则可以用函数来完成: 1.在子程序中不含有延迟时序或者控制结构 2.子程序只有一个返回值 3.至少有一个输入变量 4.没有输出或者双向变量 5.不含有非阻塞赋值语句 函数归纳 1. 函数定义不能包含任何定时控制语句。即任何用、或wait来标识的语句 2. 函数必须至少有一个输入,但绝不能含有任何输出和总线口; 3. 一个函数只能返回一个值,该值的变量名与函数同名,数据类型默认为reg类型。 4. 传递给函数的变量顺序与函数输入口声明的顺序相同。 5. 函数定义必须包含在模块定义之内。 6. 函数不能调用任务,但任务可以调用函数。 7. 函数使Verilog有更广阔的适用范围。,问题 函数与任务的共同点: 1.任务和函数必须在模块内定义,其作用范围仅适用于该模块,可以在模块内多次调用。 2.任务和函数中可以声明
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年吉林省乾安七中物理高二第二学期期末统考试题含解析
- 贵州省凤冈县第二中学2025届物理高一第二学期期末综合测试试题含解析
- 黑龙江省林口林业局中学2025年物理高一第二学期期末统考试题含解析
- 2025届福建省漳州市第八中学高一物理第二学期期末经典试题含解析
- 农贸市场管理课件
- 二零二五年被褥原材供应链合同
- 2025版标前协议书-道路桥梁工程
- 二零二五年度安全设施设备维护保养合同范本
- 2025版车辆交易市场管理合同
- 二零二五年HSE安全管理体系审核合同
- 基础2000词汇-英语
- New包装结构设计基础知识课件
- 新员工三级安全教育课件(公司级)
- 陕西省商洛市各县区乡镇行政村村庄村名居民村民委员会明细
- 化学品定点测厚施工方案
- 广西南宁市青秀区总工会招考聘用聘用人员(必考题)模拟卷及答案
- 术中压力性损伤风险评估量表解读
- 预制装配式综合管廊
- 剑桥少儿英语一级下册Unit2PPT课件
- ASMEB16.5标准法兰尺寸表
- GB∕T 21437.2-2021 道路车辆 电气电子部件对传导和耦合引起的电骚扰试验方法 第2部分:沿电源线的电瞬态传导发射和抗扰性
评论
0/150
提交评论