Menu
CoddyTech

Casex và casez

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 56 trên 90.

Đôi khi, bạn chỉ quan tâm đến một số phần cụ thể trong một giá trị, còn những phần khác có thể bỏ qua. Ví dụ, trong bộ mã hóa ưu tiên, bạn muốn tìm bit 1 đầu tiên bất kể các bit khác.

Câu lệnh case thông thường sẽ yêu cầu bạn liệt kê mọi tổ hợp có thể có của các bit không quan trọng, điều này là bất khả thi với các bus có độ rộng lớn.

casez và casex giải quyết vấn đề này bằng cách cho phép bạn đánh dấu một số bit là “không cần quan tâm” bằng ?, z hoặc x.

Casez, Casex và case thông thường

Câu lệnhCác bit không cần quan tâmPhù hợp nhất với
caseKhông cóSo khớp chính xác
casezz hoặc ?Bộ mã hóa ưu tiên (được khuyến nghị)
casexx, z hoặc ?Nên tránh (che giấu lỗi)
  • casez bỏ qua các bit có giá trị z hoặc ? (được khuyến nghị)
  • casex cũng bỏ qua các bit x, điều này có thể che giấu lỗi mô phỏng

Luôn dùng casez, không dùng casex. casex rất nguy hiểm vì bỏ qua các giá trị x (thường biểu thị thanh ghi chưa được khởi tạo hoặc lỗi mô phỏng). casez là lựa chọn an toàn hơn vì không xem x là giá trị không cần quan tâm.

Ví dụ

casez (data)
  4'b???1: out = 0;   // Bit0 must be 1, others don't matter
  4'b??1?: out = 1;   // Bit1 must be 1, others don't matter
  4'b?1??: out = 2;   // Bit2 must be 1, others don't matter
  4'b1???: out = 3;   // Bit3 must be 1, others don't matter
endcase

? có nghĩa là “không quan trọng”. Bit đó có thể là 0, 1 hoặc bất kỳ giá trị nào.

challenge icon

Thử thách

Cần làm gì:

Thêm câu lệnh casez còn thiếu để bộ giải mã này hoạt động.

Cách hoạt động:

  • input = 4'b???1 → out = 4'b0001
  • input = 4'b??1? → out = 4'b0010
  • input = 4'b?1?? → out = 4'b0100
  • input = 4'b1??? → out = 4'b1000
  • Mặc định → out = 4'b0000

Tự làm thử

module decoder (
  input [3:0] in,
  output reg [3:0] out
);
  
  always @(*) begin
    // TODO: Thêm câu lệnh casez
    // in = 4'b???1 -> out = 4'b0001
    // in = 4'b??1? -> out = 4'b0010
    // in = 4'b?1?? -> out = 4'b0100
    // in = 4'b1??? -> out = 4'b1000
    // default -> out = 4'b0000
  end
  
endmodule
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online