算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
rtl-design【设计与创意】SystemVerilog RTL design — module planning, coding standards enforcement, lint checking, CDC/RDC analysis, and synthesis readiness verification. Use when writing, reviewing, or debugging RTL for ASIC or FPGA targets, or when checking an existing RTL package for synthesis readiness.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
When this skill is loaded and a user presents an RTL design task, do not
execute stages directly. Immediately spawn the
digital-chip-design-agents:rtl-design-orchestrator agent and pass the full
user request and any available context to it. The orchestrator enforces the stage
sequence, loop-back rules, and sign-off criteria defined below.
Use the domain rules in this file only when the orchestrator reads this skill mid-flow for stage-specific guidance, or when the user asks a targeted reference question rather than requesting a full flow execution.
Before executing or advising on any stage, read the following files if they exist:
memory/rtl-design/knowledge.md — known failure patterns, successful tool flags, PDK/tool quirks.
Incorporate its guidance into every stage decision. If absent, proceed without it.memory/rtl-design/run_state.md — current run identity (run_id, design_name, tool,
last_stage). Use this to resume correctly after interruption. If absent, a new run
is starting; the orchestrator will create this file before the first stage.This pre-run read applies whether this skill is loaded by a user or called by the orchestrator mid-flow. It ensures the fix database is consulted before any diagnosis step.
Guide RTL development from module hierarchy planning through lint-clean, CDC-clean, synthesis-ready RTL. Enforces industry-standard SystemVerilog coding practices and produces a signed-off RTL package ready for simulation and synthesis handoff.
verilator --lint-only) — fast lint and simulationslang) — modern, standards-compliant SV parser and elaborator; lint with
slang -Weverything --ignore-unknown-modules (full elaboration — see lint_check rule 6)surelog) — SystemVerilog pre-processor and front-end for Yosyssv2v) — SystemVerilog-to-Verilog converter; the front-end check (lint_check
rule 15) parses its output with the tool that consumes itiverilog) — Verilog/SV simulator for quick sanity checksspyglass, dialect synopsys) — lint, CDC, RDC, and clock-domain analysisjg, dialect cadence) — formal CDC verificationvsim, dialect siemens) — CDC analysis and sign-offScope: the rules in this stage govern synthesisable RTL. Testbenches (*_tb.sv, tb_*.sv,
anything under tb/), bind-only assertion files and simulation-only behavioural models are
out of scope — initial, #delay and blocking assignments are correct there, and the
functional-verification skill carries the coding rules for them.
logic type (not wire/reg distinction)default_nettype none at top of every fileclk_[domain]rst_n_[domain] (active-low) or rst_[domain]signal_n suffixsignal_q suffixsignal_d suffixUPPER_SNAKE_CASElower_snake_case_i / _o suffixes are permitted, not requiredPrecedence: these conventions are this suite's project standard for new RTL. When modifying an existing file, match that file's conventions instead — one block in a different style is a worse outcome than the deviation — and record the difference as informational, not as a lint finding.
initial blocks for logic in ASIC RTL. One exception: an elaboration-time parameter
assertion (initial + $fatal on an illegal parameter value), wrapped in
// synthesis translate_off / // synthesis translate_on so it is never read as
synthesised logic. A parameterised block must refuse to elaborate on a value it cannot
implement (e.g. a gray-coded FIFO at a non-power-of-two depth) rather than build broken logiccasex; casez only with a written justification; no full_case / parallel_case
pragmas. Write don't-care decodes as explicit case itemsdesign_state.constraints.timing.fanout_max (default: 32) for buffering intent review_q suffix at each stagecase with a default arm that goes to a recovery or error state.
Illegal states are reachable in silicon (SEU, X during bring-up); the FSM must not wedgeunique case with no default, plus a concurrent assertion that covers
illegal-state recovery. Keeps the simulation/formal uniqueness checkunique case together with default: unique asserts the illegal state cannot
occur, default exists to recover when it does (slang: -Wcase-redundant-default)RTL that blocks scan is cheapest to fix here; the DFT flow can only report it after insertion.
assign gclk = clk & en;): flops behind one are unreachable in
scan mode. Use a flop enable, or a library clock-gate cell with a test-enable input (Power
Intent rule 5)scan_mode bypass to the top-level resetlint_waivers.csv, never inferred from RTLApply these rules for every clock domain. Read clock_power_budget from the architecture
hand-off package. For orchestrated Architecture → RTL runs, the clock_power_budget table
is a required handoff contract; if missing, treat as a handoff violation and abort with a
clear error directing the user to notify upstream packaging. For non-orchestrated or local
RTL-only runs, classify domains using toggle-count estimates from Verilator simulation as
a fallback.
design_state.constraints.power.activity_factors.default (default: 0.15) from architecture, or toggle rate below that threshold from Verilator): insert an ICG cell (CLKGATETST_X* or technology-equivalent) at the outermost clock enable boundary. Do not rely on synthesis to infer clock gates — explicit ICG insertion at RTL is required.activity_factors.default ≤ α < activity_factors.high (defaults: 0.15–0.40)): insert ICG at the sub-block level for any register file or datapath wider than 32 bits.activity_factors.high (default: 0.40), or documented as always-on in architecture hand-off):
no ICG required; add a /* always-on: <reason> */ comment at the clock port declaration.CLKGATETST_* for testability with
scan-enable override); do not use behavioural if (enable) clk_gated = clk constructs.clock_gating_coverage:
coverage = (register bits behind an ICG) / (total register bits in domain) × 100%
Report this metric in the rtl_signoff output.| Tool | Type | Use |
|---|---|---|
| Verilator | Open-source | Toggle coverage → activity factor for gating classification |
| SpyGlass (Synopsys) | Proprietary, dialect synopsys | RTL power lint, missing ICG detection |
| VC Static (Synopsys) | Proprietary, dialect synopsys | Power-intent rule checking |
| Questa PowerPro (Siemens) | Proprietary, dialect siemens | Formal power analysis |
rtl_signoff) now, not at sign-offclock_gating_coverage metric per domain (appended to sign-off record)A lint tool reports on the files it was given. This stage checks that those are the intended files before any lint message is read as a statement about the RTL. It edits nothing: its only outputs are a report and a PASS or FAIL.
X beside X_v2, X_old, X_bak, or
parallel version directories that hold the same file names.f filelist, run check_design_inputs.py (in this skill's
directory) and report its JSON:
python3 check_design_inputs.py <filelist.f> --root <design root> [--env NAME=VALUE] [--generated OUT_DIR=SOURCE].
It applies rules 2, 3 and 5, rule 4's age check for each --generated pair, and rule 8
with --rtl-dir and --list. Rule 1, and any flow driven by a vendor project file instead
of a .f filelist, is checked by hand against the rules abovefailure_class: "input_setup", suggested_next_step: "escalate", the file, both absolute paths and the
line to change. Never loop back to rtl_coding — the one exception is rule 8's
registration of a module this run addedmake -s --eval='print-%:;@echo $($*)' print-<VAR> > <var>.f), and run
python3 check_design_inputs.py <filelist.f> --rtl-dir <rtl dir> --list <name>=<file> ... [--exempt <list>:<module>]. Each module_not_in_list is an ERROR naming the list and the
file. Exempt a module only with a stated reason (a simulation-only model absent from the PD
list). This is the one design_input_check failure that is not escalated: when the module
was added by this run, adding it to the list is this run's job — a list edit, no RTL edit.
A pre-existing module missing from a list, or a list you cannot edit, is input_setup per
rule 7failure_class: "input_setup"lint_waivers.csvslang -Weverything --ignore-unknown-modules <files>.
Never pass --lint-only — it skips elaboration and silently drops inferred-latch and
multiple-driver diagnostics, both ERROR level here, so a latch reports as clean. -Wall is
not a slang option. Verilator is unaffected: verilator --lint-only -Wall is correctdesign_input_check rule 8), not a stubUNVERIFIED. A clean lint run proves nothing about
CDC, reset sequencing, FSM reachability, protocol deadlock or arithmetic overflowBLOCKER / HIGH → ERROR, MEDIUM → WARNING, LOW / INFO → informationalnull, never 0 — and the result is
not evidence about the RTL. Such a run is never classified functionalinput_setup — escalate, edit no RTL) when: duplicate-declaration and
undeclared-identifier fatals appear in the same run (two generations of a generated header
on the include path); a message names two paths for one file; an include or source file is
not found; or the fatal is in a file this run did not write. Deleting the "duplicate" port
or declaring the "undeclared" signal silences the message and corrupts correct RTL. Only a
parse error in a file this run wrote or changed, with design_input_check passing on the
current input set, goes back to rtl_coding — as malformed output (tool_error), to
repair the syntax and nothing elsespecify
blocks and vendor primitives, an expected floor to waive once with the model named; (c)
findings in the RTL itself, which are the ones the levels in rules 1–2 apply to. A flow
wrapper's non-zero exit is not "lint failed": a wrapper may gate on log text and fail a run
in which the lint tool reported 0 errors. Read the tool's own error countsv2v <files> > out.v && yosys -q -p 'read_verilog out.v; hierarchy -check -top <top>'
(read rule 8 stubs first with read_verilog -lib <stubs>). Report it as its own gate with
the command and exit status. A construct legal in SystemVerilog and illegal in Verilog-2005
(IEEE 1364) — a part-select on a function-call result, f(x)[N-1:0], is the canonical
case; assign the result to a named signal and select from that — passes lint and the whole
regression and fails only here. Fix the source construct, never the converted file. No
conversion tool available: report the gate NOT RUNUNVERIFIED under rule 9, appended to the
unverified-claims list in this stageUNVERIFIED cdc (or reset) claim — append one entry per crossing to the
unverified-claims list in this stage, naming the synchroniser you relied on. Downstream
formal and verification can then check each onertl_coding (lint_check rule 15). A black box (undefined module) that resolves to
first-party RTL is a missing source-list entry (design_input_check rule 8); one with no
first-party RTL is a missing library or macro view — escalate as input_setuphierarchy -check: no error, no undefined moduledesign_state.constraints.timing.wns_ns_target, default: 0)UNVERIFIED/* always-on: <reason> */clock_gating_coverage ≥ design_state.constraints.power.gating_coverage_pct_min% for high-opportunity domains (default: 60%); reported in sign-off recordUNVERIFIED conclusion from code review, lint and CDC, one
entry per claim as {module, category, claim} with category one of cdc, reset, fsm,
protocol, arithmetic, parameter. Include one fsm entry for every FSM that uses
unique case without default, naming its recovery assertion. This list is the hand-off to
verification and formal — a claim left off it is a claim nobody downstream will check. An
empty list must be stated as empty, not omitted. The list is built up by rtl_coding,
lint_check and cdc_rdc_analysis as each stage reaches its conclusions; this stage
completes it. It is handed off on every termination path, including a run that stops
before this stage or withholds signoff — a run that never reaches sign-off still hands over
every claim it madeSee plugins/meta/skills/pipeline-orchestration/SKILL.md §Constraints Schema for the authoritative schema and stage-entry validation rule.
Required at entry (module_planning) — hard-fail if missing:
constraints.clock.clk_mhz — target frequency for synth_check timing evaluationOptional (schema defaults apply when absent):
constraints.timing.fanout_max (default: 32) — high-fanout thresholdconstraints.timing.wns_ns_target (default: 0) — WNS sign-off targetconstraints.power.gating_coverage_pct_min (default: 60%) — ICG coverage targetconstraints.power.activity_factors (defaults: {default: 0.15, high: 0.40}) — domain classificationAfter each stage completes (regardless of whether an orchestrator session is active),
write or overwrite one JSON record in memory/rtl-design/experiences.jsonl keyed by
run_id. This ensures data is persisted even if the flow is interrupted or called
without full orchestrator context.
Use run_id = rtl-design_<YYYYMMDD>_<HHMMSS> (set once at flow start; reuse on each
stage update). Set signoff_achieved: false until the final sign-off stage completes.
Write memory/rtl-design/run_state.md as the first action before launching any tool:
run_id: rtl-design_<YYYYMMDD>_<HHMMSS>
design_name: <design>
tool: <primary tool>
start_time: <ISO-8601>
last_stage: null
Update last_stage to the completed stage name only after each stage finishes successfully. This file lets wakeup-loop prompts
and resumed sessions identify the correct run without relying on in-memory state.
Create the file and parent directories if they do not exist.
If mcp__plugin_ecc_memory__add_observations is available in this session, emit each
applied fix as an observation to entity chip-design-rtl-design-fixes after writing to
experiences.jsonl. Skip silently if the tool is absent — JSONL is the canonical record.
If the hdl-rtl-skill skills (rtl-style-guide, rtl-golden-templates, rtl-anti-patterns,
rtl-review-signoff, rtl-workflow) are available in this session, use them alongside this
skill: its rtl-lint script as the slang runner at lint_check (it applies rules 6–8 and
reports the severities mapped by rule 11), its golden templates as the starting point at
rtl_coding for FIFOs, synchronisers, arbiters, FSMs and ready/valid stages, and its
anti-pattern catalogue during code review. The rules in this file are the project standard
its style guide defers to, so where the two differ — clock/reset naming, _i/_o — follow
this file. Skip silently if it is absent — every rule above stands on its own.