1. task(任务)与func tion(函数)的不同 任务与函数主要有以下四点不同: l 函数只能与主模块共用一个 仿真时间单位,而任务定义自己的仿真时间单位。 l 函数不能启动任务,任务可以启动其他任务和函数。 l 函数至少要有一个输入变量,而任务可以没有或有多任何类型的变量。 l 函数返回一个值,而任务不返回值。
2. task语句说明 l 任务的定义 定义任务的语法如下: task<任务名> <端口及数据类型声明语句> <语句1> <语句2> ………… <语句n> endtask
l 任务的调用及变量的传递 任务的调用: <任务名>(端口1,端口2,…..,端口n); 下面举例子说明怎么定义任务与调用任务: 任务定义: task my_task; input a,b; output c; <语句> …. endtask 任务调用:my_task(v,w,x); 任务调用变量(v,w,x)和任务定义的I/O变量(a,b,c)之间是一一对应的,当任务启动时,由v和w传入的变量赋给了a和b,而当任务完成之后的输出又通过c赋给x,下面举一个具体程序来介绍,代码如下: 测试代码如下:
仿真波形图如下:
当start信号变成高电平的时候,即当state状态由0跳变到1时,调用load任务,把data_in的值寄存在save_data的同时状态机状态跳转到2,当状态跳转到2的时候,调用shift任务,把save_data的值往左移一位的同时状态机状态跳转到3,当状态跳转到3的时候,调用out任务,把save_data的值往data_out赋值的同时状态机状态跳转到0,仿真的波形跟设计的完全一样。
3. function说明语句 l 定义函数的语法: function<返回值的类型或范围>(函数名); <端口说明语句> <变量类型说明语句> begin <语句> ……… end endfunction 注意:<返回值的类型或范围>这一项是可选项,如缺省则返回值位一位寄存器类型数据
l 举例说明 下面举一个实际程序的例子,来说明一下function函数的实际定义与如何调用。代码如下:
测试代码如下: 仿真波形如下:
当start信号变成高电平的时候,即当state状态有0跳变到1时,调用load_data(data_in)函数,把data_in的值寄存在save_data的同时状态机状态跳转到2,当状态跳转到2的时候,调用shift(save_data)函数,把save_data的值往左移一位的同时状态机状态跳转到3,当状态跳转到3的时候,调用load_data(save_data)函数,把save_data的值往data_out赋值的同时状态机状态跳转到0,仿真的波形跟设计的完全一样。 |