1. Apa Itu Fungsi Verilog? (Konsep Asas dan Peranan)
Verilog HDL (Hardware Description Language) ialah bahasa penerangan perkakasan yang digunakan untuk mereka bentuk dan mensimulasikan litar digital. Antara ciri-cirinya, fungsi ialah mekanisme yang membolehkan anda memodularkan operasi tertentu dan menjadikannya boleh digunakan semula.
Memahami fungsi Verilog bukan sahaja meningkatkan kebolehbacaan dan kebolehselenggaraan kod, malah menghasilkan reka bentuk litar yang lebih cekap. Dalam artikel ini, kami menjelaskan konsep asas fungsi Verilog dan cara penggunaannya dalam reka bentuk dunia sebenar.Apa itu fungsi?
Fungsi Verilog ialah blok yang melaksanakan pengiraan atau operasi tertentu dan mengembalikan satu nilai tunggal. Dengan menggunakan fungsi, anda dapat mengurangkan kod berulang dan mempermudah penerangan litar anda.Ciri-ciri Utama Fungsi
- Boleh menentukan satu atau lebih input (hanya
input dibenarkan) - Hanya satu output (nilai pulangan fungsi)
- Kelewatan masa (contoh,
#10) tidak dibenarkan - Fungsi mesti sentiasa menerangkan logik kombinasi
- Fungsi ditakrifkan di luar blok
always dan dinilai serta-merta (tidak seperti tugas)
Bila Menggunakan Fungsi Verilog
Fungsi Verilog biasanya digunakan dalam senario berikut:1. Menerangkan Logik Kombinasi
Oleh kerana fungsi mengembikan hasil serta-merta berdasarkan input, ia sering dipakai dalam logik kombinasi.
Contoh: penambahan, penolakan, pengekod, penyahkod, dan operasi aritmetik lain.2. Meningkatkan Kebolehgunaan Semula Kod
Anda boleh menghapuskan kod berulang dengan merumuskan logik yang kerap digunakan ke dalam fungsi.
Contoh: menukar ungkapan bersyarat yang kompleks menjadi fungsi untuk meningkatkan kebolehbacaan dalam modul.3. Mengurangkan Ralat Reka Bentuk
Dengan memusatkan pengiraan atau operasi logik dalam satu fungsi, anda dapat mengurangkan kesilapan semasaubah kod.
Contoh: pengiraan CRC (Cyclic Redundancy Check) atau pemeriksaan parity.Perbezaan Antara Fungsi dan Tugas
Dalam Verilog, terdapat satu konstruk lain yang dipanggil tugas. Walaupun fungsi dan tugas serupa, mereka berbeza dalam beberapa aspek penting:| Item | Fungsi | Tugas |
|---|
Keluaran | Hanya satu | Berbilang dibenarkan |
| Sila berikan potongan HTML yang ingin anda terjemahkan ke dalam Bahasa Melayu. | Ya | Ya |
| Local Variables | Dibenarkan | Dibenarkan |
Lengah (#10) | Tidak dibenarkan | Dibenarkan |
Penggunaan di dalam always | Dibenarkan | Tidak dibenarkan |
| Invocation | function_name(arguments) | task_name(arguments); |
Bila Menggunakan Fungsi
- Apabila anda memerlukan hasil pengiraan serta-merta
- Untuk logik yang tidak mengandungi kelewatan
- Apabila satu nilai pulangan sudah mencukupi
Bila Menggunakan Tugas
- Apabila proses mengandungi kelewatan (contoh,
#10) - Apabila memerlukan banyak output
- Untuk tujuan simulasi/debug (contoh, output log)
Ringkasan
- Fungsi Verilog ialah fungsi yang mengambil input dan mengembalikan satu nilai tunggal.
- Ia paling sesuai untuk menerangkan logik kombinasi dan tidak boleh mengandungi kelewatan. Berguna untuk mengurangkan kod berulang dan meningkatkan kebolehbacaan.
- Fungsi dan tugas berbeza; pemilihan yang tepat bergantung pada kes penggunaan anda.
2. Cara Menulis Fungsi Verilog [Beginner-Friendly Example]
Dalam bahagian sebelumnya, kami telah membincangkan konsep asas fungsi Verilog. Di sini, kami akan menyelami sintaks sebenar dan cara menulis fungsi Verilog dalam amalan.Sintaks Asas Fungsi
Fungsi Verilog ditulis menggunakan sintaks umum berikut:function [output_bit_width] function_name;
input [input_bit_width] input1, input2, ...;
begin
function_name = expression;
end
endfunction
Perkara Penting
- Dinyatakan dengan kata kunci
function - Nilai pulangan diberikan kepada pembolehub yang mempunyai nama yang sama dengan fungsi
- Input dinyatakan menggunakan
input (anda tidak boleh menggunakan output atau inout) - Lakukan pengiraan di dalam
begin ... end - Takrifkan fungsi di luar blok
always
Contoh Ringkas Fungsi Verilog
Contoh berikut menunjukkan fungsi yang melaksanakan penambahan 8‑bit:module example;
function [7:0] add_function;
input [7:0] a, b;
begin
add_function = a + b;
end
endfunction
reg [7:0] x, y, sum;
initial begin
x = 8'b00001100; // 12
y = 8'b00000101; // 5
sum = add_function(x, y);
$display("Sum: %d", sum); // Sum: 17
end
endmodule
Penjelasan
add_function mengambil dua input 8-bit ( a dan b ) dan mengembalikan jumlahnya- Fungsi dipanggil dengan
sum = add_function(x, y); dan menetapkan hasilnya kepada sum - Blok
initial menggunakan $display untuk memaparkan hasilnya
Mengisytiharkan Input dan Output dalam Fungsi
Mengisytiharkan Input
Fungsi Verilog hanya boleh mengambil argumen input.function [7:0] my_function;
input [7:0] in1, in2;
begin
my_function = in1 & in2; // AND operation
end
endfunction
Nota: Anda tidak boleh mengisytiharkan output dalam fungsi. Nilai kembali sentiasa pembolehubah dengan nama yang sama seperti fungsi.Fungsi dengan Penyataan Bersyarat
Anda juga boleh menggunakan penyataan if atau case di dalam fungsi.function [3:0] max_function;
input [3:0] a, b;
begin
if (a > b)
max_function = a;
else
max_function = b;
end
endfunction
Fungsi ini mengembalikan nilai yang lebih besar antara a dan b.Ringkasan
- Fungsi Verilog ditakrifkan dengan kata kunci
function mengalikan satu nilai - Hanya argumen
input dibenarkan (tiada output ) - Nilai kembali diberikan kepada pembolehubah dengan nama yang sama seperti fungsi
- Penyataan
if dan case boleh digunakan untuk logik bersyarat

3. Cara Menggunakan Fungsi Verilog [With Practical Code Examples]
Dalam bahagian sebelumnya, kami mempelajari sintaks asas dan cara menulis fungsi Verilog. Di sini, kami akan menjelaskan cara menggunakan fungsi dalam reka bentuk sebenar dengan contoh praktikal.Cara Memanggil Fungsi
Fungsi Verilog dipanggil seperti penetapan pembolehubah biasa, menggunakan format function_name(arg1, arg2, ...). Contoh berikut mentakrifkan fungsi XOR 8-bit dan menggunakannya di dalam modul:module function_example;
function [7:0] xor_function;
input [7:0] a, b;
begin
xor_function = a ^ b;
end
endfunction
reg [7:0] x, y, result;
initial begin
x = 8'b11001100;
y = 8'b10101010;
result = xor_function(x, y); // calling the function
$display("XOR Result: %b", result); // XOR Result: 01100110
end
endmodule
Titik Utama
- Fungsi dipanggil dalam bentuk
variable = function(arguments); - Ia boleh digunakan di dalam blok
always atau initial - Fungsi berfungsi sebagai logik kombinasi
Menggunakan Fungsi dalam Logik Kombinasi
Oleh kerana fungsi Verilog sentiasa dinilai serta-merta, ia berguna dalam membina logik kombinasi. Contoh berikut menunjukkan pengekod 2-ke-4 yang dilaksanakan dengan fungsi:module decoder_example;
function [3:0] decoder;
input [1:0] sel;
begin
case (sel)
2'b00: decoder = 4'b0001;
2'b01: decoder = 4'b0010;
2'b10: decoder = 4'b0100;
2'b11: decoder = 4'b1000;
default: decoder = 4'b0000;
endcase
end
endfunction
reg [1:0] select;
wire [3:0] decoded_output;
assign decoded_output = decoder(select); // using the function
initial begin
select = 2'b01;
#10; // add delay to observe simulation changes
$display("Decoded Output: %b", decoded_output); // Decoded Output: 0010
end
endmodule
Penjelasan
- Fungsi
decoder menukar input 2-bit kepada output decoder 4-bit - Menggunakan pernyataan
case untuk menentukan output berdasarkan input - ` → Fungsi ini berfungsi sebagai bahagian logik kombinasi**
Fungsi vs. Blok Always [Comparison Table]
Kedua‑dua fungsi Verilog dan blok always digunakan untuk menggambarkan logik, tetapi tujuan serta sekatan mereka berbeza.| Item | Fungsi | Sentiasa Blok |
|---|
| Definisi Lokasi | Luar always blok | Di dalam blok always |
| Input | input | regwire |
| Output | Hanya satu nilai | Boleh mengemas kini pelbagai nilai |
Lengah (#10) | Tidak dibenarkan | Dibenarkan |
| Pengekalan Negeri | Tidak dibenarkan | Dibenarkan |
| Main Usage | Logik kombinasi | Logik berurutan atau pemprosesan berasaskan peristiwa |
Panduan Utama
- akan fungsi untuk mempermudah operasi logik mudah (logik kombinasi)
- Gunakan blok always untuk litar yang menyimpan keadaan (contoh, flip‑flop)
- Jika anda memerlukan kelewatan (seperti
#10), gunakan blok always dan bukannya fungsi
Ringkasan: Cara Menggunakan Fungsi Verilog
✅ Panggil fungsi dengan function_name(arguments) ✅ Fungsi paling sesuai untuk logik kombinasi dan berbeza daripada blok always ✅ Gunakan pernyataan case atau if untuk menggambarkan logik yang fleksibel
✅ Berguna untuk decoder, operasi aritmetik, dan lain‑lain
4. Aplikasi Praktikal Fungsi Verilog (Reka Bentuk Decoder dan ALU)
Sehingga kini, kita telah mempelajari sintaks asas dan penggunaan fungsi Verilog. Dalam bahagian ini, kita akan melihat cara menggunakan fungsi dalam reka bentuk litar digital sebenar, dengan menggunakan decoder dan ALU (Unit Logik Aritmetik) sebagai contoh.Pelaksanaan Fungsi Decoder (Decoder 2-ke-4)
Decoder ialah litar yang menukar sejumlah kecil bit input kepada bilangan bit output yang lebih banyak. Contohnya, decoder 2-ke-4 menukar input 2-bit kepada output 4-bit. Mari kita laksanakan ini menggunakan fungsi:module decoder_example;
function [3:0] decoder;
input [1:0] sel;
begin
case (sel)
2'b00: decoder = 4'b0001;
2'b01: decoder = 4'b0010;
2'b10: decoder = 4'b0100;
2'b11: decoder = 4'b1000;
default: decoder = 4'b0000;
endcase
end
endfunction
reg [1:0] select;
wire [3:0] decoded_output;
assign decoded_output = decoder(select); // using the function
initial begin
select = 2'b00; #10;
$display("Decoded Output: %b", decoded_output);
select = 2'b01; #10;
$display("Decoded Output: %b", decoded_output);
select = 2'b10; #10;
$display("Decoded Output: %b", decoded_output);
select = 2'b11; #10;
$display("Decoded Output: %b", decoded_output);
end
endmodule
Pelaksanaan Fungsi ALU (Penambahan, Penolakan, AND, OR)
ALU (Unit Logik Aritmetik) ialah litar teras CPU, yang bertanggungjawab melaksanakan operasi aritmetik dan logik seperti penambahan, penolakan, AND, dan OR. Di sini, kita mereka bentuk ALU 8-bit ringkas menggunakan fungsi Verilog:module alu_example;
function [7:0] alu;
input [7:0] a, b;
input [1:0] op; // 2-bit control signal
begin
case (op)
2'b00: alu = a + b; // Addition
2'b01: alu = a - b; // Subtraction
2'b10: alu = a & b; // AND
2'b11: alu = a | b; // OR
default: alu = 8'b00000000;
endcase
end
endfunction
reg [7:0] x, y;
reg [1:0] opcode;
wire [7:0] result;
assign result = alu(x, y, opcode); // using the function
initial begin
x = 8'b00001100; // 12
y = 8'b00000101; // 5
opcode = 2'b00; #10;
$display("Addition Result: %d", result); // 12 + 5 = 17
opcode = 2'b01; #10;
$display("Subtraction Result: %d", result); // 12 - 5 = 7
opcode = 2'b10; #10;
$display("AND Result: %b", result); // AND operation
opcode = 2'b11; #10;
$display("OR Result: %b", result); // OR operation
end
endmodule
Ringkasan
✅ Fungsi boleh digunakan dengan berkesan dalam litar seperti penyahkod dan ALU ✅ Menggunakan pernyataan case membolehkan penerangan operasi yang fleksibel ✅ Fungsi meningkatkan kebolehbacaan dan menjadikan reka bentuk lebih boleh diguna semula ✅ Fungsi paling sesuai untuk logik kombinasi, tetapi tidak untuk litar berurutan (kerana ia tidak boleh mengandungi kelewatan)
5. Pertimbangan Penting Apabila Menggunakan Fungsi Verilog
Fungsi Verilog adalah alat yang kuat yang meningkatkan kebolehbacaan kod dan kebolehgunaan semula, tetapi ia juga mempunyai beberapa sekatan. Dalam bahagian ini, kami akan menjelaskan perkara utama yang perlu anda ketahui apabila menggunakan fungsi.Panggilan Rekursif Tidak DDalam fungsi Verilog, panggilan rekursif dilarang. Ini bermakna fungsi tidak boleh memanggil dirinya sendiri di dalam badan fungsi.
❌ Contoh NG: Fungsi Rekursif
function [3:0] factorial;
input [3:0] n;
begin
if (n == 0)
factorial = 1;
else
factorial = n * factorial(n - 1); // ❌ Recursive call not allowed
end
endfunction
Kod ini akan menghasilkan ralat simulasi.✅ Penyelesaian: Gunakan Gelung Sebagai Gantinya
Jikaursi diperlukan, gunakan gelung di dalam blok always atau tugasan sebagai gantinya.task factorial_task;
input [3:0] n;
output [15:0] result;
integer i;
begin
result = 1;
for (i = 1; i <= n; i = i + 1)
result = result * i;
end
endtask
Dengan menggunakan gelung, rekursi dapat dielakkan.Kelewatan Masa (#10) Tidak Boleh Digunakan Dalam Fungsi
Oleh kerana fungsi Verilog dinilai serta-merta (ber sebagai logik kombinasi), ia tidak boleh mengandungi kelewatan masa seperti #10.❌ Contoh NG: Kelewatan Dalam Fungsi
function [7:0] delay_function;
input [7:0] in;
begin
#10; // ❌ Delay not allowed inside functions
delay_function = in + 1;
end
endfunction
Kod ini akan menyebabkan ralat kompilasi.✅ Penyelesaian: Gunakan Blok Always Sebagai Gantinya
Jika kelewatan diperlukan, gunakan blok always atau tugasan sebagai gantinya, bukannya fungsi.task delay_task;
input [7:0] in;
output [7:0] out;
begin
#10;
out = in + 1;
end
endtask
Ringkasnya, gunakan tugasan untuk operasi yang melibatkan kelewatan.Memilih Antara Fungsi dan Tugasan
Dalam Verilog, terdapat fungsi dan tugasan. Walaupun kelihatan serupa, mereka mempunyai kes penggunaan yang berbeza dan mesti dipilih dengan betul.| Item | Fungsi | Tugas |
|---|
| It looks like the HTML snippet you’d like translated wasn’t included in your message. Could you please provide the HTML code you want me to translate? | Hanya satu | Berbilang dibenarkan |
| Sila berikan potongan HTML yang ingin anda terjemahkan ke dalam Bahasa Melayu. | input | inputoutput |
| Local Variables | Dibenarkan | Dibenarkan |
Lengah (#10) | Tidak dibenarkan | Dibenarkan |
di dalam always | Dibenarkan | Tidak dibenarkan |
| Invocation | function_name(arguments) | task_name(arguments); |
Bila Menggunakan Fungsi
✅ Apabila anda memerlukan hasil pengiraan serta-merta (contoh: penambahan, penolakan, operasi logik)
✅ Untuk menerangkan logik kombinasi tanpa kelewatan ✅ Apabila hanya satu nilai pulangan diperlukanBila Menggunakan Tugasan
✅ Apabila kelewatan (#10, dll.) diperlukan
✅ Apabila berbilang output diperlukan
✅ Untuk operasi simulasi/debug (pemantauan, paparan, dll.)Fungsi Tidak Boleh Didefinisikan Di Dalam Blok Alwaysungsi Verilog tidak boleh didefinisikan di dalam. Fungsi mesti didefinisikan di luar dan kemudian dipanggil dalam always.
❌ Contoh NG: Mendefinisikan Fungsi Di Dalam Always
always @(a or b) begin
function [7:0] my_function; // ❌ Not allowed inside always
input [7:0] x, y;
begin
my_function = x + y;
end
endfunction
end
Kod ini akan menghasilkan ralat kompilasi.✅ Contoh Betul
Definisikan fungsi di luar always dan panggil ia di dalam:function [7:0] add_function;
input [7:0] x, y;
begin
add_function = x + y;
end
endfunction
always @(a or b) begin
result = add_function(a, b); // ✅ call the function
end
Ringkasan
✅ Fungsi Verilog mempunyai beberapa sekatan ✅ Tiada panggilan rekursif (gunakan gelung atau tugasan sebagai gantinya)
✅ Tiada kelewatan (#10) (gunakan always atau tugasan sebagai gantinya)
✅ Tidak boleh ditakrifkan dalam blok always (mesti ditakrifkan di luar)
✅ Hanya satu nilai kembali (gunakan tugasan jika memerlukan banyak output)
✅ Gunakan fungsi dan tugasan dengan betul mengikut situasi
6. [FAQ] Soalan Lazim Mengen Fungsi Verilog
Setakat ini, kami telah membincangkan asas, penggunaan lanjutan, dan pertimbangan penting fungsi Verilog.
Dalam bahagian ini, kami merumuskan soalan lazim dan jawapannya mengenai fungsi Verilog.Apa perbezaan antara fungsi dan tugasan?
S. Apa perbezaan antara fungsi Verilog dan tugasan? Yang mana patut saya gunakan?
J. Fungsi digunakan apabila anda perlu “mengembalikan satu nilai serta-merta,” manakala tugasan digunakan apabila anda memerlukan “banyak output atau operasi yang melibatkan kelewatan.”
| Item | Fungsi | Tugas |
|---|
| It looks like the HTML snippet you’d like translated wasn’t included in your message. Could you please provide the HTML code you want me to translate? | Hanya satu | Berbilang dibenarkan |
| Sila berikan potongan HTML yang ingin anda terjemahkan ke dalam Bahasa Melayu. | input | inputoutput |
| Local Variables | Dibenarkan | Dibenarkan |
Lengah (#10) | Tidak dibenarkan | Dibenarkan |
Penggunaan di dalam always | Dibenarkan | Tidak dibenarkan |
| Invocation | function_name(arguments) | task_name(arguments); |
Bila Menggunakan Fungsi
✅ Apabila anda memerlukan hasil pengiraan serta-merta (contoh: penambahan, penolakan, operasi logik)
✅ Untuk menerangkan logik kombinasi tanpa kelewatan ✅ Apabila hanya satu nilai kembali diperlukanBila Menggunakan Tugasan
✅ Apabila anda memerlukan kelewatan (contoh: #10)
✅ Apabila banyak output diperlukan
✅ Apabila menulis kod debug/pemantauan untuk simulasiBolehkah saya menggunakan reg dalam fungsi?
S. Bolehkah saya mengisytiharkan pembolehubah reg dalam fungsi?
J. Tidak, anda tidak boleh menggunakan reg dalam fungsi, tetapi anda boleh menggunakan integer sebagai gantinya.
Dalam fungsi Verilog, anda tidak boleh mengisytiharkan pembolehubah jenis reg, tetapi anda boleh menggunakan integer untuk pengiraan.✅ Contoh Betul (Menggunakan integer)
function [7:0] multiply;
input [3:0] a, b;
integer temp;
begin
temp = a * b;
multiply = temp;
end
endfunction
Bilakah saya patut menggunakan fungsi?
S. Dalam situasi apa penggunaan fungsi adalah sesuai?
J. Fungsi paling sesuai untuk “operasi aritmetik mudah” dan “logik kombinasi.”
Contoh di mana fungsi berguna termasuk:- Operasi aritmetik (penambahan, penolakan, logik)
- Pengekod dan penyahkod
- Perbandingan (mencari nilai maksimum/minimum)
- Pemeriksaan ralat (contoh: semakan parity)
Walau bagaimanapun, fungsi tidak sesuai untuk litar berurutan yang mengandungi flip‑flop.Bolehkah satu fungsi memanggil fungsi lain?
S. Bolehkah fungsi Verilog memanggil fungsi lain di dalamnya?
J. Ya, fungsi boleh memanggil fungsi lain, tetapi berhati-hati dengan kebergantungan.
function [7:0] add;
input [7:0] a, b;
begin
add = a + b;
end
endfunction
function [7:0] double_add;
input [7:0] x, y;
begin
double_add = add(x, y) * 2; // calling another function
end
endfunction
Bagaimana saya harus memilih antara fungsi dan blok always?
S. Bagaimana saya harus memutuskan sama ada menggunakan fungsi atau blok always?
J. Fungsi digunakan untuk “logik kombinasi,” manakala blok always digunakan untuk “logik berurutan.”
| Item | Fungsi | Sentiasa Sek |
|---|
Lengah (#10) | Tidak dibenarkan | Dibenarkan |
| Penahanan Negeri | Tidak dibenarkan | Dibenarkan |
| Penggunaan Utama | Logik kombinasi (pengiraan segera) | Logik berurutan (flip-flop, kaunter) |
Sebagai contoh, apabila melakukan penambahan:✅ Fungsi (ik Kombinasi)
function [7:0] add;
input [7:0] a, b;
begin
add = a + b;
end
endfunction
✅ Blok Always (Logik Berurutan)
always @(posedge clk) begin
sum <= a + b; // works as a flip-flop
end
Ringkasan
✅ Fungsi paling sesuai untuk operasi mudah dan logik kombinasi ✅ Fahami perbezaan antara fungsi dan tugasan serta gunakan dengan betul ✅ Blok always untuk logik berurutan, fungsi untuk logik kombinasi ✅ Fungsi tidak boleh mengandungi kelewatan (#10) atau tatasusunan — gunakan tugasan atau modul sebagai gantinya