Verilog HDL的任务和函数

Technorati 标签: , ,

任务和函数只能实现组合逻辑,而对时序逻辑无能为力。

一、任务

任务就是一段封装在“task…endtask”之间的程序。任务可以彼此调用,而且任务内还可以调用函数。

1、任务定义

形式如下:
task task_id;   // 任务名
    [declaration]   // 端口定义
    procedural_statement  // 任务的具体操作语句
endtask

一些注意事项:

a. 在任务定义结构中不能出现initial和always过程块。

b. 任务的输入、输出端口和双向端口数量不受限制,甚至可以没有输入、输出端口和双向端口。

2、任务调用

形式如下:

task_id[(端口1, 端口2, …, 端口n)];

一些注意事项:

a. 任务调用语句只能出现在过程块内;

b. 任务的输出端口必须和寄存器类型的数据变量对应;

二、函数

1、函数定义

形式如下:

function [range] function_id;

    input_declaration

    other_declarations

    procedural_statement

endfunction

其中[range]参数指定返回值的类型或位宽,默认是1比特数据。function_id为所定义函数的名称,对函数的调用也是通过函数名来完成的,而且它在函数结构体内代表一个内部变量,函数调用的返回值就是通过函数名变量传递给调用语句的

一些注意事项:

a. 函数定义只能在模块中完成,不能出现在过程块中;

b. 函数至少要有一个输入端口,但不能包含输出和双向端口;

c. 在函数结构中,不能使用任何形式的时间控制语句(#、wait等),也不能使用disable中止语句;

d. 函数定义结构体总不能出现过程块语句;

e. 函数内部可以调用函数,但不能调用过程。

2、函数调用

形式如下:

function_id(expr1, expr2, …, exprN);

一些注意事项:

a. 函数调用可以在过程块中完成,也可以在assign这样的连续赋值语句中出现;

b. 函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数。

3、任务和函数的区别

比较点任务函数
输入、输出可以有任意多个各种类型的参数至少有一个输入,不能有输出和双向端口
调用任务只能在过程语句中调用,而不能在连续赋值语句中调用函数可作为赋值操作的表达式,用于过程赋值和连续赋值语句
触发事件控制任务不能出现always语句;可以包含延时控制语句(#),但只能面向仿真,不能综合函数中不能出现(always、#)这样的语句,要保证函数的执行在零时间内完成
调用其他任务和函数可以调用其他任务和函数只能调用函数,不能调用任务
返回值没有返回值只有一个返回值
其他说明任务调用语句可以作为一条完整的语句出现函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值