Menu
CoddyTech

Phép gán chặn

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 49 trên 90.

Verilog có hai loại phép gán thủ tục: phép gán blocking (=) và phép gán non-blocking (<=). Trong bài học này, chúng ta tập trung vào phép gán blocking.

Phép gán blocking dùng toán tử =. Phép gán này được gọi là “blocking” vì nó chặn việc thực thi câu lệnh tiếp theo cho đến khi phép gán hiện tại hoàn tất. Code chạy từng bước theo đúng thứ tự.

Cú pháp:

variable = expression;

Khi nào nên dùng phép gán blocking

Phép gán blocking (=) được dùng cho logic tổ hợp: các mạch có đầu ra thay đổi ngay khi đầu vào thay đổi, không có xung nhịp và không có bộ nhớ.

Ví dụ về logic tổ hợp:

  • Cổng AND / OR / XOR
  • Bộ cộng và bộ trừ
  • Bộ ghép kênh
  • Bộ giải mã

Ví dụ về Verilog:

always @(*) begin
  sum = a + b;      // Phép gán chặn
  carry = a & b;    // Phép gán chặn
end

Phép gán blocking trong khối always (logic tổ hợp)

always @(*) begin
  temp = a & b;    // Bước 1
  out = temp | c;  // Bước 2 (dùng temp từ bước 1)
end

Thứ tự rất quan trọng. Điều này ổn với logic tổ hợp.

Chặn và không chặn

 Chặn (=)Không chặn (<=)
Thực thiLần lượtĐồng thời
Dòng tiếp theo phải chờ?CóKhông
Cách dùngLogic tổ hợpLogic tuần tự (flip-flop)

Quan trọng: Không dùng phép gán blocking cho flip-flop

challenge icon

Thử thách

Thêm các phép gán blocking còn thiếu để hoán đổi giá trị của x và y bằng một biến tạm.

Cần làm:

  1. Gán giá trị của x cho temp (lưu x vào temp)
  2. Gán giá trị của y cho x (chuyển y vào x)
  3. Gán giá trị của temp cho y (chuyển x đã lưu vào y)

Tự làm thử

module swap;
  reg x, y;
  reg temp;
  
  initial begin
    x = 1;
    y = 0;
    
    $display("Before swap: x=%d, y=%d", x, y);
    
    // TODO: Bước 1: Gán x cho temp
    
    // TODO: Bước 2: Gán y cho x
    
    // TODO: Bước 3: Gán temp cho y
    
    $display("After swap: x=%d, y=%d", x, y);
    $finish;
  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