Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Verilog

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.

FunctionTask
Tidak dapat memiliki pernyataan/penundaan yang mengontrol waktu, dan oleh karena itu dieksekusi dalam unit waktu simulasi yang samaDapat berisi pernyataan/penundaan yang mengontrol waktu dan mungkin hanya selesai pada waktu lain
Tidak dapat mengaktifkan tugas, karena aturan di atasDapat mengaktifkan tugas dan fungsi lain
Harus memiliki setidaknya satu argumen input dan tidak dapat memiliki argumen output atau inoutDapat memiliki nol atau lebih argumen dari tipe apa pun
Dapat mengembalikan hanya satu nilaiTidak 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.

Verilog

  1. Menguasai Verilog: Tutorial Lengkap untuk Desain Sirkuit Digital
  2. Menguasai Konkatenasi Verilog: Panduan Praktis
  3. Memahami Penugasan Verilog: Jenis, Sintaks, dan Praktik Terbaik
  4. Perbedaan Kunci Penugasan Blokir dan Non-Blokir Verilog
  5. Menguasai Fungsi Verilog untuk Desain RTL yang Efisien
  6. Memahami Tugas Verilog: Fungsi vs Tugas, Sintaks, dan Penggunaan
  7. Menguasai Ruang Lingkup Referensi Hierarkis Verilog: Hindari Tabrakan Nama dalam Modul dan Blok
  8. Generator Jam Verilog: Panduan Desain dan Implementasi
  9. Menguasai Tugas Tampilan Verilog: Debugging dan Pencatatan yang Efisien
  10. Menguasai Fungsi Matematika Verilog untuk Desain Perangkat Keras yang Efisien