1. Pengenalan
1-1. Apa itu pernyataan if-else dalam Verilog?
Verilog ialah Bahasa Penerangan Perkakasan (HDL) yang digunakan untuk mereka bentuk litar digital seperti FPGA dan ASIC. Antara struktur kawalan dalamnya, pernyataan if-else adalah penting untuk logik percabangan berdasarkan syarat.
Kegunaan utama pernyataan if-else dalam Verilog termasuk:- Percabangan bersyarat dalam litar kombinasi
- Mengawal litar berurutan (contoh: flip-flop)
- Kawalan isyarat dinamik (contoh: multiplexer atau operasi bersyarat)
Sebagai contoh, dengan pernyataan if-else, anda boleh menjana output yang berbeza bergantung pada keadaan isyarat. Ini sangat memudahkan dalam reka bentuk litar, tetapi penggunaan yang tidak betul boleh menyebabkan latch yang tidak diingini (elemen memori) terjana.1-2. Masalah yang disebabkan oleh penggunaan if-else yang tidak betul
Jika pernyataan if-else tidak ditulis dengan betul dalam Verilog, isu-isu berikut mungkin berlaku:- Latch yang tidak dikehendaki terjana
- Jika tidak semua syarat didefinisikan secara eksplisit dalam cabang, alat sintesis mungkin menjana latch (elemen memori).
- Ini boleh menyebabkan tingkah laku penyimpanan yang tidak diingini dan menghalang litar berfungsi seperti yang dijangka.
- Keputusan simulasi berbeza dengan keputusan sintesis
- Walaupun simulasi berfungsi seperti yang diharapkan, tingkah laku mungkin berubah apabila dilaksanakan pada FPGA atau ASIC.
- Ini terjadi kerana gaya penulisan if-else tertentu boleh menyebabkan alat sintesis melakukan pengoptimuman yang tidak tepat.
- Kebolehbacaan kod berkurang
- Pernyataan if-else yang bersarang dalam mendalam menjadikan kod sukar dibaca dan diselenggara.
- Dalam banyak kes, menggunakan pernyataan
case sebaliknya boleh menjadikan kod lebih jelas.
1-3. Tujuan artikel ini
Artikel ini memberikan penjelasan terperinci tentang pernyataan if-else dalam Verilog, daripada sintaks asas hingga contoh praktikal, amalan terbaik, dan bila harus menggunakan pernyataan case. Dengan membaca artikel ini, anda akan belajar:- Cara yang betul untuk menggunakan pernyataan if-else
- Bagaimana menulis kod Verilog yang mengelakkan latch yang tidak diingini
- Bila harus menggunakan if-else berbanding pernyataan case
- Amalan terbaik untuk reka bentuk Verilog
Kami akan menggunakan kod contoh praktikal supaya pemula mudah memahaminya, jadi pastikan anda membaca hingga akhir.
2. Sintaks Asas Pernyataan if-else Verilog
2-1. Cara menulis pernyataan if-else
Pernyataan if-else dalam Verilog serupa dengan yang terdapat dalam bahasa perisian seperti C atau Python. Walau bagaimanapun, anda mesti mempertimbangkan ciri-ciri bahasa penerangan perkakasan semasa menulisnya.
Sintaks asasnya ialah seperti berikut:always_comb begin
if (condition)
statement1;
else
statement2;
end
Anda juga boleh menggunakan else if untuk cabang bersyarat berbilang:always_comb begin
if (condition1)
statement1;
else if (condition2)
statement2;
else
statement3;
end
Konstruksi ini kerap digunakan apabila mereka bentuk litar kombinasi yang mesti berkelakuan berbeza bergantung pada syarat.2-2. Kod contoh asas untuk pernyataan if-else
Sebagai contoh konkrit, mari kita cipta litarilih ringkas. Contoh: Litar yang menentukan output y berdasarkan input amodule if_else_example(input logic a, b, output logic y);
always_comb begin
if (a == 1'b1)
y = b;
else
y = ~b;
end
endmodule
Penjelasan- Apabila
a ialah 1, y mengeluarkan nilai yang sama dengan b. - Apabila
a ialah 0, y mengeluarkan nilai terbalik b.
Ini menunjukkan bagaimana pernyataan if-else dapat digunakan untuk mengawal isyarat bergantung pada syarat dengan cara yang mudah difahami.2-3. Cara kerja pernyataan if-else
Dalam Verilog, pernyataan if-else digunakan dalam dua jenis reka bentuk litar:- Litar kombinasi (menggunakan always_comb)
- Output berubah serta-merta berdasarkan isyarat input.
- Tiada latch, yang membantu mengelakkan kelakuan yang tidak diingini.
- Disarankan untuk menggunakan
always_comb dan bukannya always @(*) .
- Litar berurutan (menggunakan always_ff)
- Data dikemas kini sel dengan isyarat jam.
- Digunakan untuk kelakuan seperti D flip-flop .
Mari lihat contoh khusus bagaimana if-else diterapkan dalam setiap jenis litar.2-4. If-else dalam litar kombinasi
Dalam litar kombinasi, output berubah serta-merta berdasarkan input.
Oleh itu, penting untuk menggunakan always_comb bagi mengelakkan penjanaan latch yang tidak diingini.module combination_logic(input logic a, b, output logic y);
always_comb begin
if (a == 1'b1)
y = b;
else
y = ~b;
end
endmodule
Kod ini menukar output y bergantung pada nilai input a.- Apabila
a == 1 : y = b - Apabila
a == 0 : y = ~b
Poin utama- Menggunakan
always_comb memastikan tiada latch dijana. - Anda mesti menetapkan nilai untuk semua keadaan (jika anda mengabaikan
else, latch mungkin terinferens).
2-5. If-else dalam litar berurutan
Dalam litar berurutan, output dikemas kini selaras dengan jam, jadi anda harus menggunakan always_ff. Contoh: D flip-flopmodule d_flipflop(input logic clk, reset, d, output logic q);
always_ff @(posedge clk or posedge reset) begin
if (reset)
q <= 1'b0;
else
q <= d;
end
endmodule
Ini mewakili D flip-flop.- Apabila
reset ialah 1, output q direset kepada 0.
Apabila reset ialah 0 dan tepi naik clk berlaku, d disimpan dalam q.
Poin utama- Untuk litar berurutan, gunakan
always_ff (bukan always @(*)). - Gunakan
<= (penugasan tidak menyekat) untuk mengelakkan keadaan perlumbaan yang tidak diingini.
2-6. Kes penggunaan praktikal pernyataan if-else
Pernyataan if-else Verilog biasanya digunakan dalam situasi berikut:- Kawalan LED
- Hidupkan/matikan LED bergantung pada keadaan suis.
- ALU (Unit Logik Aritmetik)
- Mengawal operasi seperti penambahan, penolakan, dan operasi logik.
- Peralihan keadaan
- Mereka bentuk mesin keadaan terhingga (dijelaskan secara terperinci dalam bahagian seterusnya).
Ringkasan
- Pernyataan if-else digunakan dalam Verilog untuk melaksanakan percabangan bersyarat.
- Ia harus diterapkan dengan betul pada litar kombinasi (
always_comb) dan litar berurutan (always_ff). - Jika semua keadaan tidak ditetapkan secara eksplisit, latch yang tidak diingini mungkin dijana.
- Dalam reka bentuk litar sebenar, if-else sering digunakan untuk mengawal keadaan.

3. Aplikasi pernyataan if-else
Pernyataan if-else adalah asas percabangan bersyarat dalam Verilog. Ia bukan sahaja berguna untuk kawalan mudah, tetapi juga penting dalam mereka bentuk kedua-dua litar kombinasi dan berurutan.
Dalam bahagian ini, kita akan meneroka aplikasi lanjutan seperti mereka bentuk penjumlah 4-bit dan Mesin Keadaan Terhingga (FSM).3-1. Mereka bentuk litar kombinasi
Litar kombinasi menghasilkan output serta-merta sebagai respons kepada perubahan input.
Apabila mereka bentuk logik kombinasi, always_comb harus digunakan untuk mengelakkan latch yang tidak diingini.Contoh 1: Penjumlah 4-bit
Litar ini menambah dua input 4-bit (a dan b) dan menghasilkan hasil (sum) bersama dengan carry-out (cout).module adder(
input logic [3:0] a, b,
input logic cin,
output logic [3:0] sum,
output logic cout
);
always_comb begin
if (cin == 1'b0)
{cout, sum} = a + b; // no carry
else
{cout, sum} = a + b + 1; // with carry
end
endmodule
Penjelasan
- Jika
cin ialah 0, ia melakukan a + b. - Jika
cin ialah 1, ia melakukan a + b + 1 (termasuk carry). - Menggunakan
always_comb memastikan ini adalah litar kombinasi tanpa inferens latch.
3-2. Menggunakan if-else dalam litar berurutan (daftar)
Sequential circuits mengemas kini data selaras dengan isyarat jam (clk).
Dengan menggunakan pernyataan if-else, melaksanakan peralihan keadaan atau kawalan pendaftar.Contoh 2: D flip-flop
D flip-flop menyimpan input d ke output q pada tepi naik clk.module d_flipflop(
input logic clk, reset, d,
output logic q
);
always_ff @(posedge clk or posedge reset) begin
if (reset)
q <= 1'b0; // reset output to 0
else
q <= d; // store d on clock edge
end
endmodule
Penjelasan
- Jika
reset ialah 1, q direset kepada 0. - Pada tepi naik
clk, d disimpan dalam q. - Menggunakan
always_ff menjadikan ini berkelakuan sebagai pendaftaran flip‑flop.
3-3. Menggunakan pernyataan if-else dalam peralihan keadaan (FSM)
Pernyataan if-else juga berguna dalam mereka bentuk Finite State Machines (FSMs).
FSM ialah litar yang menyimpan pelbagai keadaan dan beralih antara mereka berdasarkan syarat.Contoh 3: Litar peralihan keadaan ringkas
Reka bentuk FSM yang menukar keadaan LED (led_state) berdasarkan input butang (btn).module fsm_toggle(
input logic clk, reset, btn,
output logic led_state
);
typedef enum logic {OFF, ON} state_t;
state_t state, next_state;
always_ff @(posedge clk or posedge reset) begin
if (reset)
state <= OFF; // initial state
else
state <= next_state;
end
always_comb begin
case (state)
OFF: if (btn) next_state = ON;
else next_state = OFF;
ON: if (btn) next_state = OFF;
else next_state = ON;
default: next_state = OFF;
endcase
end
assign led_state = (state == ON);
endmodule
Penjelasan
- Pembolehubah
state menyimpan status LED (ON atau OFF). - Apabila
reset ialah 1, LED dimatikan (keadaan awal). - Apabila
btn ditekan, LED menukar antara ON ⇔ OFF. - Menggunakan pernyataan case untuk peralihan keadaan meningkatkan kebolehbacaan.
3-4. Teknik lanjutan untuk pernyataan if-else
① Elakkan penumpukan mendalam pernyataan if-else
Penumpukan berlebihan pernyataan if-else mengurangkan kebolehbacaan dan meningkatkan kemungkinan pepijat. Contoh buruk (penumpukan mendalam)always_comb begin
if (a == 1) begin
if (b == 1) begin
if (c == 1) begin
y = 1;
end else begin
y = 0;
end
end else begin
y = 0;
end
end else begin
y = 0;
end
end
Contoh yang dipertingkat (menggunakan pernyataan case)always_comb begin
case ({a, b, c})
3'b111: y = 1;
default: y = 0;
endcase
end
- Dengan menyatakan syarat sebagai vektor bit dan menggunakan pernyataan
case, penumpukan dikurangkan dan kebolehbacaan dipertingkat.
Ringkasan
- Pernyataan if-else boleh digunakan dalam litar kombinasi dan berurutan.
- Gunakan
always_comb untuk logik kombinasi dan always_ff untuk logik berurutan. - FSM (Finite State Machines) selalunya menggabungkan pernyataan if-else dan case untuk menguruskan keadaan.
- Elakkan penumpukan mendalam if-else dengan memanfaatkan pernyataan case atau syarat vektor bit.
4. Perbezaan Antara Pernyataan if-else dan case
Dalam Verilog, terdapat dua biasa untuk melaksanakan percabangan bersyarat: pernyataan if-else dan pernyataan case. Kedua-duanya merupakan struktur kawalan yang banyak digunakan, tetapi mereka sesuai untuk tujuan yang berbeza, jadi memilih yang betul adalah penting.4-1. Apa itu pernyataan case?
Sintaks asas case
Pernyataan case digunakan untuk menggambarkan kelakuan bergantung pada pelbagai syarat yang berbeza. Ia sangat berguna apabila percabangan berdasarkan nilai tetap tertentu.always_comb begin
case (condition_variable)
value1: statement1;
value2: statement2;
value3: statement3;
default: statement4; // if none match
endcase
end
Contoh kod case
Contoh berikut menukar output y berdasarkan isyarat input sel:module case_example(input logic [1:0] sel, input logic a, b, c, d, output logic y);
always_comb begin
case (sel)
2'b00: y = a;
2'b01: y = b;
2'b10: y = c;
2'b11: y = d;
default: y = 0; // fallback
endcase
end
endmodule
Penjelasan
- Bergantung pada nilai
sel, y diberikan a, b, c, atau d. - Apabila bercabang berdasarkan pelbagai nilai tetap, menggunakan case menjadikan kod lebih ringkas.
- Menyertakan
default mengelakkan kelakuan tidak ditakrifkan apabila nilai yang tidak dijangka muncul.
4-2. Perbezaan utama antara if-else dan case
Kedua-dua if-else dan case melakukan percabangan bersyarat, tetapi terdapat perbezaan penting:| Perbandingan | jika‑lain | kes |
|---|
| Kes penggunaan terbaik | Apabila syarat melibatkan julat atau logik berurutan | Apabila syarat adalah nilai tetap diskret |
| Kebolehbacaan | If bersarang mengurangkan kebolehbacaan | Lebih jelas dan terstruktur |
| Keputusan sintesis | if-else | case |
| Penjanaan latch | Mungkin menghasilkan latch jika semua kes tidak diliputi | Memerlukan default untuk mengelakkan keadaan tidak ditakrifkan |
4-3. Bila menggunakan if-else vs. case
① Bila menggunakan if-else
✅ Apabila syarat melibatkan julatalways_comb begin
if (value >= 10 && value <= 20)
output_signal = 1;
else
output_signal = 0;
end
- if-else lebih baik apabila mengendalikan julat (contoh, 10~20).
- case tidak dapat secara langsung mengendalikan syarat julat.
✅ Apabila keutamaan pentingalways_comb begin
if (x == 1)
y = 10;
else if (x == 2)
y = 20;
else if (x == 3)
y = 30;
else
y = 40;
end
- if-else paling sesuai apabila syarat yang lebih tinggi harus mengatasi yang kemudian.
- Berguna untuk logik keutamaan.
② Bila menggunakan case
✅ Apabila bercabang mengikut nilai khususalways_comb begin
case (state)
2'b00: next_state = 2'b01;
2'b01: next_state = 2'b10;
2'b10: next_state = 2'b00;
default: next_state = 2'b00;
endcase
end
case adalah piawai untuk peralihan keadaan FSM.
✅ Apabila terdapat banyak syaratalways_comb begin
case (opcode)
4'b0000: instruction = ADD;
4'b0001: instruction = SUB;
4'b0010: instruction = AND;
4'b0011: instruction = OR;
default: instruction = NOP;
endcase
end
- Untuk penyahkod arahan dengan banyak nilai, case memberikan kebolehaan yang jauh lebih tinggi.
Ringkasan
✅ Gunakan if-else untuk julat atau logik berasaskan keutamaan ✅ Gunakan case untuk nilai tetap atau peralihan keadaan FSM ✅ Untuk banyak syarat, case meningkatkan kebolehbacaan ✅ Pilih berdasarkan sama ada syarat memerlukan keutamaan atau khusus nilai
5. Amalan Terbaik untuk Penyataan if-else Verilog
Penyataan if-else adalah kaedah percabangan bersyarat yang banyak digunakan dalam Verilog, tetapi jika tidak ditulis dengan betul, ia boleh menyebabkan inferens latch atau kelakuan yang tidak diingini.
Dalam bahagian ini, kami akan membincangkan amalan terbaik untuk menulis penyataan if-else dengan betul dalam Verilog.5-1. Cara mengelakkan inferens latch
Apabila menulis logik kombinasi dalam Verilog, penggunaan if-else yang tidak betul boleh menyebabkan penjanaan latch yang tidak dikehendaki.
Ini berlaku apabila tidak semua syarat secara eksplisit menetapkan nilai di dalam blok if-else.① Contoh buruk (menyebabkan inferens latch)
always_comb begin
if (a == 1'b1)
y = b; // when a == 0, y holds its previous value
end
Mengapa ini menghasilkan latch?
- Jika
a == 1'b1, maka y = b. - Jika
a == 0, y tidak ditetapkan semula, jadi ia mengekalkan nilai lama (kelakuan latch). - Penyimpanan yang tidak diingini ini boleh menyebabkan pepijat reka bentuk.
② Contoh betul (mengelakkan latch)
Sentiasa sertakan cabang else untuk menetapkan nilai dalam semua syarat:always_comb begin
if (a == 1'b1)
y = b;
else
y = 1'b0; // explicitly assign y
end
③ Menggunakan penetapan default
always_comb begin
y = 1'b0; // default assignment
if (a == 1'b1)
y = b;
end
✅ Petua: Selagi semua syarat memberikan nilai, inferens latch tidak akan berlaku!5-2. Menggunakan always_comb dan always_ff
Sejak Verilog 2001, disarankan untuk memisahkan logik kombinasi dan berurutan dengan jelas menggunakan always_comb dan always_ff.① Logik kombinasi (always_comb)
always_comb begin
if (a == 1'b1)
y = b;
else
y = 1'b0;
end
always_comb secara automatik menentukan senarai sensitiviti ( (*) ), jadi anda tidak perlu menulisnya secara manual.- Ia menjadikan niat reka bentuk anda lebih jelas dan membantu alat mengoptimumkan dengan betul.
② Logik berurutan (always_ff)
always_ff @(posedge clk or posedge reset) begin
if (reset)
q <= 1'b0;
else
q <= d;
end
always_ff secara eksplisit menyatakan bahawa blok ini menerangkan flip‑flop dipacu jam.- Berbanding dengan
always @ (posedge clk or posedge reset), ia meningkatkan kebolehbacaan dan mengurangkan kesilapan.
5-3. Meningkatkan kebolehbacaan pernyataan if-else
If-else adalah kuat, tetapi logik yang bersarang dalam secara mendalam boleh mengurangkan kebolehbacaan dan meningkatkan kesilapan.
Anda boleh meningkatkan kebolehbacaan dengan teknik berikut:① Kurangkan bersarang dengan pernyataan case
Apabila if-else menjadi terlalu bersarang, gunakan pernyataan case untuk mempermudah. Contoh buruk (bersarang dalam)always_comb begin
if (mode == 2'b00) begin
if (enable) begin
y = a;
end else begin
y = b;
end
end else begin
y = c;
end
end
Contoh yang dipertingkat (menggunakan case)always_comb begin
case (mode)
2'b00: y = enable ? a : b;
default: y = c;
endcase
end
- Menggunakan case menjadikan percabangan lebih bersih dan lebih mudah diikuti.
- Operator ternari (
?) boleh memendekkan ungkapan if-else yang mudah.
Ringkasan
✅ Sentiasa beri nilai di semua syarat untuk mengelakkan latch. ✅ Gunakan always_comb untuk logik kombinasi, always_ff untuk logik berurutan bagi menjelaskan niat. ✅ Apabila bersarang menjadi terlalu dalam, gunakan case atau operator ternari untuk kebolehbacaan. ✅ Pilih nama pembolehubah yang deskriptif untuk meningkatkan kejelasan kod.
6. Soalan Lazim (FAQ)
Penyataan if-else Verilog banyak digunakan untuk percabangan bersyarat, tetapi kedua-dua pemula dan jurutera berpengalaman sering mempunyai soalan dan perangkap umum.
Dalam bahagian ini, kami akan menjawab FAQ seperti inferens latch, perbezaan daripada pernyataan case, dan kebimbangan prestasi dalam format Soal & Jawab.S1: Mengapa pernyataan if-else kadang-kadang menghasilkan latch dalam Verilog? Bagaimana saya boleh mengelakkannya?
J1: Punca inferens latch
Dalam Verilog, jika semua syarat dalam blok if-else tidak memberikan nilai, penyintesis akan menginferensikan latch untuk menahan nilai sebelumnya.
Ini berlaku kerana alat penyintesis menganggap “menyimpan nilai terakhir” apabila tiada penugasan diberikan.Contoh buruk (menyebabkan latch)
always_comb begin
if (a == 1'b1)
y = b; // when a == 0, y retains its value
end
Cara mengelakkan inferens latch
① Sentiasa sertakan cabang elsealways_comb begin
if (a == 1'b1)
y = b;
else
y = 1'b0; // explicitly assign a value
end
② Gunakan penugasan lalaialways_comb begin
y = 1'b0; // default assignment
if (a == 1'b1)
y = b;
end
✅ Petua: Selagi setiap syarat memberikan nilai, tiada latch akan dijana!S2: Apa perbezaan antara pernyataan if-else dan case? Yang mana patut saya gunakan?
J2: Garis panduan penggunaan
| Condition Type | Pernyataan Disyorkan |
|---|
Syarat berasaskan julat (contoh, 10 <= x <= 20) | jika‑lain |
| Nilai tetap khusus | kes |
| Keutamaan diperlukan | jika‑lain |
| Banyak syarat percabangan | kes |
S3: Adakah pernyataan if-else mempengaruhi kelajuan pemprosesan dalam Verilog?
J3: Prestasi bergantung pada penyintesisan litar
- Verilog adalah bahasa penerangan perkakasan; kelajuan pelaksanaan bergantung pada struktur perkakasan yang disintesis, bukan pada kod itu sendiri.
- Penyataan if-else yang bersarang dalam secara mendalam boleh mengakibatkan laluan logik yang lebih panjang dan meningkatkan kelewatan propagasi.
- Walau bagaimanapun, alat sintesis melakukan pengoptimuman, jadi litar yang setara secara logik biasanya mempunyai perbezaan prestasi yang minimum.
✅ Petua untuk pengoptimuman Kurangkan penyusunan if-elsealways_comb begin
case (a)
1: y = 10;
2: y = 20;
default: y = 30;
endcase
end
Pastikan logik mudah untuk mengurangkan cabang yang tidak perlu dan kelewatan.S4: Haruskah saya menggunakan = atau <= dalam penetapan if-else?
J4: Penetapan blok (=) vs. tidak blok (<=)
| Jenis Tugasan | Kes Penggunaan |
|---|
= | Logik kombinasi (always_comb) |
<= | Logik berurutan (always_ff) |
✅ Dalam litar kombinasi, gunakan =always_comb begin
if (a == 1)
y = b; // blocking assignment
end
✅ Dalam litar berurutan (daftar), gunakan <=always_ff @(posedge clk) begin
if (reset)
y <= 0; // non-blocking assignment
else
y <= d;
end
S5: Bagaimana saya boleh mengurangkan penyusunan mendalam dalam penyataan if-else?
J5: Gunakan operator case atau ternari
Contoh buruk (penyusunan mendalam)**always_comb begin
if (mode == 2'b00) begin
if (enable) begin
y = a;
end else begin
y = b;
end
end else begin
y = c;
end
end
Contoh yang dipertingkat (case dengan ternari)always_comb begin
case (mode)
2'b00: y = enable ? a : b;
default: y = c;
endcase
end
✅ Petua: Operator bersyarat (? :) berguna untuk mempermudah struktur if-else yang mudah.Ringkasan
✅ ** mengelakkan latch, sentiasa tetapkan nilai untuk semua menggunakan else atau nilai lalai. ✅ Gunakan case untuk nilai tetap atau FSM; gunakan if-else untuk julat atau logik keutamaan. ✅ Gunakan <= dalam logik berurutan, = dalam logik kombinasi. ✅ Kurangkan penyusunan dengan case atau operator ternari untuk kebolehbacaan yang lebih baik.**
7. Kesimpulan
Penyataan if-else dalam Verilog adalah struktur cabang bersyarat asas yang memainkan peranan penting dalam reka bentuk litar digital.
Dalam artikel ini, kami membincangkan sintaks asas, aplikasi, amalan terbaik, dan soalan lazim mengenai penyataan if-else secara terperinci.
Bahagian ini merangkum poin utama untuk menggunakan if-else dengan berkesan dalam Verilog.7-1. Poin utama if-else Verilog
✅ Sintaks asas
if-else adalah struktur asas untuk cabang bersyarat.- Dalam litar kombinasi, gunakan
always_comb dan pastikan semua keadaan menetapkan nilai.
always_comb begin
if (a == 1'b1)
y = b;
else
y = 1'b0; // prevent latches with default assignment
end
- Dalam litar berurutan (dipacu jam), gunakan
always_ff dengan penetapan tidak blok ( <= ).
always_ff @(posedge clk or posedge reset) begin
if (reset)
q <= 1'b0;
else
q <= d;
end
✅ Petua: Gunakan = untuk logik kombinasi dan <= untuk logik berurutan.7-2. Penggunaan yang betul bagi if-else
✅ Dalam logik kombinasi- Gunakan
always_comb dan tetapkan nilai dalam semua keadaan untuk mengelakkan inferens latch. - Tetapkan nilai lalai untuk mengelakkan tingkah laku tidak ditakrifkan.
✅ Dalam logik berurutan- Gunakan
always_ff dengan if-else untuk mengemas kini keadaan pada tepi jam. - Gunakan
<= (penetapan tidak blok) untuk mengekalkan konsistensi antara simulasi dan tingkah laku perkakasan.
✅ Senario terbaik untuk if-else| Condition type | Pernyataan yang disyorkan |
|---|
Range conditions (e.g., 10 <= x <= 20) | jika‑lain |
Logik keutamaan (contoh, if (x == 1) sebelum else if (x == 2)) | jika‑lain |
| Percabangan mudah (2–3 syarat) | jika‑lain |
7-3. Bila menggunakan case sebagai gantinya
if-else lebih sesuai untuk julatan atau logik berasaskan keutamaan, manakala case lebih sesuai untuk nilai diskret atau banyak cabang. Pilih mengikut keperluan reka bentuk.
✅ Senario terbaik untuk case| Condition type | Pernyataan yang disyorkan |
|---|
Percabangan mengikut nilai tetap (contohnya, state == IDLE, RUNNING, STOP) | kes |
| Banyak syarat (8+ cawangan) | kes |
| Peralihan keadaan (FSM) | kes |
7-4. Amalan terbaik
✅ Sentiasa tetapkan nilai untuk semua keadaan bagi mengelakkan latchalways_comb begin
if (a == 1'b1)
y = b;
else
y = 1'b0; // always assign explicitly
end
✅ Gunakan always_comb dan always_ff dengan betulalways_comb begin // combinational
if (a == 1'b1)
y = b;
else
y = 1'b0;
end
always_ff @(posedge clk) begin // sequential
if (reset)
y <= 0;
else
y <= d;
end
✅ Gunakan case daripada if-else yang bersarang secaraalamalways_comb begin
case (sel)
2'b00: y = a;
2'b01: y = b;
2'b10: y = c;
default: y = d;
endcase
end
7-5. Kesilapan biasa dan pembaikannya
| Kesilapan | Pendekatan yang betul |
|---|
| Latch dijana | Sentiasa sertakan else dan tetapkan nilai secara eksplisit |
Menggunakan = dalam logik berurutan | Gunakan <= (penetapan bukan blok) |
| Penyusunan berlebihan | Gantikan dengan case untuk kebolehbacaan yang lebih baik |
7-6. Ringkasan akhir
✅ if-else boleh digunakan dalam litar kombinasi dan berurutan, tetapi mesti mengikut amalan yang betul ✅ Tidak memberikan nilai untuk semua syarat menyebabkan inferens latch ✅ Gunakan case apabila bercabang berdasarkan nilai tetap atau mengendalikan FSM ✅ Gunakan <= dalam litar berurutan dan = dalam litar kombinasi ✅ Kurangkan penyusunan mendalam dengan case atau operator ternari7-7. Langkah seterusnya
Dalam artikel ini, kami menerangkan pernyataan if-else dalam Verilog, dari asas hingga penggunaan lanjutan, amalan terbaik, dan panduan mengikut kes.
Untuk kemahiran praktikal yang lebih mendalam, kami mengesyorkan mempelajari topik berikut seterusnya:
✅ Mereka bentuk FSM (Finite State Machines) dalam Verilog ✅ Menggunakan pernyataan case untuk kawalan yang cekap ✅ Menerapkan if-else dalam reka bentuk paip ✅ Mengoptimumkan reka bentuk selaras jam Menguasai konsep-konsep ini akan membantu anda mereka bentuk litar digital yang lebih cekap dengan Verilog! 🚀