Verilog căn bản: Bài 10: Tác vụ (task) và hàm (function)

Lu ROm

Administrator
Staff member
25 Tháng bảy 2014
481
119
43
32
One piece
vimach.net
1, Giới thiệu.
- Task và function cung cấp khả năng thực thi các thủ tục chung từ nhiều nơi khác nhau trong một mô tả thiết kế. Task và function thường được viết một lần và được thực hiện nhiều lần trong module chính. Cả hai task và function được gọi là từ khối always hoặc khối initial và chỉ chứa câu lệnh hành vi. Task và function chia nhỏ những mô tả thiết kế lớn, phức tạp thành những phần nhỏ hơn để dễ dàng trong việc đọc và gỡ rối các mô tả thiết kế chính.
- Các task và function được khai báo trong một module, được gọi từ các câu lệnh liên tục,khối always hoặc từ các hàm khác.
- Các quy tắc sau đây phân biệt task và function:
++ Một function sẽ thực hiện trong một đơn vị thời gian mô phỏng, task có thể bao gồm câu lệnh điều khiển thời gian.
++ Một function không thể kích hoạt một task, một task có thể kích hoạt các task và function khác nhau.
++ Một function phải có ít nhất một đối số đầu vào và không có đối số đầu ra hoặc đầu vào ra, một task có thể không có hoặc có nhiều đối số bất kỳ.
++ Một function sẽ trả về một giá trị duy nhất, còn task sẽ không có giá trị trả về.

--- Khái niệm nhiêu đó đủ rồi vào vấn đề chính nào ^_^
2, Hàm (function)
-
Một hàm không thể gọi một task nhưng có thể gọi nhiều hàm con.(rất giống hàm trong C). Các hàm được khai báo bằng các từ khóa function & endfuncion. Hàm không được sử dụng khi yêu cầu có liên quan đến thời gian, sự chậm trễ, hoặc sự kiện. Có ít nhất một tham số đầu vào để sử dụng hàm. Hàm sẽ trả về một giá trị duy nhất và nó thường được sử dụng để tính toán. Cũng lưu ý rằng nó không thể có đầu ra hoặc đối số inout.
- Một khai báo hàm là một toán hạng trong một biểu thức.
-- =DCú pháp gọi hàm như sau:

function[msb:lsb] function_name; // gọi hàm và đặt tên hàm
input[msb:lsb] input_arguments; // cổng đầu vào của hàm
reg[msb:lsb] reg_variable_list; //kiểu đầu vào
parameter[msb:lsb] parameter_list; // hằng số
integer[msb:lsb] integer_list;
... statements ... // câu lệnh thực hiện
endfunction // kết thúc hàm

Ví dụ:
Mã:
module function_calling(a, b,c);
input a, b ;
output c;
wire c;

function myfunction;
input a, b;
begin
myfunction = (a^b);
end
endfunction

assign c = myfunction (a,b);

endmodule

- Khi bạn khai báo một hàm, một biến được ngầm khai báo có tên trùng với tên hàm, và có độ rộng đã chỉ định cho tên hàm (Chiều rộng mặc định là 1-bit). Ít nhất một lệnh trong hàm phải gán giá trị trả lại giá trị cho biến này.
- Quy định hàm: Sau đây là một số quy tắc chung cho các hàm:
++ Hàm phải chứa ít nhất một tham số đầu vào.
++ Hàm không chứa output hoặc inout.
++ Chức năng không chứa câu lệnh thời gian (#, @, wait).
++ Chức năng không thể gọi task.

2,Task( tác vụ)
- Một task tương tự như một hàm, nhưng không giống như một hàm nó có cả cổng đầu vào và đầu ra. Vì vậy task không trả về một giá trị. Nhiệm vụ tương tự như thủ tục trong hầu hết các ngôn ngữ lập trình. Task thường được sử dụng khi có sự liên quan về thời gian như sự chậm trễ,sự kiện hoặc điều khiển thời gian.Thường được sử dụng trong chương trình testbench.
Cú pháp gọi task:

task task_name; // gọi và đặt tên task
input [msb:lsb] input_port_list; // đầu vào task
output [msb:lsb] output_port_list; // đầu ra task
reg [msb:lsb] reg_variable_list;
parameter [msb:lsb] parameter_list;
integer [msb:lsb] integer_list;
... statements ... // câu lệnh thực hiện
endtask // kết thúc task.

** Điểm khác biệt giữa task với function là task có thể gọi hàm nhưng hàm không thể gọi task.
Ví dụ:^_^

Mã:
module traffic_lights;
reg clock, red, amber, green;
parameter on = 1, off = 0, red_tics = 350,
amber_tics = 30, green_tics = 200;

initial red = off;
initial amber = off;
initial green = off;

always begin // sequence to control the lights.
red = on; // turn red light on
light(red, red_tics); // and wait.
green = on; // turn green light on
light(green, green_tics); // and wait.
amber = on; // turn amber light on
light(amber, amber_tics); // and wait.
end
// task to wait for tics positive edge clocks
// before turning color light off.
task light;
output color;
input [31:0] tics;
begin
repeat (tics) @ (posedge clock);
color = off; // turn light off.
end
endtask
always begin // waveform for the clock.
#100 clock = 0;
#100 clock = 1;
end
endmodule
minion_bigminion_big