Hazard và glitch: bảng chân trị đúng vẫn có thể phát xung

Khoảng 45 phútMức 2/3Bản nháp: một số khẳng định chưa đối chiếu spec

Sau bài này bạn sẽ

  • Phân biệt static-1, static-0 và dynamic hazard
  • Lần theo hai đường trễ và đọc xung trên waveform thật
  • Giải thích giới hạn của consensus và mô hình timing đã chạy

Đầu ra đúng trước và sau chưa nói hết đoạn giữa

Hàm Y=S·B+S'·C là một mux. Khi B và C đều 1, giá trị ổn định của Y phải là 1 dù S bằng 0 hay 1.

Nhưng hai đường từ S qua cổng trực tiếp và cổng đảo có thể tới đầu ra khác thời điểm. Trong lúc chuyển, cả hai nhánh có thể tạm bằng 0. Một xung thấp ngắn xuất hiện, dù hai đầu trạng thái đều đúng bảng chân trị.

Ba loại diễn biến cần phân biệt

Loại Diễn biến lý tưởng Diễn biến có glitch
Static-1 Giữ 1 1 → 0 → 1
Static-0 Giữ 0 0 → 1 → 0
Dynamic Chuyển một lần Chuyển nhiều lần trước khi ổn định

Hazard nói về khả năng xuất hiện diễn biến ngoài ý muốn do cấu trúc và trễ; glitch là xung/chuyển mức quan sát được trong một điều kiện cụ thể. Bảng chân trị không có thông tin độ rộng xung.

Không phải mọi glitch đều từ cùng một nguyên nhân. Đổi nhiều đầu vào, đường logic hội tụ, reset hoặc tín hiệu không đồng bộ cần được xét theo điều kiện riêng.

Một mô hình trễ có thể tính tay

Dùng mô hình minh họa: inverter của S trễ 3 ns, mỗi AND trễ 1 ns, OR trễ 1 ns. B và C giữ 1. S từ 1 xuống 0 tại 70 ns.

Thời điểm Sự kiện mới Nhánh trực tiếp S·B Nhánh đảo S'·C Y
Trước 70 ns Đã ổn định 1 0 1
70 ns S xuống 0 1 0 1
71 ns AND trực tiếp xuống 0 0 0 1
72 ns OR phản ứng 0 0 0
73 ns Inverter đưa S' lên 1 0 0 0
74 ns AND nhánh đảo lên 1 0 1 0
75 ns OR hồi phục 0 1 1

Xung thấp kéo dài 3 ns. Đây là các delay chọn cho bài học, không phải số đo của một công nghệ chip. Đổi delay hoặc độ rộng xung đầu vào có thể làm kết quả khác; phép gán trễ còn có chính sách xử lý xung của mô hình mô phỏng.

Đối chiếu diễn biến với waveform

Glitch 3 ns và nhánh consensus giữ đầu ra

Trích từ mô phỏng Verilator (VCD) của ex.a2.hazard, không vẽ tay
0123456789101112131415clksfastinv_sslowyy_fixed
  • Cột 3: S đã xuống; hai nhánh phản ứng theo trễ riêng
  • Cột 5: Y thấp từ 72 tới 75 ns
  • Cột 8: Y hồi phục; Y_fixed không phát xung

Mỗi cột là một mẫu cách nhau 1 ns; cột đầu tương ứng 67,5 ns. Clock clk chỉ dùng đặt lưới quan sát của testbench, không phải đầu vào một thanh ghi trong mạch đang học.

Lane fast là nhánh trực tiếp, inv_s là đầu ra inverter, slow là nhánh đảo. Y xuống ở cột 5 và lên lại ở cột 8, đúng các mẫu giữa 72–75 ns. Y_fixed vẫn 1 nhờ nhánh bổ sung sẽ được giải thích ngay sau.

Lưới mẫu giúp nhìn xung này; phép kiểm thời điểm của testbench mới xác nhận hai cạnh ở đúng 72 và 75 ns. Không suy mọi xung giữa các mẫu đều sẽ được hình hiển thị bắt.

Một hạng dư logic có thể nối khoảng trống thời gian

Thêm B·C vào đầu OR: Y_fixed=S·B+S'·C+B·C. Theo luật consensus, hàm ổn định không thay đổi. Khi B và C cùng 1, hạng bổ sung giữ đầu ra 1 trong lúc hai nhánh đổi vai.

Trên K-map của SOP hai mức, hai ô 1 kề nhau có thể được phủ bởi hai tích riêng. Một tích phủ chung cả hai ô giữ đường 1 qua bước chuyển của một biến. Đó là trực giác của việc thêm consensus.

Phân tích này cần điều kiện về cấu trúc và bước đổi đầu vào. Không đem một hạng sửa cho bước S đổi, B/C giữ 1 để khẳng định mọi đổi nhiều biến hoặc mọi mạng nhiều mức đều không glitch.

Tối giản bảng chân trị và tránh hazard là hai mục tiêu có thể dẫn đến số hạng khác nhau. Muốn giữ cấu trúc theo thời gian còn cần quy trình công cụ và xác minh tương ứng.

Đặt rủi ro ở đúng nơi sử dụng tín hiệu

Synthesis có thể bỏ hạng dư hoặc map sang cấu trúc khác; việc thêm consensus trong RTL chưa bảo đảm nó tồn tại như sơ đồ cổng sau mapping.

Trong datapath đồng bộ, chuyển mức phụ có thể không làm sai giá trị được chốt nếu tín hiệu đáp ứng đầy đủ cửa sổ lấy mẫu, gồm setup/hold. Đó là điều phải được kiểm timing, không suy từ một waveform chức năng.

Ở chân clock, reset bất đồng bộ, latch enable hoặc đầu vào bất đồng bộ của khối khác, một xung ngắn có thể kích hoạt hành vi ngoài ý muốn. Không dùng phép AND tùy ý để tạo clock rồi coi đã có clock gating an toàn; cần cấu trúc/cell và điều kiện dùng phù hợp.

Đăng ký đầu ra có thể giúp kiểm soát nơi tín hiệu thay đổi nhưng thêm latency, đồng thời không tự chứng minh reset, CDC hoặc mọi ràng buộc timing đã an toàn. Các chuyển mức phụ cũng có thể tăng năng lượng động; bài này không đo công suất.

Các kết luận cần tránh

  • Chỉ kiểm giá trị sau khi ổn định rồi nói không có glitch.
  • Dùng mô phỏng RTL không có trễ cổng để thay bằng chứng timing vật lý.
  • Gọi một xung trong chu kỳ delta là số đo độ rộng xung thực của silicon.
  • Cho rằng thêm một hạng consensus bảo đảm mọi trường hợp không hazard.
  • Gọi mọi glitch giữa hai flip-flop là vô hại mà chưa kiểm cửa sổ setup/hold.

Khi báo lỗi, ghi đầu vào nào đổi, các đầu vào nào giữ, mô hình delay, điểm đo và tác động lên bên nhận. Chỉ nói “waveform bị nháy” chưa đủ để thiết kế cách sửa.

Lần trễ rồi xét giới hạn

  1. Vì sao Y phải giữ 1 theo bảng chân trị khi B và C bằng 1?
  2. Trong mô hình trên, nếu inverter chỉ trễ 2 ns, cạnh hồi phục sẽ ở đâu và xung thấp rộng bao nhiêu?
  3. Hạng B·C giữ được Y_fixed vì sao, dù không đổi hàm ổn định?
  4. Nếu cả B và C cùng đổi, còn được dùng nguyên lập luận một biến đổi hay không?
  5. Bạn thêm consensus nhưng synthesis loại bỏ. Cần kiểm gì trước khi nói bản netlist đã sửa hazard?

Kiểm tra

Tự kiểm tra: Hazard và glitch: bảng chân trị đúng vẫn có thể phát xung

  1. Trong mô hình đã chạy, Y xuống 72 ns và lên 75 ns. Xung thấp rộng bao nhiêu?
  2. Đầu ra cần giữ 1 nhưng đi 1→0→1 thuộc loại nào?
  3. Với Y=S·B+S’·C, hạng nào giữ đầu ra khi B=C=1 và S đổi?
  4. Một waveform của mô hình trễ đã đủ chứng minh silicon không glitch trong mọi tình huống chưa?
  5. Thêm consensus trong RTL có bảo đảm synthesis giữ nguyên hạng ấy không?

Bằng chứng kiểm chứng

Expected tính trước chạy: HAZARD CHECK stable=8 pulses=1 fall_ns=72 rise_ns=75 width_ns=3 fixed_falls=0 time_ns=110.

Glitch static-1 trong mô hình trễ cổng và nhánh consensus

Kỳ vọng tính trước chạy: HAZARD CHECK stable=8 pulses=1 fall_ns=72 rise_ns=75 width_ns=3 fixed_falls=0 time_ns=110

tb.sv testbench
`timescale 1ns/1psmodule tb_a2_hazard; logic s,b,c,clk=0,armed=0; wire inv_s,fast,slow,bridge,y,y_fixed; assign #3 inv_s=~s; assign #1 fast=s&b; assign #1 slow=inv_s&c; assign #1 bridge=b&c; assign #1 y=fast|slow; assign #1 y_fixed=fast|slow|bridge; logic [7:0] truth=8'hca; int stable_count=0,pulses=0,rises=0,fall_ns=0,rise_ns=0,fixed_falls=0; initial begin #66.5;forever #0.5 clk=~clk;end always @(negedge y)if(armed)begin  pulses++;fall_ns=$time;if($time!=72)$fatal(1,"Hazard falling edge mismatch"); end always @(posedge y)if(armed)begin  rises++;rise_ns=$time;if($time!=75)$fatal(1,"Hazard recovery mismatch"); end always @(negedge y_fixed)if(armed)begin fixed_falls++;$fatal(1,"Consensus output fell");end initial begin  $dumpfile("trace.vcd");$dumpvars(0,tb_a2_hazard);  for(int i=0;i<8;i++)begin   s=1'(i/4);b=1'((i/2)%2);c=1'(i%2);#6;stable_count++;   if(y!==truth[i]||y_fixed!==truth[i])$fatal(1,"Hazard stable function mismatch row=%0d",i);  end  #2;s=1;b=1;c=1;  #10;armed=1;  #10;s=0;  #20;s=1;  #20;  if(stable_count!=8||pulses!=1||rises!=1||fall_ns!=72||rise_ns!=75||rise_ns-fall_ns!=3||fixed_falls!=0||y!==1||y_fixed!==1||$time!=110)$fatal(1,"Hazard experiment contract");  $display("HAZARD CHECK stable=%0d pulses=%0d fall_ns=%0d rise_ns=%0d width_ns=%0d fixed_falls=%0d time_ns=%0d",stable_count,pulses,fall_ns,rise_ns,rise_ns-fall_ns,fixed_falls,$time);  $finish; endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Verilator 5.050, 2-state)
  • Waveform trích từ VCD của lần mô phỏng

Output phải khớp: HAZARD CHECK stable=8 pulses=1 fall_ns=72 rise_ns=75 width_ns=3 fixed_falls=0 time_ns=110

Explicit inertial gate-delay simulation model only; not synthesis, silicon/STA, CDC or universal hazard-free proof.

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-07), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

Tám trạng thái ổn định đối chiếu literal CA. Monitor bật sau khi ổn định, đếm chính xác một cạnh xuống/một cạnh lên của Y và không cạnh xuống của Y_fixed. Giữ thêm lượt S lên tại 90 ns, kết thúc 110 ns. Clock quan sát có cạnh đầu 67 ns, đủ biên cho 16 cột VCD.

Pipeline đầu từ chối Icarus kèm traced trước khi chạy vì chưa hỗ trợ trích trace ở nhánh đó. Kiểm sự kiện Icarus 11 riêng không trích trace đã đạt cùng expected. Giữ ba claim/kỳ vọng, chuyển metadata sang nhánh Verilator 5.050 hỗ trợ trace: parsed/simulated/traced đạt, VCD khớp từng cột. Không sửa verifier hoặc giảm hợp đồng để có PASS.

Đây là mô hình continuous assignment có trễ, không phải RTL synthesis hoặc đo silicon. Initial/X/Z, mọi input transition, điện áp, metastability, physical CDC, STA và hiệu lực sau mapping chưa được chứng minh. LRM về delay/scheduling còn chờ đối chiếu.

[1] [2] [3]

Nguồn và mức độ đối chiếu

  1. Hazards & Glitches — bản chụp resources.zip, Types of Hazards; Anatomy of a Static-1 Hazard; Finding and Removing Hazards on a K-Map; Why Hazard Fixes Rarely Survive. Trích dẫn; nguồn đã đọc các mục liên quan.
  2. Thí nghiệm nguyên bản A2.hazard, Eight stable truth rows, exact delayed pulse edges, consensus output and sixteen sampled VCD columns. Trích dẫn; nguồn đã đọc toàn văn.
  3. IEEE 1800-2023 SystemVerilog LRM, Net declaration and continuous assignment delays, inertial scheduling, event observation and simulation time — chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).