Latch inference: đường không gán cũng mô tả phần cứng
Tiên quyết
- Module A7: Hành vi & ngữ nghĩa mô phỏng: Đang tải
- Module A5: FSM: Đang tải
- Synthesizable subset: simulator hiểu chưa đủ để có phần cứng: Đang tải
Sau bài này bạn sẽ
- Nhận diện yêu cầu giữ giá trị ẩn trong combinational process thiếu đường gán
- Phân biệt latch nhạy mức với FF có enable
- Sửa default theo chức năng mong muốn và kiểm lại cả simulation lẫn synthesis
Không viết assignment không có nghĩa output biến mất
Một process tổ hợp chỉ gán q khi en 1. Khi en 0, giá trị q trước đó vẫn được giữ trong mô phỏng. Để thực hiện đúng hành vi giữ ấy, phần cứng cần state; bạn đã mô tả storage dù không viết từ khóa register nào.
Bài đối chiếu chính cấu trúc thiếu đường với bản có default 0. Chúng được drive cùng stimulus để thấy khác biệt và tổng hợp riêng để kiểm loại phần tử giữ state. [1]
Missing path yêu cầu giữ state
missing_path có always @* if(en) q=d. Q 4 bit ban đầu unknown vì chưa được nạp. Khi mở en và d=a, q thành a. Đóng en rồi đổi d thành 5, q vẫn a; không có assignment mới để xóa hoặc thay giá trị đó.
Đây là latch inference, không phải output tự nhiên thành 0 ở branch thiếu. Phải kiểm từng output, vì một process có thể gán đầy đủ cho tín hiệu này nhưng để thiếu cho tín hiệu khác hoặc một phần vector.
Yosys generic synthesis của module tạo 4 positive-level latch. Bằng chứng này xác nhận state được suy ra trong flow đang chạy; không đo propagation delay hoặc tài nguyên của một FPGA cụ thể. [2]
Trong suốt một mức khác chụp một cạnh
Khi en vẫn 1, đổi d từ 5 sang 3 làm latch theo 3 dù không có cạnh clock. Khi en 0, đổi d thànhf không làm q bỏ giá trị 3. Latch nhạy mức; FF với posedge clk chỉ chụp theo event cạnh trong mô hình của nó.
Thiếu else trong clocked process có thể diễn đạt FF giữ giá trị khi disable, không tự tạo latch. Cần đọc event control trước khi kết luận từ hình dạng if. Cũng không phải latch nào cũng là bug: thiết kế có thể chủ ý cần nó, nhưng phải có timing/verification phù hợp. [3]
Default 0 là một thay đổi chức năng cần có yêu cầu
complete_path gán q 0 đầu mỗi evaluation, sau đó nếu en 1 thì ghi d. Khi en 0, output phải 0, bất kể lịch sử. Bản này không giữ state và Yosys không suy latch/FF.
Nếu yêu cầu thực sự là “giữ dữ liệu lúc disable”, default 0 làm sai chức năng dù lint bớt warning. Trước sửa phải xác định output disabled cần giá trị 0, một giá trị khác, hay state có chủ đích. Không chọn default chỉ để bộ kiểm xanh.
Tương tự, gán q=q không phải một default tổ hợp xóa latch: nó vẫn diễn đạt giữ state. Các quy tắc chuẩn đầy đủ còn [4].
Warning đúng vẫn phải được hiểu
Verilator báo LATCH cho missing_path; metadata giữ warning dự kiến, không tắt nó hoặc tuyên bố module này là combinational sạch. Parse đạt chỉ nói cú pháp hợp lệ. Simulation kiểm được hành vi giữ; synth kiểm được latch count. Mỗi check có một vai trò.
TB drive input rõ sau khi các process @* đã chờ event, rồi mới kiểm. Bản thử đầu chỉ dùng declaration initializer khiến cả output comb còn X ở phép đọc đầu, vì chưa có event như TB đã giả định. Sửa stimulus cho transition rõ ràng, giữ nguyên expected và checker; không đổi unknown thành 0 để che vấn đề. [5]
Sáu ca 4-state và 4 latch so với 0
Tính trước chạy: ban đầu heldXXXX/comb 0; mởena →a/a; đóng đổi 5 →a/0; mở →5/5; đổi 3 →3/3; đóng đổiF →3/0. Sáu ca kiểm bằng case inequality để không bỏ qua X/Z bất ngờ.
Synthesis expected là 4 latch/0 FF ở missing_path,0 latch/0 FF ở complete_path. TB đã chạy Icarus 4-state và lint giữ đúng warning LATCH. Không gọi ví dụ này là STA hoặc bằng chứng mọi latch đều phải loại bỏ. [6]
Tự kiểm tra
Kiểm mọi output ở mọi đường đi
Vẽ yêu cầu output khi các điều kiện đều false; nếu câu trả lời phụ thuộc lịch sử, hãy nhận diện state đó một cách chủ ý. Khi sửa, kiểm lại giá trị và cấu trúc phần cứng, không chỉ đếm warning.
Bài giữ draft/LRM needs-spec-check; những gì đã được xác nhận là sáu ca và các cell check của đúng hai module trong flow hiện tại.
Nguồn và mức độ đối chiếu
- D Latch — bản chụp trong resources.zip, Latch và điều kiện giữ. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a8.latch-inference, Cell check. Trích dẫn; nguồn đã đọc toàn văn.
- D Latch — bản chụp trong resources.zip, What is a D Latch?. Trích dẫn; nguồn đã đọc các mục liên quan.
- IEEE 1800-2023 SystemVerilog LRM, cần đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.a8.latch-inference, Source và check thực. Trích dẫn; nguồn đã đọc toàn văn.
- Thí nghiệm nguyên bản ex.a8.latch-inference, Bằng chứng nguyên bản. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, RTL assignments and simulation semantics: latch-inference. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.a8.latch-inference, Source, assertions, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Procedural assignments; level-sensitive processes; initialization and event sensitivity. Chưa đối chiếu với văn bản nguồn (chưa mở).
- D Latch — bản chụp trong resources.zip, What is a D Latch?; Syntax. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a8.latch-inference, missing_path.sv, complete_path.sv, tb_latch.sv và verification.json. Trích dẫn; nguồn đã đọc toàn văn.