Verilog笔记:function和task

发布时间 2023-06-03 16:16:31作者: 赛博土豆

一、格式/用法

function的一般格式为:

function <返回值的范围> (名字)

    <端口说明语句>

    <变量类型说明语句>

        begin

        ……

        end

endfunction

例如:

function [7:0]     data_rx ;   
  input [7:0] data_in;  
  integer i;   for(i=0; i<range; i++)   begin ...   end endfunction

task的一般格式为:

task <任务名> (<端口及数据类型说明语句>)

  <语句1>

  <语句2>

  ...

endtask

例如:

task tx_bit(
        input [7:0] data
        );
        integer i;
        for (i=0; i<10; i=i+1)
            case (i)
                ...
            endcase
endtask

二、二者区别(面试或笔试可能会有)

网上搜集的,大概总结了四点,有区别但是大体意思差不多

  1. 任务能调用函数,但函数不能调用任务。
  2. 任务可以描述组合逻辑和时序逻辑,定义结构中可以有延时语句;函数的定义不能包含有任何的时间控制语句,即任何用#、@、或wait来标识的语句。函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。
  3. 任务可以有多个类型的输入;函数只能有input端口的输入参数,且至少输入一个参数。
  4. 任务可以没有返回值;函数必须有一个返回值。

图片来自知乎用户@罗成,详细内容可以去Verilog语法之十一:任务(task)和函数(function) - 知乎 (zhihu.com)

任务通常用于调试或对硬件进行行为描述,可支持多种目的,而函数通常用于计算、描述组合逻辑,目的是通过返回一个值来相应输入信号的值。

 三、杂七杂八

在调用函数时,需要注意以下几点:

  • 函数调用可以在过程块中完成,也可以在assign 这样的连续赋值语句中出现。
  • 函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数

在调用任务时,需要注意以下几点:

  • 任务调用语句只能出现在过程块内;
  • 任务调用语句和一条普通的行为描述语句的处理方法一致;
  • 当被调用输入、输出或双向端口时,任务调用语句必须包含端口名列表,且信号端口顺序和类型必须和任务定义结构中的顺序和类型一致。需要说明的是,任务的输出端口必须和寄存器类型的数据变量对应。
  • 可综合任务只能实现组合逻辑,也就是说调用可综合任务的时间为“0” 。而在面向仿真的任务中可以带有时序控制,如时延,因此面向仿真的任务的调用时间不为“0“。

还有几点:

  • 在第一行“task”语句中不能列出端口名称;
  • 在任务定义的描述语句中,可以使用出现不可综合操作符合语句(使用最为频繁的就是延迟控制语句) ,但这样会造成该任务不可综合
  • 在任务定义中可以出现“disable 中止语句” ,将中断正在执行的任务,但其是不可综合的。当任务被中断后,程序流程将返回到调用任务的地方继续向下执行。