目次
- 1 1. Pengenalan
- 2 2. Sintaks Asas dan Tingkah Laku Pernyataan wait
- 3 3. Di Mana Pernyataan wait Boleh dan Tidak Boleh Digunakan
- 4 4. Corak Penggunaan Biasa dan Contoh
- 5 5. Menggunakan wait dalam Testbench
- 6 6. Ralat Umum dan Penyelesaian Masalah
- 7 7. Teknik untuk Meningkatkan Kecekapan Simulasi
- 8 8. Perbandingan dengan SystemVerilog dan Bahasa Lain
- 9 9. Memahami Pernyataan wait dengan Diagram dan Bentuk Gelombang
- 10 10. Soalan Lazim (FAQ)
- 11 11. Ringkasan dan Sumber Berkaitan
1. Pengenalan
Verilog, bahasa penerangan perkakasan yang banyak digunakan dalam reka bentuk litar digital dan pembangunan FPGA, termasuk pernyataan wait—suatu konstruk penting yang menghentikan pelaksanaan sehingga syarat tertentu dipenuhi. Ia sangat berguna untuk kawalan simulasi yang fleksibel dan penulisan testbench yang berkesan. Walaupun ringkas, pernyataan wait dalam Verilog adalah ciri yang kuat. Ia kerap muncul dalam situasi di mana pelaksanaan mesti berhenti sehingga peralihan isyarat atau peristiwa tertentu berlaku. Walau bagaimanapun, penggunaan yang tidak betul boleh menyebabkan kelakuan yang tidak dijangka. Memahami dan menggunakan pernyataan wait dengan betul secara langsung menyumbang kepada peningkatan kualiti reka bentuk dan memastikan pengesahan yang cekap. Artikel ini menyediakan panduan lengkap mesra pemula untuk pernyataan wait dalam Verilog—dari sintaks asas dan penggunaannya hingga aplikasi testbench praktikal serta tip penyelesaian masalah. Sama ada anda baru memulakan dengan Verilog atau sudah terlibat dalam reka bentuk dan pengesahan, panduan ini menawarkan pandangan praktikal untuk aliran kerja anda. Dengan menguasai pernyataan wait Verilog, anda dapat meningkatkan kecekapan simulasi litar anda dengan ketara. Mari kita selami konsep teras dan aplikasi praktikalnya dengan terperinci.2. Sintaks Asas dan Tingkah Laku Pernyataan wait
Dalam Verilog, pernyataan wait ialah konstruk kawalan yang digunakan semasa simulasi untuk “menjeda pelaksanaan sehingga syarat tertentu menjadi benar.” Bentuk paling asas pernyataan ini ialah:wait (condition_expression);
Dalam bentuk ini, pelaksanaan terhenti sehingga syarat yang diberikan menilai benar. Setelah dipenuhi, program meneruskan dengan pernyataan seterusnya selepas wait.2.1 Penggunaan Asas
Pernyataan wait biasanya digunakan dalam blok always dan blok initial. Sebagai contoh, jika anda ingin menjeda pelaksanaan sehingga isyaratready menjadi 1:wait (ready == 1'b1);
Di sini, pelaksanaan terhenti sehingga ready beralih kepada 1, pada ketika itu logik berikutnya diteruskan. Syarat tersebut juga boleh mengandungi operator logik dan gabungan isyarat berbilang.2.2 Perbezaan daripada Penyataan Kawalan Lain
Walaupun Verilog juga menyediakan konstruk sepertiif, while, dan forever, pernyataan wait berkelakuan berbeza:- pernyataan if : Menilai syarat sekali dan melaksanakan hanya jika benar.
- gelung while : Terus melaksanakan selagi syarat tetap benar.
- pernyataan wait : Menunggu sehingga syarat menjadi benar, kemudian melaksanakan pernyataan seterusnya sekali sahaja.
2.3 Kes Penggunaan Biasa
Pernyataan wait sangat berguna apabila anda perlu menjeda sehingga keadaan isyarat atau peristiwa tertentu berlaku. Senario tipikal termasuk menunggu isyarat input naik, memantau pelepasan reset, atau menahan simulasi sehingga syarat luaran dipenuhi dalam testbench.3. Di Mana Pernyataan wait Boleh dan Tidak Boleh Digunakan
Pernyataan wait ialah alat yang kuat untuk kawalan simulasi yang fleksibel dalam Verilog, tetapi ia tidak sesuai untuk setiap situasi. Mari kita pecahkan bila ia patut dan tidak patut digunakan.3.1 Kes Penggunaan yang Sah
Pernyataan wait paling kerap digunakan di dalam blok initial dan blok always, biasanya untuk inisialisasi dan kawalan simulasi. Contoh termasuk:- blok initial Selalunya digunakan untuk menjeda simulasi sehingga reset dilepaskan atau peristiwa permulaan tertentu berlaku.
- blok always Digunakan untuk menunggu bersyarat semasa memproses peristiwa berurutan berdasarkan perubahan isyarat.
initial begin
wait (reset_n == 1'b1); // Wait until reset is deasserted
// Initialization process
end
always begin
wait (data_valid); // Wait until data becomes valid
// Data processing logic
end
3.2 Kes yang Perlu Dielakkan atau Tidak Dibenarkan
Walaupun sangat memudahkan, pernyataan wait tidak boleh digunakan di mana-mana sahaja:- Luar blok prosedural (contoh, secara langsung dalam badan modul atau dalam pernyataan
assign). Wait mesti sentiasa berada dalam konteks prosedural sepertiinitialataualways. - Tidak disarankan untuk sintesis RTL . Pernyataan wait ditujukan hanya untuk simulasi, dan kebanyakan alat sintesis untuk reka bentuk FPGA/ASIC tidak menyokongnya. Elakkan menggunakannya dalam kod RTL yang boleh disintesis.
3.3 Perbezaan daripada Pernyataan wait VHDL
VHDL juga mempunyai pernyataan wait, tetapi ia menawarkan lebih banyak variasi sepertiwait until dan wait for, memberikan fleksibiliti yang lebih besar.
Sebaliknya, Verilog mengehadkannya kepada wait(condition), yang terutama memfokuskan pada menunggu perubahan keadaan isyarat.4. Corak Penggunaan Biasa dan Contoh
Pernyataan wait Verilog banyak digunakan untuk menghentikan pelaksanaan sehingga syarat tertentu dipenuhi. Di bawah ini ialah corak penggunaan biasa dan contoh representatif.4.1 Menunggu Tepi Jam atau Peralihan Isyarat
Kes penggunaan klasik ialah menunggu sehingga isyarat berubah keadaan—contohnya, menunggu pelepasan reset atau isyarat menjadi tinggi.initial begin
// Example: Wait until reset is released
wait (reset_n == 1'b1);
// Initialization logic starts here
end
always begin
// Example: Wait for data_valid signal
wait (data_valid == 1'b1);
// Process data when data_valid goes high
end
4.2 Menunggu Beberapa Syarat
Syarat dalam pernyataan wait boleh termasuk operator logik, membolehkan senario kompleks dengan pelbagai isyarat.wait ((ready == 1'b1) && (start == 1'b1));
Ini membolehkan kawalan masa yang fleksibel dengan gabungan AND/OR.4.3 Menunggu Acara (contoh, Peralihan Isyarat)
Jika anda mahu pelaksanaan berlanjutan hanya selepas isyarat berubah, wait sangat berguna. Walau bagaimanapun, untuk mengesan peralihan dan bukannya nilai keadaan tetap, kawalan acara (contoh,@) sering digabungkan dengan wait.wait (enable == 1'b1);
4.4 Memantau Bendera atau Isyarat Status
Dalam testbench, wait kerap digunakan untuk memantau bendera selesai atau isyarat status modul sehingga tugas selesai.wait (send_done == 1'b1);
4.5 Contoh Senario Praktikal
Untuk menunggu sejumlah kitaran jam tetap, anda boleh menggabungkan kaunter dengan kawalan acara:integer i;
for (i = 0; i < 10; i = i + 1) begin
@(posedge clk); // Wait for 10 rising clock edges
end
※ Contoh ini menggabungkan kawalan acara dengan kaunter dan bukannya hanya menggunakan wait.5. Menggunakan wait dalam Testbench
Apabila menulis testbench dalam Verilog, pernyataan wait menjadi alat yang kuat untuk mengawal aliran simulasi. Oleh kerana testbench sering perlu menunggu input luaran atau acara tertentu, penggunaan wait yang berkesan adalah penting. Di bawah ini ialah contoh representatif.5.1 Menunggu Pelepasan Reset
Dalam kebanyakan reka bentuk, isyarat reset mesti dilepaskan sebelum pengesahan dapat dimulakan. Menggunakan wait memastikan simulasi berlanjutan hanya selepas deassertion reset.initial begin
// Wait until reset signal is deasserted
wait (reset_n == 1'b1);
// Begin test pattern application and verification
end
5.2 Menunggu Penegasan/De-penegasan Isyarat
Dalam testbench, selalunya perlu menunggu isyarat seperti data-valid atau bendera status berubah keadaan sebelum meneruskan simulasi.wait (data_valid == 1'b1);
// Validate output data here
wait (busy == 1'b0);
5.3 Menyelaraskan dengan Protokol Komunikasi
Untuk komunikasi bersiri atau isyarat jabat tangan, pernyataan wait berguna untuk menyelaraskan pelbagai acara. Contohnya, menunggu sehingga bendera transmit‑complete ditegaskan:wait (tx_done == 1'b1);
5.4 Langkah Berhati-hati Apabila Menggunakan wait dalam Testbench
Satu potensi perangkap ialah risiko syarat tidak pernah menjadi benar, yang boleh menyebabkan simulasi terhenti selamanya. Untuk mengelakkannya, gabungkan wait dengan mekanisme timeout atau mesej ralat.initial begin
integer timeout;
timeout = 0;
while (reset_n != 1'b1 && timeout < 1000) begin
#1; // Wait for 1 time unit
timeout = timeout + 1;
end
if (timeout == 1000)
$display("Error: reset_n was never deasserted");
end
Dengan menggabungkan wait dengan langkah-langkah keselamatan tersebut, anda boleh menulis testbench yang selamat dan kukuh yang mengelakkan situasi deadlock.6. Ralat Umum dan Penyelesaian Masalah
Walaupun wait mudah digunakan, penggunaan yang tidak betul boleh menyebabkan ralat atau isu simulasi yang tidak dijangka. Di bawah ialah masalah biasa dan penyelesaiannya.6.1 Menunggu Tanpa Henti
Isu tipikal ialah apabila syarat tidak pernah menjadi benar, menyebabkan simulasi beku secara tidak terhingga. Ini biasanya berlaku disebabkan ralat inisialisasi atau kesilapan kemas kini isyarat. Penyelesaian:- Sahkan bahawa isyarat benar-benar berubah semasa simulasi.
- Tetapkan nilai awal dan corak rangsangan secara eksplisit dalam testbench.
- Perkenalkan pengendalian timeout untuk keluar dengan selamat jika syarat tidak pernah dipenuhi.
integer timeout;
timeout = 0;
while (flag != 1'b1 && timeout < 1000) begin
#1;
timeout = timeout + 1;
end
if (timeout == 1000)
$display("Error: flag never asserted");
6.2 Ungkapan Syarat yang Tidak Betul
Menulis syarat dengan salah boleh menyebabkan tingkah laku yang tidak dijangka, terutama dengan logik yang kompleks. Penyelesaian:- Periksa tanda kurung yang hilang atau kesilapan operator.
- Gunakan pernyataan
$displayuntuk mengesahkan nilai pembolehubah semasa simulasi.
6.3 Keadaan Perlumbaan dan Perkembangan Tidak Diingini
Apabila menggabungkan wait dengan kawalan peristiwa lain (seperti@ atau always), keadaan perlumbaan boleh menyebabkan pelaksanaan dalam susunan yang tidak diingini. Penyelesaian:- Tentukan dengan jelas hubungan antara tepi isyarat (
posedge/negedge) dan syarat wait. - Untuk logik kritikal, pertimbangkan menggunakan kawalan peristiwa atau kelewatan secara gabungan.
6.4 Petua Penyahpepijatan
- Gunakan $display Cetak keadaan pembolehubah dan cap masa sebelum dan selepas pernyataan wait untuk menjejaki kemajuan.
- Sahkan kepuasan syarat Log bila wait keluar untuk mengesahkan saat syarat dipenuhi.
- Mulakan dengan kecil Sahkan kes mudah sebelum beralih ke syarat berbilang isyarat yang kompleks.
7. Teknik untuk Meningkatkan Kecekapan Simulasi
Apabila menjalankan simulasi Verilog, menggabungkan pernyataan wait dengan konstruk kawalan lain secara berkesan boleh meningkatkan kecekapan pengesahan dengan ketara. Bahagian ini memperkenalkan teknik praktikal untuk menjadikan simulasi lebih cepat dan lebih boleh dipercayai.7.1 Menggunakan wait vs. #delay
Kedua-duawait dan #delay boleh digunakan untuk mengawal masa simulasi, tetapi mereka berfungsi untuk tujuan yang berbeza:- pernyataan wait : Menunggu sehingga syarat tertentu dipenuhi (nilai atau keadaan isyarat).
Contoh:
wait (ready == 1'b1); - pernyataan #delay : Menjeda pelaksanaan untuk tempoh masa tetap.
Contoh:
#10; // Tunggu selama 10 unit masa
wait untuk kawalan masa berasaskan peristiwa dan #delay untuk penyesuaian masa tetap. Ini mengelakkan gelung yang tidak perlu dan mengurangkan beban simulasi. 
7.2 Cara Praktikal untuk Mempercepat Simulasi
- Elakkan gelung yang tidak perlu atau wait berulang Pastikan syarat boleh dicapai dan elakkan wait yang tak terhingga atau berduplikasi.
- Gunakan bendera untuk penyegerakan yang berkesan Perkenalkan isyarat bendera untuk mempermudah kawalan peristiwa dan mengurangkan pemeriksaan syarat yang kompleks.
wait (done_flag == 1'b1);
7.3 Menggunakan finish_flag dan Timeout
Untuk mengelakkan simulasi berjalan tanpa henti, gunakanfinish_flag atau timeout untuk menghentikan pelaksanaan dengan selamat.wait (finish_flag == 1'b1);
$finish;
Menggabungkan dengan logik timeout memastikan bahawa jika syarat tidak pernah dipenuhi, simulasi akan keluar secara automatik.7.4 Menggabungkan wait dengan Kawalan Peristiwa
Pernyataan wait berfungsi dengan baik bersama kawalan peristiwa (@) dan penyegerakan proses (fork/join), membolehkan senario pengesahan yang lebih fleksibel.fork
wait (signal_a == 1'b1);
wait (signal_b == 1'b1);
join
Dengan pendekatan ini, anda boleh memantau pelbagai peristiwa secara serentak dan memastikan liputan yang berkesan dalam kes ujian yang kompleks.
Mengoptimumkan kawalan masa simulasi secara langsung mempengaruhi kelajuan projek dan kualiti reka bentuk. Dengan menguasai perintah wait bersama teknik lain, anda dapat menghasilkan aliran pengesahan yang lebih lancar dan lebih boleh dipercayai.8. Perbandingan dengan SystemVerilog dan Bahasa Lain
Walaupun pernyataan wait dalam Verilog menyediakan cara mudah untuk menghentikan pelaksanaan sehingga syarat dipenuhi, bahasa baru seperti SystemVerilog atau VHDL memperluas keupayaan ini. Bahagian ini menyoroti perbezaan utama dan penambahbaikan.8.1 Sambungan wait dalam SystemVerilog
SystemVerilog, sebagai sambungan Verilog, memperkenalkan ciri‑ciri lanjutan berkaitan wait:- wait fork/join Menunggu sehingga semua proses selari selesai.
Example:
fork ... // parallel tasks ... join wait fork; - wait order Membolehkan menunggu pelbagai syarat dalam urutan tertentu (sokongan alat berbeza).
- Integrasi dengan peristiwa dan semaphore SystemVerilog menyokong peristiwa yang ditakrifkan pengguna dan semaphore untuk penyegerakan lanjutan.
8.2 Perbezaan Antara Verilog dan VHDL
- wait VHDL : Menawarkan varian seperti
wait until (condition);danwait for time;, menjadikannya sangat fleksibel. Example:wait until clk = '1'; wait for 100 ns; - wait Verilog : Terhad kepada
wait (condition);, memberi tumpuan utama kepada menunggu keadaan isyarat. Untuk kelewatan masa,#delayatau kawalan peristiwa (@) mesti digunakan.
8.3 Perbandingan dengan Konstruk Kawalan Lain
Verilog juga menyediakanif, while, forever, dan kawalan peristiwa (@), masing‑masing sesuai untuk tugas yang berbeza.
Pernyataan wait direka khusus untuk menunggu sehingga satu syarat dipenuhi sekali. Apabila digabungkan dengan betul bersama aliran kawalan lain, ia membolehkan kawalan masa yang selamat dan tepat dalam simulasi.9. Memahami Pernyataan wait dengan Diagram dan Bentuk Gelombang
Salah satu cara terbaik untuk memahami cara kerja pernyataan wait ialah melalui carta masa dan contoh bentuk gelombang. Bahagian ini menggambarkan bagaimana wait berkelakuan dalam pelbagai senario.9.1 Contoh Operasi Asas
Pertimbangkan kes di mana proses mesti menunggu sehingga isyaratreset_n menjadi tinggi: Kod Contohinitial begin
wait (reset_n == 1'b1);
// Continue with subsequent logic
end
Carta Masa (Konseptual)Time | 0 | 10 | 20 | 30 | 40 | 50 | ...
reset_n 0 0 1 1 1 1
<---wait---> |---→ Continue after reset release
9.2 Mengesan Penegasan Isyarat
Sebagai contoh, menunggu sehinggadata_valid menjadi tinggi: Kod Contohalways begin
wait (data_valid == 1'b1);
// Process data
end
Contoh Bentuk GelombangTime | 0 | 10 | 20 | 30 | 40 | 50 | ...
data_valid 0 0 0 1 0 1
<---wait---> |--- Process begins
9.3 Menunggu untuk Pelbagai Syarat
Jika anda mahu pelaksanaan terus hanya apabila pelbagai syarat benar, gunakan operator logik: Kod Contohwait ((ready == 1'b1) && (start == 1'b1));
Carta MasaTime | ... | 40 | 50 | 60 | 70 | ...
ready 0 1 1 1
start 0 0 1 1
<----wait-----> | Processing begins when both are high
9.4 Peralihan Keadaan dalam Testbench
Dalam testbench, menggabungkan pelbagai wait membolehkan pengesahan peralihan dan perubahan yang dipacu peristiwa. Memvisualisasikan wait dengan diagram masa memudahkan pengesahan aliran simulasi yang betul dan tingkah laku penyahpepijatan.10. Soalan Lazim (FAQ)
Bahagian ini menjawab soalan lazim mengenai penggunaan pernyataanwait dalam Verilog secara praktikal. S1. Apakah perbezaan antara wait dan #delay? A. wait menghentikan pelaksanaan sehingga syarat menjadi benar, manakala #delay menunggu untuk masa tetap. Gunakan wait untuk penyegerakan berasaskan peristiwa dan #delay untuk offset masa yang ringkas. S2. Bolehkah saya menggunakan wait di dalam blok always? A. Ya. Anda boleh menggunakan wait untuk menghentikan sehingga syarat tertentu dipenuhi dalam blok always. Walau bagaimanapun, ambil perhatian bahawa wait tidak boleh disintesis dan hanya untuk simulasi. S3. Adakah pernyataan wait boleh disintesis untuk reka bentuk FPGA/ASIC? A. Tidak. wait hanya untuk simulasi. Kebanyakan alat sintesis tidak menyokongnya, jadi elakkan menggunakannya dalam kod RTL yang disasarkan ke perkakasan. S4. Bagaimana jika wait saya tidak pernah keluar? A. Punca paling biasa ialah isyarat tidak berubah seperti yang dijangka. Sentiasa semak gelombang dan gunakan $display untuk penyahpepijatan. Menambah masa tamat (timeout) boleh mengelakkan menunggu tanpa henti. S5. Bagaimana wait dalam VHDL berbeza dengan wait dalam Verilog? A. VHDL menyediakan varian seperti wait until dan wait for, membenarkan kawalan proses yang fleksibel. Verilog hanya mempunyai wait(condition), memerlukan konstruk lain (seperti @ atau #delay) untuk kawalan masa yang lebih kompleks. S6. Apakah perbezaan antara wait dan kawalan peristiwa (@)? A. Kawalan peristiwa (@) memulakan pelaksanaan pada peralihan isyarat (contoh, @(posedge clk)), manakala wait menghentikan pelaksanaan sehingga syarat menjadi benar. Walaupun serupa, ia digunakan dalam konteks yang berbeza. S7. Simulasi saya beku. Apa yang perlu saya semak? A. Kebarangkalian besar, syarat tidak pernah dipenuhi. Pastikan inisialisasi isyarat yang betul dan pertimbangkan menambah masa tamat untuk mengelakkan deadlock. S8. Bolehkah saya menggabungkan pelbagai isyarat dalam syarat wait? A. Ya. Gunakan operator logik (AND/OR) untuk menggabungkan isyarat menjadi syarat wait yang kompleks.
Contoh: wait ((ready == 1'b1) && (start == 1'b1));11. Ringkasan dan Sumber Berkaitan
Artikel ini telah memberikan penjelasan lengkap mengenai pernyataanwait dalam Verilog, daripada asas hingga kes penggunaan lanjutan. Berikut ialah intipati utama:11.1 Ringkasan Poin Utama
- Pernyataan
waitmenghentikan pelaksanaan sehingga syarat menjadi benar — ciri penting untuk kawalan masa dalam simulasi dan testbench. - Sintaks asas:
wait (condition);Menyokong kedua‑dua syarat logik mudah dan kompleks. - Kes penggunaan utama: menunggu pelepasan reset, peralihan isyarat, penyelesaian pemindahan data, atau protokol jabat tangan.
- Konstruk hanya untuk simulasi: Tidak boleh disintesis untuk reka bentuk RTL FPGA/ASIC.
- Elakkan
waittak terhingga dengan menambah masa tamat dan mesej debug untuk keselamatan pelaksanaan testbench. - SystemVerilog dan VHDL menawarkan konstruk
waitlanjutan atau alternatif, berguna untuk aliran pengesahan yang lebih fleksibel.
wait dengan betul, anda dapat meningkatkan kecekapan pengesahan dan kebolehpercayaan reka bentuk. Manfaatkan teknik yang dibincangkan di sini untuk menjadikan simulasi Verilog anda lebih berkesan.
Ini menandakan akhir panduan komprehensif mengenai pernyataan wait dalam Verilog.
Gunakan ia sebagai rujukan untuk kerja reka bentuk dan pengesahan anda yang berterusan.

