文章目录
-
-
-
- 语法
- 静态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个输出 |
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
推荐阅读
- 笔记|Verilog 语法task和function不可以使用initial和always
- Verilog|Verilog语法(task or function)
- Verilog|Verilog学习心得之三-----task与function的区别
- verilog|Verilog function 函数
- ZYNQ7000|ZYNQ7000 学习(二十一)ZYNQ7 双核处理的运行机制的原理和实现步骤
- ZYNQ7000|ZYNQ7000 学习 (十七)GPIO中断源的配置以及中断试验
- FPGA|基于SDSoC的软硬件协同设计
- Xilinx|Xilinx RTL编码指南(一)
- Verilog|(127)Verilog HDL(设计一个优先编码器之Always case2)