Verilog
Sering kali kami menemukan potongan kode tertentu berulang dan dipanggil beberapa kali dalam RTL. Mereka kebanyakan tidak mengkonsumsi waktu simulasi dan mungkin melibatkan perhitungan kompleks yang perlu dilakukan dengan nilai data yang berbeda. Dalam kasus seperti itu, kita dapat mendeklarasikan function
dan tempatkan kode berulang di dalam fungsi dan biarkan mengembalikan hasilnya. Ini akan mengurangi jumlah baris di RTL secara drastis karena yang perlu Anda lakukan sekarang adalah melakukan panggilan fungsi dan meneruskan data yang memerlukan komputasi. Sebenarnya, ini sangat mirip dengan fungsi di C.
Tujuan dari fungsi adalah untuk mengembalikan nilai yang akan digunakan dalam ekspresi. Definisi fungsi selalu dimulai dengan kata kunci function
diikuti dengan tipe kembalian, nama dan daftar port yang diapit tanda kurung. Verilog mengetahui bahwa definisi fungsi berakhir ketika menemukan endfunction
kata kunci. Perhatikan bahwa suatu fungsi harus memiliki setidaknya satu input yang dideklarasikan dan tipe yang dikembalikan adalah void
jika fungsi tidak mengembalikan apa pun.
function [automatic] [return_type] name ([port_list]);
[statements]
endfunction
Kata kunci automatic
akan membuat fungsi masuk kembali dan item yang dideklarasikan dalam tugas dialokasikan secara dinamis daripada dibagi di antara pemanggilan tugas yang berbeda. Ini akan berguna untuk fungsi rekursif dan ketika fungsi yang sama dieksekusi secara bersamaan oleh N proses saat bercabang.
Ada dua cara untuk mendeklarasikan input ke suatu fungsi:
function [7:0] sum;
input [7:0] a, b;
begin
sum = a + b;
end
endfunction
function [7:0] sum (input [7:0] a, b);
begin
sum = a + b;
end
endfunction
Definisi fungsi secara implisit akan membuat variabel internal dengan nama yang sama dengan fungsi tersebut. Oleh karena itu ilegal untuk mendeklarasikan variabel lain dengan nama yang sama di dalam lingkup fungsi. Nilai kembalian diinisialisasi dengan menetapkan hasil fungsi ke variabel internal.
sum = a + b;
Panggilan fungsi adalah operan dengan ekspresi dan memiliki sintaks seperti yang ditunjukkan di bawah ini.
reg [7:0] result;
reg [7:0] a, b;
initial begin
a = 4;
b = 5;
#10 result = sum (a, b);
end
force-release
atau assign-deassign
Fungsi yang memanggil dirinya sendiri disebut fungsi rekursif. Pada contoh di bawah ini, fungsi rekursif ditulis untuk menghitung faktorial dari suatu bilangan.
module tb;
initial begin
integer result = factorial(4);
$display("factorial(4) = %0d", result);
end
function automatic integer factorial(integer i);
integer result = i;
// This function is called within the body of this
// function with a different argument
if (i) begin
result = i * factorial(i-1);
$display("i=%0d result=%0d", i, result);
end else
result = 1;
return result;
endfunction
endmodule
Log Simulasi xcelium> run i=1 result=1 i=2 result=2 i=3 result=6 i=4 result=24 factorial(4) = 24 xmsim: *W,RNQUIE: Simulation is complete
Verilog
Satu set pernyataan Verilog biasanya dieksekusi secara berurutan dalam simulasi. Pernyataan ini ditempatkan di dalam prosedur memblokir. Terutama ada dua jenis prosedur blok di Verilog - awal dan selalu Sintaks initial [single statement] initial begin [multiple statements] end Untu
Sebuah generate block memungkinkan untuk menggandakan instance modul atau melakukan instantiasi bersyarat dari modul apa pun. Ini memberikan kemampuan untuk desain yang akan dibangun berdasarkan parameter Verilog. Pernyataan ini sangat cocok ketika operasi yang sama atau contoh modul perlu diulang b
Sebuah for loop adalah loop yang paling banyak digunakan dalam perangkat lunak, tetapi terutama digunakan untuk mereplikasi logika perangkat keras di Verilog. Ide di balik for loop adalah untuk mengulangi satu set pernyataan yang diberikan dalam loop selama kondisi yang diberikan benar. Ini sangat m
case pernyataan memeriksa apakah ekspresi yang diberikan cocok dengan salah satu ekspresi lain dalam daftar dan bercabang sesuai. Biasanya digunakan untuk mengimplementasikan multiplexer. Konstruksi if-else mungkin tidak cocok jika ada banyak kondisi yang harus diperiksa dan akan disintesis menjadi