Simulation và synthesis: sensitivity thiếu có thể biến mất khỏi netlist

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

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

  • Làm lộ explicit sensitivity thiếu khi input khác thay đổi
  • Phân biệt RTL event model với hàm logic mà synthesis xây dựng
  • Đọc kết quả netlist functional simulation mà không suy ra timing silicon

Hai tool có thể đang trả lời hai mô hình khác nhau

RTL chỉ chạy always@(a) khi a đổi, dù thân tính a&b. Synthesis có thể xây AND phụ thuộc cả a và b. Khi chỉ b đổi, RTL stale nhưng netlist logic cập nhật. Đây là mismatch cấu trúc mô hình, không phải một glitch vật lý hoặc kết luận simulator nói dối.

Event list thiếu là bug của mô tả tổ hợp

TB drive 00, rồi 01, rồi 11; cả hai bản có kết quả đúng. Tiếp theo chỉ b đổi về 0 trong khi a vẫn 1. Module omitted không được đánh thức nên giữ 1; complete dùng continuous assignment cho 0. Chỉ so kết quả tại những thời điểm a cũng đổi sẽ bỏ sót lỗi.

Yosys giả định logic tổ hợp của thân process

Flow tổng hợp cả omitted và complete thành một AND mỗi top, không FF/latch. Thứ giữ giá trị cũ trong simulation do không evaluation không đồng nghĩa một latch được yêu cầu theo cách synthesis diễn giải ví dụ này. Cần đọc diagnostic và kết quả tool thực, không dùng một quy tắc suy luận chung cho mọi process.

Đối chiếu thêm netlist đã sinh

Probe riêng thực sự xuất generic netlist từ Yosys rồi biên dịch bằng Icarus. Sau a1/b1, chỉ đổi b0, netlist cho y 0. Đây là kiểm chức năng netlist của đúng stimulus, không phải chứng minh equivalence hoặc STA. Pipeline example giữ claim mô phỏng RTL và cell checks riêng; probe không tự trở thành chứng nhận mọi timing target. [1]

Model gap không cho phép diễn giải sai NBA

Zero-delay chức năng không mô hình clock-to-q/setup/hold của cell. Nhưng không được vì thế nói hai NBA một writer ở cùng cạnh chỉ “thường” thấy state cũ tùy thứ tự; lịch NBA đã được kiểm ở A7 trong contract ấy. Nguồn đào tạo dùng để phân biệt abstraction, các ví dụ race/độ trễ tổng quát phải được đối chiếu lại. Zero-delay cũng không đồng nghĩa unit-delay. [2]

Năm observation và điểm khác biệt chỉ-b

Expected trước chạy gồm 00→0,01→0,11→1; b0 làm bad 1/good 0; đổi a0 phục hồi 0.

Thí nghiệm sim-vs-synth

Trước chạy:00 ->both 0;01 ->0;11 ->1; chỉb 0 ->bad giữ 1/good 0; a0 khôi phục 0,5 quan sát.

sensitivity.sv RTL
`timescale 1ns/1psmodule omitted(input wire a,b,output reg y);  always @(a) y=a&b;endmodulemodule complete(input wire a,b,output wire y);  assign y=a&b;endmodule
tb_mismatch.sv testbench
`timescale 1ns/1psmodule tb_mismatch;  reg a,b;  wire bad,good;  omitted old_style(a,b,bad);  complete dataflow(a,b,good);  initial begin    #0;a=0;b=0;#1;    if(bad!==0||good!==0) $fatal(1,"initial mismatch");    b=1;#1;    if(bad!==0||good!==0) $fatal(1,"zero AND mismatch");    a=1;#1;    if(bad!==1||good!==1) $fatal(1,"a event mismatch");    b=0;#1;    if(bad!==1||good!==0) $fatal(1,"omitted sensitivity not exposed");    $display("MISMATCH RTL only_b_changed stale=%b complete=%b",bad,good);    a=0;#1;    if(bad!==0||good!==0) $fatal(1,"resync mismatch");    $display("MISMATCH CHECK observations=5 restored=0");    $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 (Icarus Verilog 11.0, 4-state)
  • Tổng hợp, số cell khớp kỳ vọng (Yosys 0.70)

Output phải khớp: MISMATCH RTL only_b_changed stale=1 complete=0MISMATCH CHECK observations=5 restored=0

Kỳ vọng sau tổng hợp: omitted: $_*DFF* = 0omitted: $_*DLATCH* = 0omitted: $_AND_ = 1complete: $_*DFF* = 0complete: $_*DLATCH* = 0complete: $_AND_ = 1

Icarus kiểm explicit sensitivity; Yosys giả định combinational và tổng hợp 1 AND mỗi top. Chưa claim post-synth equivalence hoặc silicon timing từ cell count.

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

Bài chọn Icarus cho event model đã thử; không đổi simulator chỉ để tránh symptom. Sửa đúng là mô tả combinational đầy đủ bằng cấu trúc phù hợp, rồi kiểm lại cả RTL và flow synthesis. [3]

Tự kiểm tra

Tự kiểm tra: sim-vs-synth

  1. A1/B1 rồi chỉ B về 0, RTL omitted và complete cho gì?
  2. Probe generic netlist thật sau thay đổib 0 cho y gì?
  3. Sửa nguyên nhân mismatch trong mô hình combinational nên làm gì?
  4. Generic netlist simulation không delay có chứng minh setup/hold không?
  5. Hai process NBA một writer/state ở cùng cạnh có chỉ thường đọc state cũ tùy thứ tự không?

Kiểm input đổi độc lập trước khi tin netlist giống RTL

Tách ba câu hỏi: RTL process được đánh thức khi nào, synthesis xây hàm gì, physical timing yêu cầu gì. Một check thành công không trả lời thay hai câu còn lại. Bài giữ draft/LRM needs-spec-check.

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

  1. Thí nghiệm nguyên bản ex.a8.sim-vs-synth, Bằng chứng và giới hạn. Trích dẫn; nguồn đã đọc toàn văn.
  2. chipverify_com_rtl_synthesis_simulation_vs_reality — bản chụp trong resources.zip, Abstraction của RTL. Trích dẫn; nguồn đã đọc các mục liên quan.
  3. Thí nghiệm nguyên bản ex.a8.sim-vs-synth, Code nguyên bản. Trích dẫn; nguồn đã đọc toàn văn.
  4. IEEE 1800-2023 SystemVerilog LRM, sim-vs-synth language semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  5. Thí nghiệm nguyên bản ex.a8.sim-vs-synth, Source/assertions/verification.json và probe ghi rõ trong bài. Trích dẫn; nguồn đã đọc toàn văn.
  6. IEEE 1800-2023 SystemVerilog LRM, sim-vs-synth semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  7. chipverify_com_rtl_synthesis_simulation_vs_reality — bản chụp trong resources.zip, Why Zero-Delay Models Exist. Trích dẫn; nguồn đã đọc các mục liên quan.
  8. Thí nghiệm nguyên bản ex.a8.sim-vs-synth, Source, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.