Coding style: chức năng giống nhau, PPA phải đo riê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ẽ
- Phân biệt cấu trúc viết ở RTL với netlist sau tối ưu
- Giữ carry và latency khi đổi thứ tự mux với toán tử
- Đánh giá kết luận resource sharing theo report và constraint thực
Một dòng code không phải một cell
Hai công thức đều chọn tổng a+b hoặc c+d theo sel. Công thức đầu viết hai phép cộng rồi chọn kết quả; công thức sau chọn hai operand rồi cộng. Cả hai có thể cùng ngắn, nhưng số toán tử trong text không phải báo cáo diện tích sau tối ưu.
Nguồn đào tạo dùng ví dụ resource sharing để gợi cách nghĩ về cấu trúc. Bài tự kiểm chức năng và giới hạn những gì có thể kết luận khi chưa có thư viện, timing constraint hoặc số liệu target. [1]
Chọn kết quả hay chọn operand
parallel_sums mô tả hai tổng 5 bit rồi mux. selected_sum mux cặp a/b hoặc c/d trước, sau đó thực hiện một phép cộng trong biểu thức RTL. Sel 1 phải chọn a+b ở cả hai module; sel 0 phải chọn c+d.
Đưa mux trước toán tử là một cách diễn đạt khả năng chia sẻ, nhưng optimizer còn được biến đổi mạch trong phạm vi flow. Không khẳng định mỗi dấu cộng luôn sống nguyên thành một cell adder cuối cùng, hoặc tool luôn tự tìm cùng cấu trúc từ hai mô tả.
Hai đầu ra đều là combinational, không có clock hoặc state. Nếu chuyển một kiểu sang pipeline để đạt timing, latency và hợp đồng interface đã đổi; đó không còn là thay style thuần túy.
Tương đương phải giữ cả width và thời điểm
Mỗi operand 4 bit được mở rộng thêm 0 trước phép cộng, để giữ tổng tối đa 15+15=30 trong 5 bit. Biến output rộng 5 không phải lý do để bỏ qua cách xác định width/sign của biểu thức khi đổi code.
TB chọn toàn bộ 65536 bộ a,b,c,d, thử cả hai giá trị sel. Oracle lấy bốn chữ số cơ số 16 từ index và tính tổng integer tương ứng, rồi so với cả hai output. Việc thử đủ 0/1 không chứng minh tương đương khi sel hoặc operand có X/Z; đó là một miền ngữ nghĩa khác cần kiểm riêng. [2]
RTL schematic khác optimized netlist
Sơ đồ ban đầu thường phản ánh nhánh if/mux/toán tử mà front-end nhận ra. Tối ưu có thể xóa điều kiện dư, gom toán tử hoặc chuyển cấu trúc. Vì vậy đếm box trên RTL view rồi kết luận area cuối thường không đủ.
Trong thí nghiệm, Yosys tổng hợp cả hai top và xác nhận không có FF/latch. Đó là kiểm đúng cho ý định combinational; nó không đo hai thiết kế đã dùng cùng số cell tổng hoặc cùng delay. Các report trung gian và report cuối cần được giữ nhãn để người đọc biết đang so cái gì. [3]
Chia sẻ resource không tự bảo đảm timing
Đặt mux trước adder làm đường dữ liệu đi qua mux rồi arithmetic; tính song song rồi mux đặt lựa chọn ở vị trí khác. Trực giác ấy hữu ích để đề xuất phương án, nhưng delay cuối còn phụ thuộc width, mapping, cell drive, fanout và routing.
Không suy “style B luôn nhỏ hơn” hoặc “style A luôn nhanh hơn” từ một hình vẽ tutorial. Khi có target, so cùng function, latency, clock/reset/enable contract và constraint; xem area/slack/power report của đúng flow. Nếu chưa đo, ghi là giả thuyết thiết kế.
Bài chưa chạy STA, power analysis hoặc công nghệ FPGA/ASIC cụ thể. Nó cũng không dùng hai kết quả đúng để tuyên bố mọi cách viết mux với toán tử đều tương đương.
Vét cạn 131072 vector nhị phân
Kỳ vọng trước chạy là 16^4×2=131072 lượt, output cuối 30 và không có state trong hai netlist generic. Mỗi vector phải khớp oracle; không chỉ so hai DUT với nhau, vì hai DUT có thể cùng mắc lỗi.
MULTITOP là warning dự kiến do file chứa hai top độc lập, vẫn kiểm tập mã warning chính xác. Parser/Icarus/Yosys đạt các claim của ví dụ. [4]
Tự kiểm tra
So chức năng trước, so chi phí sau
Trước khi đổi style, ghi function, width/sign và latency. Sau đó kiểm tương đương trong miền input cần thiết; chỉ dùng report của flow target để kết luận chi phí hoặc timing.
Bài giữ draft/LRM needs-spec-check; kết quả exhaustive nhị phân không thay mọi quy tắc biểu thức chuẩn hoặc báo cáo PPA chưa có.
Nguồn và mức độ đối chiếu
- Verilog Coding Style Effect — bản chụp trong resources.zip, Resource Sharing. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a8.coding-style, Phạm vi oracle. Trích dẫn; nguồn đã đọc toàn văn.
- Verilog Coding Style Effect — bản chụp trong resources.zip, RTL Schematic vs Optimized Netlist. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a8.coding-style, 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: coding-style. 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.coding-style, Source, assertions, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Expression width and conditional operator semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Verilog Coding Style Effect — bản chụp trong resources.zip, RTL Schematic vs Optimized Netlist; Resource Sharing. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a8.coding-style, styles.sv, tb_styles.sv và verification.json. Trích dẫn; nguồn đã đọc toàn văn.