算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
memory-ip-design【设计与创意】Embedded memory IP design — SRAM/register-file/ROM requirements capture, memory compiler and macro selection, array architecture (banking, ports, ECC wrapper), redundancy and repair allocation, view generation and QA, and integration handoff to DFT, PD, and STA. Use when specifying or selecting memory macros, architecting a memory subsystem, sizing s…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
When this skill is loaded and a user presents a memory IP design task, do not
execute stages directly. Immediately spawn the
digital-chip-design-agents:memory-ip-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/memory-ip/knowledge.md — known failure patterns, successful tool flags, PDK/tool quirks.
Incorporate its guidance into every stage decision. If absent, proceed without it.memory/memory-ip/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 embedded memory IP development from requirements capture through macro selection, array architecture, repair allocation, and view qualification. Produces a signed-off memory IP package: an instance inventory, a selected macro per instance, a QA-clean view set across all PVT corners, a repair architecture, and placement/timing constraints for downstream handoff.
This domain treats the memory as the product. It stops at the handoff and does not duplicate work owned elsewhere:
| Not owned here | Owner |
|---|---|
| MBIST controller insertion, March pattern generation, MBIST fault coverage, ATPG | chip-design-dft (bist_insertion stage) |
| Floorplanning, actual macro placement, power grid over macros | chip-design-pd (floorplan stage) |
| Timing sign-off, multi-corner STA runs, ECO closure | chip-design-sta |
| Address/memory map assignment, bus fabric attachment | chip-design-soc |
| Cache hierarchy and DDR controller architecture | chip-design-architecture |
This domain produces the inputs those domains consume: memory inventory and
repair-register map for DFT, placement constraints for PD, .lib set and derates
for STA, behavioural models for verification.
openram) — open-source memory compiler; generates GDS, LEF, Liberty, and Verilog for SRAMcacti) — early access-time, area, and power estimation before a compiler runmagic) — DRC and LVS on generated macro layoutklayout) — GDS QA, layer/obstruction inspection, boundary checkssta) — .lib load sanity check and macro timing arc inspectionartisan, dialect arm) — production SRAM/register-file/ROM compilerssiliconsmart, dialect synopsys) — compilation and Liberty characterisationliberate, dialect cadence) — Liberty characterisation across PVT cornerstessent, dialect siemens) — repair-register and BISR architecture reference (insertion owned by DFT)Capture depth × width × port count for every memory instance in the design; source from design_state.architecture and design_state.rtl where available
Establish memory type and port requirements by this precedence, and record which source supplied each instance:
design_state.rtl — the implementation is authoritative for port count, widths, and depth, because that is what must actually be instantiateddesign_state.architecture — authoritative for type intent and sizing where RTL is silent (typically pre-RTL runs)On conflict, do not silently pick a winner. If rtl and architecture disagree on type, port arrangement, depth, or width for the same instance, halt with a constraint_gap escalation naming the instance and both values. A mismatch here selects the wrong macro interface and is not recoverable after view_generation
Compute required read/write bandwidth per instance and check it against the target constraints.clock.clk_mhz — bandwidth shortfalls must be resolved here, not by over-selecting macros later
Decide the ECC scheme per instance with this deterministic policy, so two runs on the same inputs resolve identically. Compute budgeted_FIT = fit_target_fit_per_mb × instance_Mb (constraints.memory_ip.fit_target_fit_per_mb, default 100) and raw_FIT from the PDK's SER rate for the chosen bitcell:
| Condition | Resolved scheme |
|---|---|
ecc_required: true | SECDED — the forced floor is correction, not merely "a scheme". Parity only if the spec explicitly permits detect-only, recorded with rationale |
raw_FIT ≤ budgeted_FIT | none |
raw_FIT > budgeted_FIT, detect-and-retry available at system level | parity |
raw_FIT > budgeted_FIT, no system-level retry | SECDED |
raw_FIT > budgeted_FIT even with SECDED + scrubbing | escalate — ECC alone cannot meet the budget; revisit bitcell or partitioning |
Record raw_FIT, budgeted_FIT, the PDK SER source, and the resolved scheme per instance into memory_ip.ecc. An unaudited ECC choice is not reproducible on a re-spin
Enumerate required power modes per instance — active, light sleep (periphery off, array retained), deep sleep (retained at reduced voltage), shutdown (contents lost) — and resolve retention with an explicit precedence: a per-instance retention requirement from the spec/architecture always wins; constraints.memory_ip.retention_required is the default applied only to instances that state nothing. The global flag never overrides an explicit per-instance value in either direction — forcing retention onto an instance declared non-retained over-constrains macro selection and costs area, while dropping it from one declared retained is a functional bug. Where the global is true and an instance is explicitly non-retained, record the resolved value and the rationale rather than silently reconciling. Write the resolved per-instance value into memory_ip.power_modes
Record the dual-rail requirement: whether array and periphery supplies are separate, since this constrains both the macro choice and the UPF power intent
Flag any instance needing multi-port behaviour and whether it can be met by banking instead of a true multi-port bitcell (much larger)
constraints.memory_ip.max_aspect_ratio (default 4.0), beyond which placement and routing become impracticalknowledge.mdconstraints.memory_ip.max_aspect_ratioview_generationc satisfying 2^c ≥ data_bits + c + 1 (8 data bits → 5, 32 → 7, 64 → 8). Record encode and decode latency separately — decode is on the critical read pathmemory_requirements; loop back rather than compensating downstreamconstraints.memory_ip.vmin_margin_mv (default 50)constraints.memory_ip.repair_yield_pct_min (default 99). Loop back to array_architecture if the target is unreachable — more spare elements cannot fix an array that is simply too large for the defect densityconstraints.memory_ip.repair_yield_pct_min.lib (every PVT corner in constraints.pvt_corners), .lef, .db, .v behavioural model, .gds, and .cdl netlist. A missing view blocks a downstream domain, so treat any gap as a hard fail.lib, .lef, and .v — a mismatch here is the single most common cause of late integration failures and is silent until PD or LEC runs.lib: setup/hold on all inputs, clock-to-Q on all outputs. Missing arcs cause STA to under-report violations rather than error out.lib set characterised at only typical is not sign-off usable.lef obstruction layers are complete — missing obstructions let the router place wires over the array and produce DRC or noise failures found only at PDarray_architecture. A permissive behavioural model hides bugs until silicon. The behavioural model is simulation-only: initial blocks, #delay and timing checks are correct in it, and the RTL synthesis-safety rules and lint gate do not apply to it.lib/.lef/.vbist_insertion — group instances by width/depth class, since DFT allocates one MBIST controller per group.lib set and any memory-specific timing derates for STA; note explicitly where derates differ from standard-cell deratesset_dont_touch is applied to every memory macro for synthesis, and that macros are excluded from scan insertionchip-design-soc against the actual instance depths — a mismatch between the architectural map and the delivered macro sizes must be caught here, not at chip assembly.lib set and derate notes for STAconstraints.clock.clk_mhzconstraints.memory_ip.vmin_margin_mvconstraints.memory_ip.repair_yield_pct_minset_dont_touch confirmed for synthesisdesign_state.json memory_ip block populated with signoff: trueSee plugins/meta/skills/pipeline-orchestration/SKILL.md §Constraints Schema for the authoritative schema and stage-entry validation rule.
Required at entry (memory_requirements) — hard-fail if missing:
constraints.clock.clk_mhz — target frequency, sets the access-time budget for macro selectionOptional (schema defaults apply when absent):
constraints.memory_ip.vmin_margin_mv (default: 50) — minimum Vmin marginconstraints.memory_ip.repair_yield_pct_min (default: 99) — projected post-repair yield floorconstraints.memory_ip.ecc_required (default: false) — when true, forces SECDED as the floor regardless of the FIT calculation (see the memory_requirements ECC policy table)constraints.memory_ip.fit_target_fit_per_mb (default: 100) — soft-error budget in FIT per Mb; the audited input to the ECC decision at memory_requirementsconstraints.memory_ip.max_aspect_ratio (default: 4.0) — macro aspect-ratio ceilingconstraints.memory_ip.retention_required (default: true) — the default applied only to instances with no explicit per-instance retention requirement; an explicit per-instance value always wins in both directions. When the constraint is absent the default is assumed and must be stated in the stage reasonconstraints.pvt_corners — corner list that view_generation must fully characterise. Not defaultable: if absent, or if no entry has non-null voltage_v and temp_c, escalate as a constraint_gap at view_generation entry rather than characterising at typical onlyconstraints.dft.mbist_coverage_pct — owned by chip-design-dft; read only, never redefined hereAfter each stage completes (regardless of whether an orchestrator session is active),
write or overwrite one JSON record in memory/memory-ip/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 = memory-ip_<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/memory-ip/run_state.md as the first action before launching any tool:
run_id: memory-ip_<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-memory-ip-fixes after writing to
experiences.jsonl. Skip silently if the tool is absent — JSONL is the canonical record.