Verilog|Verilog task 任务


文章目录

        • 语法
        • 静态task的定义
        • 静态调用示例
        • automatic示例
        • 全局task
        • task和function的区别
        • 禁止任务

语法 【Verilog|Verilog task 任务】function可以对输入数据进行处理,并返回一个值,而task更通用,可以计算出多个值,可以使用output或inout参数类型,task可以包含仿真时间控制,例如@,posedge等。
// 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// Empty port list task [name] (); begin [statements] end endtask

Verilog中的Function函数和C中的函数非常类似,它可以根据你的输入,返回计算的结果,函数的实现只能是组合逻辑,不能包括时间控制,例如#100,可以指定返回值的类型,应该包含至少1个输入,输入只能是input类型,不能是inout或output,只能返回一个值。
当task/function定义为automatic,其变量也是隐式automatic的。 因此,在多次调用task/function时,变量每次都会分配内存并不会覆盖。
静态task的定义 如果task是静态定义的,成员变量将会在不同调用之间共享。
task sum (input [7:0] a, b, output [7:0] c); begin c = a + b; end endtask // or task sum; input[7:0] a, b; output [7:0] c; begin c = a + b; end endtaskinitial begin reg [7:0] x, y , z; sum (x, y, z); end

静态调用示例 仿真文件:
module tb; initial display(); initial display(); initial display(); initial display(); // This is a static task task display(); integer i = 0; i = i + 1; $display("i=%0d", i); endtask endmodule

运行结果:
xcelium> run i=1 i=2 i=3 i=4 xmsim: *W,RNQUIE: Simulation is complete.

automatic示例 如果任务被加上了automatic关键字,那么每次调用任务时都会分配不同的空间。
仿真文件:
module tb; initial display(); initial display(); initial display(); initial display(); // Note that the task is now automatic task automatic display(); integer i = 0; i = i + 1; $display("i=%0d", i); endtask endmodule

运行结果:
xcelium> run i=1 i=1 i=1 i=1 xmsim: *W,RNQUIE: Simulation is complete.

全局task 如果task被声明在Module的外部,它将是全局的,可以被当前文件内的所有module调用。
例如:
// This task is outside all modules task display(); $display("Hello World !"); endtaskmodule des; initial begin display(); end endmodule

运行结果:
xcelium> run Hello World ! xmsim: *W,RNQUIE: Simulation is complete.

如果task被定义在某个module范围内,那么它将只能在当前module范围内使用。
例如:
module tb; des u0(); initial begin u0.display(); // Task is not visible in the module 'tb' end endmodulemodule des; initial begin display(); // Task definition is local to the module end task display(); $display("Hello World"); endtask endmodule

运行结果:
xcelium> run Hello World Hello World xmsim: *W,RNQUIE: Simulation is complete.

task和function的区别
Function Task
不能包含时间控制相关的关键字 可以包含时间控制语句
不能启动另一个task 可以启动另一个task或调用function
应该包括至少1个输入 能够包括0个或多个输入
只能有1个输出
当function包含时间控制语句时,例如:
module tb; reg signal; initial wait_for_1(signal); function wait_for_1(reg signal); #10; endfunction endmodule

报语法错误:
#10; xmvlog: *E,BADFCN (testbench.sv,7|4): illegal time/event control statement within a function or final block or analog initial block [10.3.4(IEEE)].

禁止任务 task可以通过disable,以下示例中display任务将会在50ns后被结束。
module tb; initial display(); initial begin // After 50 time units, disable a particular named // block T_DISPLAY inside the task called 'display' #50 disable display.T_DISPLAY; endtask display(); begin : T_DISPLAY $display("[%0t] T_Task started", $time); #100; $display("[%0t] T_Task ended", $time); endbegin : S_DISPLAY #10; $display("[%0t] S_Task started", $time); #20; $display("[%0t] S_Task ended", $time); end endtask endmodule

运行结果:
xcelium> run [0] T_Task started [60] S_Task started [80] S_Task ended xmsim: *W,RNQUIE: Simulation is complete.

FROM:verilog-task

    推荐阅读