Synthesizable subset: simulator hiểu chưa đủ để có phần cứng

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

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

  • Tách kiểm cú pháp, mô phỏng, generic synthesis và timing của target
  • Dự đoán wiring, state có enable và delay mô phỏng bị bỏ ở synthesis
  • Đọc phạm vi hỗ trợ theo tool/target thay vì học một danh sách cấm tuyệt đối

Tool nào đã trả lời câu hỏi nào?

Một mô hình chạy đúng trên simulator có thể không mô tả phần cứng mà bạn định làm. Parser chỉ xác nhận phần ngôn ngữ nó đã phân tích; simulator thực thi event; synthesis tạo cấu trúc trong flow được chọn. Timing của chip còn cần cell library, constraint và thông tin đường nối.

Vì vậy nhãn parsed, simulated hay synthesized trong ứng dụng là các bằng chứng khác nhau. Không đọc nhãn cuối thành “đã làm ra chip chạy được tần số mục tiêu”. Bài dùng một trường hợp nhỏ có thể đối chiếu cả hành vi lẫn cell count. [1]

Từ mô tả hành vi tới cấu trúc giữ state

Module subset có q 4 bit chỉ cập nhật tại posedge khi enable 1. Khi enable 0, q giữ state; đó là bốn bit lưu trữ có enable, không phải latch nhạy mức. Một for-generate đảo thứ tự bit của d sang reversed chỉ nối lại dây; vòng lặp không thêm bốn clock.

Expected được lập trước: d3 cho reversedc; d5 cho reverseda; da cho reversed 5. Hai cạnh có enable chụp 3 rồi a, một cạnh disabled giữ 3. Mỗi đầu ra đều được dùng để synthesis không xóa state chỉ vì nó không quan sát được.

Elaboration giải quyết generate/parameter trước khi tạo và tối ưu logic. Một cú pháp lặp ngắn có thể yêu cầu nhiều logic, nhưng vòng lặp chỉ đổi thứ tự dây không cần toán tử tính mới. [2]

Generic cell chưa phải cell của công nghệ

Pipeline chạy Yosys generic synthesis và kiểm bốn DFF có enable, không có latch. Các cell nội bộ cho phép kiểm cấu trúc lưu trữ; chúng chưa gắn với một thư viện ASIC hoặc tài nguyên FPGA cụ thể.

Không có dữ liệu để kết luận diện tích micromét vuông, công suất hay slack. Cell count cũng không thay equivalence checking: TB kiểm hành vi RTL của các ca đã viết, còn synth check kiểm cấu trúc theo kỳ vọng. Hai phép kiểm bổ sung nhau và đều có giới hạn. [3]

Một dòng #2 không tạo cell delay 2 ns

Module delay_model có continuous assignment với delay 2 ns. Trong Icarus, xung input 1 ns bị lọc; khi input giữ 1 từ 8 ns, output thành 1 sau thời gian model, và checker tại 11 ns thấy 1.

Nhưng Yosys đọc cùng module rồi tổng hợp thành wiring, không có cell nào. Kết quả không nói phần cứng thực có delay 0; nó nói literal delay trong source này không trở thành ràng buộc delay vật lý của flow đang chạy.

Nếu yêu cầu cần một tín hiệu trễ một chu kỳ, hãy mô tả state và clock phù hợp. Nếu cần kiểm timing cell, dùng mô hình/thư viện và flow timing thích hợp. Không dùng #delay như cách sửa setup/hold hoặc khẳng định tốc độ silicon. [4]

Subset luôn cần tên flow và target

Các bảng “không synthesizable” trong tutorial hữu ích để nhận ra TB và behavioral model, nhưng không thay tài liệu tool. Ví dụ initial có thể được một số flow FPGA dùng để khởi tạo; một biến kiểu time không tự biến mọi biểu thức hằng thành không tổng hợp được; loop phải xét điều kiện và cách tool triển khai.

Khi chưa kiểm, đừng đổi một bảng hướng dẫn thành quy tắc tuyệt đối cho mọi ASIC/FPGA. Bài cũng không thử mọi initial, wait, force hoặc loop biến động. Các quy tắc ngôn ngữ chuẩn còn [5].

Giữ TB tách khỏi tập file RTL gửi synthesis. Chỉ việc simulator chấp nhận một task chờ file không làm nó thành phần cứng đọc filesystem.

Bốn bit state, wiring và một pulse bị lọc

Tính trước chạy: q 3 ở 3 ns, giữ 3 ở 7 ns, qa ở 11 ns; reversed cuối 5. Pulse 1 ns qua model 2 ns cho short 0; input giữ 1 cho settled 1. Generic synthesis phải có 4 DFF/0 latch cho subset,0 cell cho delay_model.

Một mô hình delay không phải cell delay

Kiểm bốn bit state có enable, bit reversal bằng wiring và continuous delay bị bỏ ở generic synthesis.

subset.sv RTL
`timescale 1ns/1psmodule subset(input wire clk, en, input wire [3:0] d, output reg [3:0] q, output wire [3:0] reversed);  genvar i;  generate for (i=0; i<4; i=i+1) begin: g_reverse    assign reversed[i] = d[3-i];  end endgenerate  always @(posedge clk) if (en) q <= d;endmodule
delay_model.sv RTL
`timescale 1ns/1ps// Deliberately a simulation delay, not a physical delay constraint.module delay_model(input wire a, output wire y);  assign #2 y = a;endmodule
tb_subset.sv testbench
`timescale 1ns/1psmodule tb_subset;  reg clk=0, en=1, pulse=0;  reg [3:0] d=3;  wire [3:0] q, reversed;  wire delayed;  integer captures=0, holds=0;  subset dut(clk,en,d,q,reversed);  delay_model model(pulse,delayed);  always #2 clk=~clk;  initial begin #3; pulse=1; #1; pulse=0; #4; pulse=1; end  initial begin    #3;    if(q !== 3 || reversed !== 4'hc) $fatal(1,"first capture/reversal mismatch");    captures=captures+1;    #1; en=0; d=5;    #3;    if(q !== 3 || reversed !== 4'ha || delayed !== 0) $fatal(1,"hold or filtered pulse mismatch");    holds=holds+1;    $display("MODEL SHORT at=7 y=%b",delayed);    #1; en=1; d=4'ha;    #3;    if(q !== 4'ha || reversed !== 5 || delayed !== 1) $fatal(1,"second capture or settled delay mismatch");    captures=captures+1;    if(captures!=2 || holds!=1) $fatal(1,"missing checks");    $display("SUBSET CHECK captures=%0d holds=%0d q=%h reverse=%h",captures,holds,q,reversed);    $display("MODEL SETTLED at=11 y=%b",delayed);    $finish;  endendmodule

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

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Lint -Wall (Verilator 5.050)
  • 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: MODEL SHORT at=7 y=0SUBSET CHECK captures=2 holds=1 q=a reverse=5MODEL SETTLED at=11 y=1

Kỳ vọng sau tổng hợp: subset: $_*DFF* = 4subset: $_*DLATCH* = 0delay_model: * = 0

Kỳ vọng trước chạy: q 3 ởt 3, giữ 3 ởt 7, qa ởt 11; reversed3=c,5=a,a=5. Xung 1 ns qua delay 2 ns bị lọc; input 1 t 8 cho output 1 t 10.

Yosys generic synth:4 bit state và 0 latch; delay_model chỉ wiring 0 cell. Không technology mapping/STA/độ trễ silicon.

Không suy mọi initial/time/loop đều bất khả tổng hợp; phải xét flow và cấu trúc cụ thể.

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.

Parser, lint RTL sạch, Icarus và Yosys đều chạy thật. Lint không được dùng như bằng chứng đo delay của model; flow chưa technology-map hoặc chạy STA. [6]

Tự kiểm tra

Tự kiểm tra: synth-subset

  1. Yosys generic synth của delay_model assign#2 trong bài tạo gì?
  2. Claim synthesized của ví dụ chứng minh điều gì?
  3. Tại 7 ns, en 0, d5 và lần chụp trước là 3. Q và reversed bằng gì?
  4. For-generate đảo bốn bit cần bao nhiêu clock riêng để tính reversed?
  5. Đọc bảng tutorial về synthesizable subset nên làm gì?

Giữ riêng hợp đồng mô phỏng và hợp đồng phần cứng

Với mỗi cấu trúc RTL, hỏi nó giữ state nào, có điều kiện cập nhật gì và tool biến nó thành phần tử nào. Với mỗi kết quả, ghi rõ tool/flow/target và những điều chưa kiểm.

Bài giữ draft/LRM needs-spec-check. Các bằng chứng trên xác nhận đúng ví dụ và flow hiện tại, không tự chứng nhận mọi thiết kế sử dụng cùng từ khóa.

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

  1. Verilog Synthesis — bản chụp trong resources.zip, Quy trình synthesis. Trích dẫn; nguồn đã đọc các mục liên quan.
  2. Verilog Synthesis — bản chụp trong resources.zip, Elaboration và translation. Trích dẫn; nguồn đã đọc các mục liên quan.
  3. Thí nghiệm nguyên bản ex.a8.synth-subset, Phạm vi thí nghiệm. Trích dẫn; nguồn đã đọc toàn văn.
  4. Verilog Synthesis — bản chụp trong resources.zip, Delay constructs. Trích dẫn; nguồn đã đọc các mục liên quan.
  5. 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ở).
  6. Thí nghiệm nguyên bản ex.a8.synth-subset, Output và cấu trúc đã kiểm. Trích dẫn; nguồn đã đọc toàn văn.
  7. IEEE 1800-2023 SystemVerilog LRM, RTL assignments and simulation semantics: synth-subset. Chưa đối chiếu với văn bản nguồn (chưa mở).
  8. Thí nghiệm nguyên bản ex.a8.synth-subset, Source, assertions, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
  9. IEEE 1800-2023 SystemVerilog LRM, Language constructs and simulation semantics; synthesis support is flow-dependent. Chưa đối chiếu với văn bản nguồn (chưa mở).
  10. Verilog Synthesis — bản chụp trong resources.zip, What is synthesis?; How is synthesis done?; Verilog Constructs to Avoid. Trích dẫn; nguồn đã đọc các mục liên quan.
  11. Thí nghiệm nguyên bản ex.a8.synth-subset, subset.sv, delay_model.sv, tb_subset.sv và verification.json. Trích dẫn; nguồn đã đọc toàn văn.