Memahami Pernyataan Case Verilog: Implementasi Multiplexer yang Efisien
Pernyataan case memeriksa apakah ekspresi yang diberikan cocok dengan salah satu ekspresi lain dalam daftar dan cabang sesuai. Biasanya digunakan untuk mengimplementasikan multiplexer. Konstruksi if-else mungkin tidak cocok jika ada banyak kondisi yang harus diperiksa dan akan sintetis menjadi encoder prioritas daripada multiplexer.
Sintaks
Pernyataan case Verilog dimulai dengan kata kunci case dan diakhiri dengan kata kunci endcase. Ekspresi dalam tanda kurung akan dievaluasi tepat sekali dan dibandingkan dengan daftar alternatif dalam urutan yang ditulis dan pernyataan untuk alternatif yang cocok dengan ekspresi yang diberikan akan dieksekusi. Blok beberapa pernyataan harus dikelompokkan dan berada dalam begin dan end.
// Here 'expression' should match one of the items (item 1,2,3 or 4)
case (<expression>)
case_item1 : <single statement>
case_item2, case_item3 : <single statement>
case_item4 : begin <multiple statements> end
default : <statement>
endcase
Jika tidak ada item case yang cocok dengan ekspresi yang diberikan, pernyataan dalam item default akan dieksekusi. Pernyataan default bersifat opsional, dan hanya boleh ada satu pernyataan default dalam pernyataan case. Pernyataan case dapat bersarang.
Eksekusi akan keluar dari blok case tanpa melakukan apa pun jika tidak ada item yang cocok dengan ekspresi dan pernyataan default tidak diberikan.
Contoh
Modul desain yang ditunjukkan di bawah ini memiliki sinyal seleksi 2-bit untuk merute salah satu dari tiga input 3-bit lainnya ke sinyal output yang disebut out. Pernyataan case digunakan untuk menugaskan input yang benar ke output berdasarkan nilai sel. Karena sel adalah sinyal 2-bit, dapat memiliki 22 kombinasi, 0 hingga 3. Pernyataan default membantu untuk mengatur output menjadi 0 jika sel adalah 3.
module my_mux (
input [2:0] a, b, c, // Three 3-bit inputs
input [1:0] sel, // 2-bit select signal to choose from a, b, c
output reg [2:0] out // Output 3-bit signal
);
// This always block is executed whenever a, b, c or sel changes in value
always @ (a, b, c, sel) begin
case(sel)
2'b00 : out = a; // If sel=0, output is a
2'b01 : out = b; // If sel=1, output is b
2'b10 : out = c; // If sel=2, output is c
default : out = 0; // If sel is anything else, out is always 0
endcase
end
endmodule
Skema Hardware
Kode rtl diedarkan untuk mendapatkan skema hardware yang mewakili multiplexer 4 ke 1.
Lihat bahwa output adalah nol ketika sel adalah 3 dan sesuai dengan input yang ditetapkan untuk nilai lain.
Dalam pernyataan case, perbandingan hanya berhasil ketika setiap bit dari ekspresi cocok dengan salah satu alternatif termasuk 0, 1, x dan z. Dalam contoh yang ditunjukkan di atas, jika salah satu bit dalam sel adalah x atau z, pernyataan default akan dieksekusi karena tidak ada alternatif lain yang cocok. Dalam hal ini, output akan semua nol.
Jika pernyataan case dalam desain memiliki x dan z dalam alternatif item case, hasilnya akan cukup berbeda.
module my_mux (
input [2:0] a, b, c,
input [1:0] sel,
output reg [2:0] out
);
// Case items have x and z and sel has to match the exact value for
// output to be assigned with the corresponding input
always @ (a, b, c, sel) begin
case(sel)
2'bxz : out = a;
2'bzx : out = b;
2'bxx : out = c;
default : out = 0;
endcase
end
endmodule