verilog 任务和函数.ppt_第1页
verilog 任务和函数.ppt_第2页
verilog 任务和函数.ppt_第3页
verilog 任务和函数.ppt_第4页
verilog 任务和函数.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务和函数 Verilog的任务及函数区别和联系 区别任务 task 通常用于调试 或对硬件进行行为描述可以包含时序控制 延迟 wait 可以有input output 和inout参数可以调用其他任务或函数 函数 function 通常用于计算 或描述组合逻辑不能包含任何延迟 函数仿真时间为0只含有input参数并由函数名返回一个结果可以调用其他函数 但不能调用任务 共同点任务和函数必须在module内调用在任务和函数中不能声明wire所有输入 输出都是局部寄存器任务 函数执行完成后才返回结果 例如 若任务 函数中有forever语句 则永远不会返回结果 Verilogtask任务 task 类似于其它编程语言中的 过程 任务的使用包括任务定义和任务调用 任务既可表示组合逻辑又可表达时序逻辑 定义的形式如下task begin endendtask任务可以没有或有一个或多个参数 值通过参数传入和传出任务 除输入参数外 参数从任务中接收值 任务还能带有输出参数 从任务中返回值 和输入输出参数 任务的定义在模块说明部分中编写 局部变量说明 用来对任务内用到的局部变量进行宽度和类型说明 这个说明语句的语法与进行模块定义时的相应说明语句语法是一致的 由 begin 和 end 关键词界定的一组行为语句指明了任务被调用时需要进行的操作 在任务被调用时 这些行为语句将按串行方式得到执行 任务定义与 过程块 连续赋值语句 及 函数定义 这三种成份以并列方式存在于行为描述模块中 它们在层次级别上是相同的 任务定义结构不能出现在任何一个过程块的内部 任务的定义 taskread mem 任务定义结构的开头 指定任务名为 read mem input 15 0 address 输入端口说明output 31 0 data 输出端口说明reg 3 0 counter 局部变量说明reg 7 0 temp 1 4 局部变量说明begin 语句块 指明任务被调用时需要进行的操作for counter 1 counter 4 counter counter 1 temp counter mem address counter 1 data temp 1 temp 2 temp 3 temp 4 endendtask 任务定义结构的结尾 上例定义了一个名为 read mem 的任务 该任务有一个16位的输入端口 address 一个32位的输出端口 data 一个4位的局部变量 counter 和一个8位的存储器 temp 当上例所定义的任务被调用时 begin和end中间的语句得到执行 它们用来执行对存储器 mem 进行的四次读操作 将其结果合并后输出到端口 data 在定义任务时必须注意如下几点 1 在第一行 task 语句中不能列出端口名列表 2 在任务定义结构中的 行为语句 部分可以有延时语句 敏感事件控制语句等时间控制语句出现 3 一个任务可以没有输入 输出和双向端口 也可以有一个或多个输入 输出和双向端口 4 一个任务可以没有返回值 也可以通过输出端口或双向端口返回一个或多个返回值 5 在一个任务中可以调用其它的任务或函数 也可以调用该任务本身 6 在任务定义结构内不允许出现过程块 initial或always过程块 7 在任务定义结构内可以出现 disable中止语句 这条语句的执行将中断正在执行的任务 当任务被中断后 程序流程将返回到调用任务的地方继续向下执行 任务的调用任务的调用是通过 任务调用语句 来实现的 任务调用语句的语法如下 端口1 端口2 端口n 其中 端口1 端口2 端口n 组成了一个端口名列表 在调用任务时必须注意 1 任务调用语句只能出现在过程块内 2 任务调用语句就像一条普通的行为语句那样得到处理 3 当被调用的任务具有输入或输出端口时 任务调用语句必须包含端口名列表 这个列表内各个端口名出现的顺序和类型必须与任务定义结构中端口说明部分的端口顺序和类型相一致 注意只有寄存器类的变量才能与任务的输出端口相对应 对任务进行调用moduledemo task invo reg 7 0 mem 128 0 reg 15 0 a reg 31 0 b initialbegina 0 read mem a b 第一次调用 10 a 64 read mem a b 第二次调用endendmodule 在上面的模块中 任务 read mem 得到了两次调用 由于这个任务在定义时说明了输入端口和输出端口 所以任务调用语句内必须包含端口名列表 a b 其中变量a与任务的输入端口 address 相对应 变量b与任务的输出端口 data 相对应 并且这两个变量在宽度上也是与对应的端口相一致的 这样 在任务被调用执行时 变量a的值通过输入端口传给了address 在任务调用完成后 输出信号data又通过对应的端口传给了变量b 交通灯控制模块moduletraffic lights regclock red amber green parameteron 1 off 0 red tics 350 amber tics 30 green tics 200 交通灯初始化initialred off initialamber off initialgreen off 交通灯控制时序alwaysbeginred on 开红灯light red red tics 调用等待任务green on 开绿灯light green green tics 等待amber on 开黄灯light amber amber tics 等待end 交通灯开启时间的任务tasklight outputcolor input 31 0 tics beginrepeat tics posedgeclock 等待tics个时钟的上升沿color off 关灯endendtask 产生时钟脉冲的always块alwaysbegin 100clock 0 100clock 1 endendmodule task总结1 任务的定义与引用都在一个module模块内部2 任务的定义与module的定义有些类似 同样需要进行端口说明与数据类型说明 另外 任务定义的内部没有过程块 但在块语句中可以包含定时控制部分 3 当任务被引用时 任务被激活 4 一个任务可以调用别的任务或函数 返回值类型可以有三种形式 1 msb lsb 这种形式说明函数名所代表的返回数据变量是一个多位的寄存器变量 它的位数由 msb lsb 指定 比如如下函数定义语句 function 7 0 adder 就定义了一个函数 adder 它的函数名 adder 还代表着一个8位宽的寄存器变量 其最高位为第7位 最低位为第0位 2 integer 这种形式说明函数名代表的返回变量是一个整数型变量 3 real 这种形式说明函数名代表的返回变量是一个实数型变量 函数的主要特性 函数定义中不能包含任何时序控制语句 函数至少有一个输入 不能包含任何输出或双向端口 函数只返回一个数据 其缺省为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 说明第二个输入端口 输入端口2 integerbit 局部变量说明reg 7 0 temp 局部变量说明beginfor bit 0 bit 7 bit bit 1 temp bit word bytenum 1 8 bit 第一条行为语句getbyte temp 第二条行为语句 将结果赋值给函数名变量getbyteendendfunction 函数定义结束 函数定义时必须注意 1 与任务一样 函数定义结构只能出现在模块中 而不能出现在过程块内 2 函数至少必须有一个输入端口 3 函数不能有任何类型的输出端口 output端口 和双向端口 inout端口 4 在函数定义结构中的行为语句部分内不能出现任何类型的时间控制描述 也不允许使用disable终止语句 5 与任务定义一样 函数定义结构内部不能出现过程块 6 在一个函数内可以对其它函数进行调用 但是函数不能调用其它任务 7 在第一行 function 语句中不能出现端口名列表 函数的调用函数调用的格式如下 其中 m个 与函数定义结构中说明的各个输入端口一一对应 它们代表着各个输入端口的输入数据 这些输入表达式的排列顺序及类型必须与各个输入端口在函数定义结构中的排列顺序及类型保持严格一致 在调用函数时必须注意如下两点 1 函数的调用不能单独作为一条语句出现 它只能作为一个操作数出现在调用语句内 例如 下面这条语句对前面所定义的函数 getbyte 进行了调用 out getbyte input1 number 在这条调用语句中 函数调用部分 getbyte input1 number 被看作是一个操作数 这个操作数的取值就是函数调用的返回值 在整个调用语句中 函数调用部分是作为 赋值表达式 出现在整条过程赋值语句中的 函数调用部分不能单独地作为一条语句出现 这就是说语句 getbyte input1 number 是非法的 2 函数调用既能出现在过程块中 也能出现在assign连续赋值语句中 比如语句 wire 7 0 net1 reg 63 0 input1 assignnet1 getbyte input1 3 中的函数调用就出现在一条连续赋值语句内 这条语句指定由函数调用返回值对8位连线型变量net1进行连续驱动 函数的调用moduledemo function call reg 7 0 call output reg 63 0 input1 reg 3 0 input2 initialbegininput1 64 h123456789abcdef0 input2 3 call output getbyte input1 input2 第一次调用 display afterthefirstcall thereturnedvalueis b call output 100 display secondcall returnvalue b getbyte input1 6 第二次调用endendmodule 上例模块中的initial过程块对函数 getbyte 进行了两次调用 函数getbyte的第一次调用是作为过程赋值语句 call output getbyte input1 input2 右端的赋值表达式出现的 调用时的输入表达式分别为两个寄存器变量input1和input2 它们将与函数定义结构中的第一个和第二个输入端口相对应 因此这两个寄存器变量的取值将分别被传递给函数输入端口 word 和 bytenum 函数调用完成后 过程赋值语句中的 getbyte 将具有函数调用的返回值 这个返回值将作为 赋值表达式 参与对变量call output进行的过程赋值操作 阶乘运算函数modulefunct clk n result reset output 31 0 result input 3 0 n inputreset clk reg 31 0 result always posedgeclk 在clk的上升沿时执行运算beginif reset result 0 复位elseresult 2 factorial n 调用factorial函数endfunction 31 0 factorial 阶乘运算函数定义 注意无端口列表 input 3 0 opa 函数只能定义输入端 输出端口为函数名本身reg 3 0 i beginfactorial 1 for i 2 i opa i i 1 该句若要综合通过 opa应赋具体的数值factorial i factorial 阶乘运算endendfunctionendmodule 对于子程序 如果满足下述所有条件则可以用函数来完成 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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论