📜  Verilog任务

📅  最后修改于: 2021-01-11 14:50:33             🧑  作者: Mango

Verilog任务

函数旨在对输入进行一些处理并返回单个值。相反,任务比较笼统,可以计算多个结果值,并使用outputinout类型参数返回它们。

任务可以包含耗时的模拟元素,例如@,posege和其他元素。任务在所有编程语言(通常称为过程或子例程)中使用。

数据传递到任务,完成处理,并返回结果。必须使用数据输入和输出来专门调用它们,而不仅仅是将其连接到常规网表中。

它们包含在代码主体中,可以多次调用,从而减少了代码重复。

  • 任务在使用它们的模块中定义。可以在单独的文件中定义任务,并使用已编译的指令(包括文件中的任务)来实例化任务。
  • 任务可以包括定时延迟,例如posege,negedge,#delaywait
  • 任务可以具有任意数量的输入和输出。
  • 在任务中声明的变量是该任务的局部变量。任务中的声明顺序定义了如何使用调用者传递给任务的变量。
  • 当不使用局部变量时,任务可以获取,驱动和提供全局变量。使用局部变量时,仅在任务执行结束时才分配输出。
  • 任务可以调用另一个任务或函数。
  • 任务可用于对组合逻辑和顺序逻辑进行建模。

必须使用语句专门调用任务。它不能作为函数使用在表达式中。

句法

任务以关键字task开始,以关键字endtask结尾。输入和输出在关键字task之后声明。

局部变量在输入和输出声明之后声明。

// Style 1

task [name];
    input  [port_list];
    inout  [port_list];
    output [port_list];
    begin
        [statements]
    end
endtask


// Style 2

task [name] (input [port_list], inout [port_list], output [port_list]);
    begin
        [statements]
    end
endtask

关键字自动将使任务重入。否则,默认情况下它将是静态的。如果任务是静态的,则其所有成员变量将在同时启动的同一任务的不同调用之间共享。

注意:层次结构引用不能访问自动任务项目。

调用任务

如果任务不需要任何参数,则可以避免使用参数列表。如果任务需要参数,则可以在其调用的同一语句中提供它们。

//Style 1
task sum (input [7:0] a, b, output [7:0] c);
        begin
            c = a + b;
        end
    endtask

// Style 2
    task sum;
        input  [7:0] a, b;
        output [7:0] c;
        begin
            c = a + b;
        end
    endtask
           initial begin
        reg [7:0] x, y , z;
        sum (x, y, z);
    end

启用任务的参数(x,y,z)对应于任务定义的参数(a,b,c)。

由于ab是输入,因此xy的值将分别放在ab中。因为c被声明为输出并在调用期间与z连接,所以总和将自动从c传递到变量z

全局任务

在所有模块外部声明的任务称为全局任务,因为它们具有全局作用域,并且可以在任何模块内调用。

// This task is outside all modules
task display();
  $display("Hello");
endtask
module des;
  initial begin
    display();
  end
endmodule

执行以上代码后,将产生以下输出。

xcelium> run
Hello 
xmsim: *W,RNQUIE: Simulation is complete.

功能与任务之间的区别

Function Task
It cannot have time-controlling statements/delay and hence executes in the same simulation time unit. It can contain time-controlling statements/delay and may only complete at some other time.
It cannot enable a task. It can enable other tasks and functions.
The function should have atleast one input argument and cannot have output or inout arguments. Tasks can have zero or more arguments of any type.
A function can return only a single value. It cannot return a value but can achieve the same effect using output arguments.