算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
fpga-emulation【设计与创意】FPGA prototyping — ASIC-to-FPGA RTL adaptation, multi-FPGA partitioning, synthesis and timing closure on FPGA, hardware bring-up, and software validation on the prototype. Use when porting an ASIC design to Xilinx or Intel FPGA for pre-silicon software development and hardware validation.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
digital-chip-design-agents:fpga-orchestrator agent and pass the full user
request and any available context. Do not execute stages directly.fpga-orchestrator mid-flow: do not spawn a new agent.
Treat this file as read-only — return the requested stage rules, sign-off
criteria, or loop-back guidance to the calling orchestrator.Spawning the orchestrator from within an active orchestrator run causes recursive delegation and must never happen.
Before executing or advising on any stage, read the following files if they exist:
memory/fpga/knowledge.md — known failure patterns, successful tool flags, PDK/tool quirks.
Incorporate its guidance into every stage decision. If absent, proceed without it.memory/fpga/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.
Port an ASIC design to an FPGA prototype platform for pre-silicon hardware/ software co-development. The FPGA prototype is not cycle-accurate but provides functional and architectural validation months before silicon.
yosys) — open-source synthesis for Xilinx/Intel/Lattice FPGA targetsnextpnr-xilinx, nextpnr-ice40, nextpnr-ecp5) — place-and-route for open-source flowsopenFPGALoader) — universal FPGA programmervivado, dialect xilinx) — synthesis, implementation, and bitstream generation for AMD/Xilinxquartus_sh, dialect intel) — synthesis and programming for Intel/Altera FPGAslibero, dialect microchip) — synthesis and programming for PolarFire/SmartFusion FPGAssynopsys) — FPGA synthesis front-end targeting multiple device families| ASIC Element | FPGA Replacement |
|---|---|
| SRAM macros | BRAM/URAM (Xilinx) or M20K (Intel) |
| Analog PLLs | MMCM (Xilinx) or ALTPLL (Intel) |
| IO pad cells | FPGA IOB + IOBUF primitives |
| Analog/mixed-signal | Stub model or remove |
| DFT scan logic | Remove — not needed on prototype |
| Power management cells | Remove — FPGA handles internally |
XPM_MEMORY (Xilinx) or equivalent portable macroslint_check ERROR rules (latches, multiple
drivers, undriven outputs). Re-lint after every edit, including edits made on a loop-back
from fpga_synthesis, bring_up or sw_validationinitial blocks are permitted for FPGA memory and register initialisation, but only in
FPGA-only files or under an FPGA-specific `ifdef — the ASIC source must stay free of
themXPM_MEMORY, MMCM, BUFG, IOBUF) are unknown modules to an
open-source linter. Lint with unknown modules ignored and treat undriven-net findings on
their outputs as stub artefacts, not errorsdesign_state.constraints.fpga.lut_util_pct_max% LUT (default: 70%) — leave room for ILA debug coresdesign_state.constraints.fpga.lut_util_pct_max% (default: 70%), BRAM < design_state.constraints.fpga.bram_util_pct_max% (default: 80%), DSP < design_state.constraints.fpga.dsp_util_pct_max% (default: 80%)design_state.constraints.timing.wns_ns_target (default: 0) at prototype frequencydesign_state.constraints.fpga.lut_util_pct_max% (default: 70%), BRAM < design_state.constraints.fpga.bram_util_pct_max% (default: 80%), DSP < design_state.constraints.fpga.dsp_util_pct_max% (default: 80%)| Technique | When to Apply |
|---|---|
| Reduce clock frequency | First option — accept slower prototype |
| Add pipeline registers | When path identifiable and latency increase acceptable |
| Pblock constraints | Co-locate logic near BRAMs/DSPs |
| BUFG on high-fanout net | Break long high-fanout routes |
| phys_opt –directive AggressiveExplore | Last resort |
design_state.constraints.timing.wns_ns_target (default: 0) at prototype frequencydesign_state.constraints.fpga.lut_util_pct_max% (default: 70%), BRAM < design_state.constraints.fpga.bram_util_pct_max% (default: 80%), DSP < design_state.constraints.fpga.dsp_util_pct_max% (default: 80%)| Symptom | Likely Cause | Fix |
|---|---|---|
| MMCM lock never sets | PLL input freq out of range | Recheck MMCM config |
| CPU never outputs UART | Wrong reset vector or memory map | Check linker script |
| Register reads 0x00000000 | Base address wrong in SW | Compare memory_map.h vs HW |
| Register reads 0xDEADBEEF | Out-of-range access → DECERR | Fix address in driver |
| Intermittent data corruption | CDC issue in adapted RTL | Review clock crossings |
| Test | Pass Criteria |
|---|---|
| BSP | All peripherals accessible |
| Driver unit | 100% per driver |
| System | Correct output vs golden |
| Long-run (4 hr) | 0 lockups, 0 unexpected resets |
See plugins/meta/skills/pipeline-orchestration/SKILL.md §Constraints Schema for the authoritative schema and stage-entry validation rule.
Required at entry (rtl_adaptation) — hard-fail if missing:
constraints.clock.clk_mhz — ASIC target clock frequency; used to compute FPGA prototype frequency scale-down ratioOptional (schema defaults apply when absent):
constraints.timing.wns_ns_target (default: 0) — WNS closure threshold at prototype frequencyconstraints.fpga.lut_util_pct_max (default: 70) — per-FPGA LUT utilisation ceiling %constraints.fpga.bram_util_pct_max (default: 80) — per-FPGA BRAM utilisation ceiling %constraints.fpga.dsp_util_pct_max (default: 80) — per-FPGA DSP utilisation ceiling %After each stage completes (regardless of whether an orchestrator session is active),
write or overwrite one JSON record in memory/fpga/experiences.jsonl keyed by
run_id. This ensures data is persisted even if the flow is interrupted or called
without full orchestrator context. Use the experience record schema in
memory/README.md, with key_metrics fields lut_count, fmax_mhz, timing_met.
Use run_id = fpga_<YYYYMMDD>_<HHMMSS>_<6-char-random> where the 6-character suffix
is a lowercase hexadecimal string [0-9a-f] generated once at flow start using a secure
or pseudorandom RNG and reused unchanged on every stage update for this run.
signoff_achieved is a JSON boolean: set signoff_achieved: false until the final
sign-off stage completes.
Write memory/fpga/run_state.md as the first action before launching any tool:
run_id: fpga_<YYYYMMDD>_<HHMMSS>_<6-char-random>
design_name: <design>
tool: <primary tool>
start_time: <ISO-8601>
last_stage: null
current_stage: <first stage name>
The 6-character random suffix must be lowercase hexadecimal [0-9a-f]. Update current_stage
when a stage starts, and set last_stage to the completed stage name only after successful
completion (then clear current_stage). This file lets wakeup-loop prompts and resumed
sessions identify the correct run. 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-fpga-fixes after writing to
experiences.jsonl. Skip silently if the tool is absent — JSONL is the canonical record.