Memahami Tugas Verilog: Fungsi vs Tugas, Sintaks, dan Penggunaan
Sebuah function dimaksudkan untuk melakukan beberapa pemrosesan pada input dan mengembalikan satu nilai, sedangkan task lebih umum dan dapat menghitung beberapa nilai hasil dan mengembalikannya menggunakan argumen tipe output dan inout. Tugas dapat berisi elemen yang mengonsumsi waktu simulasi seperti @, posedge dan lainnya.
Sintaks
Sebuah tugas tidak perlu memiliki himpunan argumen dalam daftar port, dalam hal ini dapat dikosongkan.
// 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
Tugas Statis
Jika tugas statis, maka semua variabel anggotanya akan dibagikan di antara berbagai pemanggilan tugas yang sama yang diluncurkan untuk berjalan secara bersamaan
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
endtask
initial begin
reg [7:0] x, y , z;
sum (x, y, z);
end
Argumen pengaktifan tugas (x, y, z) sesuai dengan argumen (a, b, c) yang ditentukan oleh tugas. Karena a dan b adalah input, nilai x dan y akan ditempatkan di a dan b masing-masing. Karena c dideklarasikan sebagai output dan terhubung dengan z selama pemanggilan, jumlahnya akan secara otomatis diteruskan ke variabel z dari c.
Tugas Otomatis
Kata kunci automatic akan membuat tugas reentrant, jika tidak akan statis secara default. Semua item di dalam tugas automatic dialokasikan secara dinamis untuk setiap pemanggilan dan tidak dibagikan di antara pemanggilan tugas yang sama yang berjalan secara bersamaan. Perhatikan bahwa item tugas automatic tidak dapat diakses oleh referensi hierarkis.
Untuk ilustrasi, pertimbangkan tugas statis display yang dipanggil dari berbagai blok initial yang berjalan secara bersamaan. Dalam hal ini, variabel integer yang dideklarasikan dalam tugas dibagikan di antara semua pemanggilan tugas dan oleh karena itu nilai yang ditampilkan harus bertambah untuk setiap pemanggilan.
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
Log Simulasi
xcelium> run
i=1
i=2
i=3
i=4
xmsim: *W,RNQUIE: Simulation is complete.
Jika tugas dibuat otomatis, setiap pemanggilan tugas dialokasikan ruang yang berbeda dalam memori simulasi dan berperilaku berbeda.
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
Log Simulasi
xcelium> run
i=1
i=1
i=1
i=1
xmsim: *W,RNQUIE: Simulation is complete.
Tugas Global
Tugas yang dideklarasikan di luar semua modul disebut tugas global karena memiliki cakupan global dan dapat dipanggil di dalam setiap modul.
// This task is outside all modules
task display();
$display("Hello World !");
endtask
module des;
initial begin
display();
end
endmodule
Log Simulasi
xcelium> run
Hello World !
xmsim: *W,RNQUIE: Simulation is complete.
Jika tugas dideklarasikan dalam modul des, ia harus dipanggil dengan merujuk ke nama instance modul.
module tb;
des u0();
initial begin
u0.display(); // Task is not visible in the module 'tb'
end
endmodule
module des;
initial begin
display(); // Task definition is local to the module
end
task display();
$display("Hello World");
endtask
endmodule
Log Simulasi
xcelium> run
Hello World
Hello World
xmsim: *W,RNQUIE: Simulation is complete.
Perbedaan antara function dan task
Meskipun fungsi dan tugas Verilog melayani tujuan yang sama, ada beberapa perbedaan yang layak dicatat di antara keduanya.
| Function | Task |
|---|
| Tidak dapat memiliki pernyataan/penundaan yang mengontrol waktu, dan oleh karena itu dieksekusi dalam unit waktu simulasi yang sama | Dapat berisi pernyataan/penundaan yang mengontrol waktu dan mungkin hanya selesai pada waktu lain |
| Tidak dapat mengaktifkan tugas, karena aturan di atas | Dapat mengaktifkan tugas dan fungsi lain |
| Harus memiliki setidaknya satu argumen input dan tidak dapat memiliki argumen output atau inout | Dapat memiliki nol atau lebih argumen dari tipe apa pun |
| Dapat mengembalikan hanya satu nilai | Tidak dapat mengembalikan nilai, tetapi dapat mencapai efek yang sama menggunakan argumen output |
Ketika fungsi mencoba memanggil task atau berisi pernyataan yang mengonsumsi waktu, kompiler melaporkan kesalahan.
module tb;
reg signal;
initial wait_for_1(signal);
function wait_for_1(reg signal);
#10;
endfunction
endmodule
Log Simulasi
#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)].
Menonaktifkan Tugas
Tugas dapat dinonaktifkan menggunakan kata kunci disable.
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;
end
task display();
begin : T_DISPLAY
$display("[%0t] T_Task started", $time);
#100;
$display("[%0t] T_Task ended", $time);
end
begin : S_DISPLAY
#10;
$display("[%0t] S_Task started", $time);
#20;
$display("[%0t] S_Task ended", $time);
end
endtask
endmodule
Ketika tugas display diluncurkan oleh blok initial pertama, T_DISPLAY dimulai dan dinonaktifkan saat waktu mencapai 50 unit. Segera blok berikutnya S_DISPLAY dimulai dan berjalan hingga selesai pada 80 unit.
Log Simulasi
xcelium> run
[0] T_Task started
[60] S_Task started
[80] S_Task ended
xmsim: *W,RNQUIE: Simulation is complete.