sync: WIN-BOWEI 2026-08-10 fpga_flash 增 Zynq BOOT.bin/QSPI 脚本,rtl-ip-replace 与 sim-rtl-flow 更新
- fpga_flash: 新增 build_zynq_boot.py / program_zynq_qspi.py(bootgen + program_flash, 含备份、SHA-256/容量/marker 守卫);vivado_env.py 增 resolve_sdk_dir(SDK_ROOT/SDK_PATH); SKILL.md 补 Zynq 烧写流程,示例去掉写死的 D:\Xilinx\SDK\2018.1,改由 skills_env.md 解析。 - rtl-ip-replace: gen_ip.tcl / namespace_ip.py 更新。 - sim-rtl-flow: SKILL.md 与 run_sim_rtl_flow.py 更新。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+83
-11
@@ -2,14 +2,18 @@
|
||||
name: sim-rtl-flow
|
||||
description: >
|
||||
Run the sim-rtl-flow LangGraph workflow at E:\LangGraph_Design\sim-rtl-flow — the
|
||||
Simulink-to-RTL-to-hardware design pipeline: Simulink -x principle sim (sim-golden) →
|
||||
HUMAN sign-off on simulation performance → optional -q fixed-point → parallel
|
||||
functional partition + RTL/SoC interface spec → HUMAN sign-off on the partition →
|
||||
per-module -E.slx nativization and Xilinx-IP replacement (parallel Send fanout) →
|
||||
Vivado build + timing → hardware-in-the-loop via fpga-imx6-flow or zynq-imx6-flow.
|
||||
It drives the compiled graph in-process (no langgraph dev server) and hands every
|
||||
subagent task back to THIS Claude session — and every human checkpoint to the USER —
|
||||
through a record/replay ledger stored in the design project being worked on.
|
||||
Simulink-to-RTL-to-hardware design pipeline: read the previous run's design history
|
||||
doc sim-rtl-flow-<date>.md to decide what may be reused → Simulink -x principle sim
|
||||
(sim-golden) → HUMAN sign-off on simulation performance → optional -q fixed-point →
|
||||
parallel functional partition + RTL/SoC interface spec → HUMAN sign-off on the
|
||||
partition (skippable when history says the partition is unchanged) → per-module
|
||||
-E.slx nativization and Xilinx-IP replacement (parallel Send fanout, modules the
|
||||
history proved good are skipped) → Vivado build + timing → hardware-in-the-loop via
|
||||
fpga-imx6-flow or zynq-imx6-flow → write a fresh sim-rtl-flow-<date>.md summarising
|
||||
every -x / -q / -E version. It drives the compiled graph in-process (no langgraph dev
|
||||
server) and hands every subagent task back to THIS Claude session — and every human
|
||||
checkpoint to the USER — through a record/replay ledger stored in the design project
|
||||
being worked on.
|
||||
|
||||
ALWAYS use this skill whenever the user wants to run, start, drive, resume or continue
|
||||
the sim-rtl-flow workflow / Simulink→RTL design flow, or says things like "启动
|
||||
@@ -22,7 +26,7 @@ description: >
|
||||
|
||||
## What this skill does
|
||||
|
||||
Drives the **sim-rtl-flow** graph (21 top-level nodes + a 3-node per-module subgraph,
|
||||
Drives the **sim-rtl-flow** graph (25 top-level nodes + a 5-node per-module subgraph,
|
||||
1:1 with `Notes/PR01-1.md`, `Notes/PR01-2.md` and `Notes/PR01_sim_rtl_flow.drawio`).
|
||||
|
||||
The graph contains **no** agent logic — it talks to the outside world through two
|
||||
@@ -60,6 +64,50 @@ export PYTHONIOENCODING=utf-8
|
||||
The driver resolves the workflow checkout from `SIM_RTL_FLOW_ROOT` in
|
||||
`~\skills_env.md`, so no path is baked into this skill.
|
||||
|
||||
## 📄 The design history doc `sim-rtl-flow-<date>.md`
|
||||
|
||||
Every run **reads** the newest history doc and **writes** a new one. That doc is the
|
||||
only mechanism stopping the flow from re-doing — and thereby re-breaking — design work
|
||||
that a previous run already validated.
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| Location | `<work_dir>/<history_dir>/`, where `history_dir` defaults to the folder holding `requirements_path` (usually `Notes`) |
|
||||
| Name | `sim-rtl-flow-<YYYYMMDD-HH>.md` — date **and hour**, zero-padded, so name order == time order |
|
||||
| Read | `start` freezes the newest matching file into `input.json` as `history_path`; the `history_review#1` task interprets it |
|
||||
| Written | the `design_summary#1` task, at the end of **every** run — completed *and* failed |
|
||||
|
||||
`history_review` returns its verdict in `metadata`, and that verdict is what lets the
|
||||
graph skip work:
|
||||
|
||||
| metadata field | effect if `false` / listed |
|
||||
|---|---|
|
||||
| `redo_fixed_point` | `false` → the `-q` stage is skipped entirely |
|
||||
| `redo_partition` + `partition_review_required` | both `false` → the **`functional_partition` human checkpoint is skipped** |
|
||||
| `reuse_modules` | listed module → its `native:M` + `ip_replace:M` are skipped; result recorded as `stage: history_reuse` |
|
||||
| `redo_modules` | listed module always re-runs, even if also in `reuse_modules` |
|
||||
|
||||
**Every default is "redo".** Omit a field and the stage runs. Fail the
|
||||
`history_review` gate (`gate_passed: false`) and *nothing* is skipped. Recording a skip
|
||||
you did not verify means a later gate — Vivado, HIL, sim-golden — validates a design
|
||||
nobody checked this run.
|
||||
|
||||
Four things force everything back to redo, regardless of the history doc:
|
||||
|
||||
1. `simulink_x` running a second time (a rejected `sim_performance`, or a retry) —
|
||||
sim-golden may have moved, so the history describes a *different* `-x`;
|
||||
2. `partition#n` returning `metadata.partition_changed: true` — the human checkpoint
|
||||
comes back even if history said to skip it;
|
||||
3. any module named by Vivado or HIL rework — the reuse pool is consumed after the
|
||||
first module round and never applies to a rework round;
|
||||
4. the user having already answered `functional_partition` once — a rejection can never
|
||||
be swallowed by a later "history says skip it".
|
||||
|
||||
When you write the summary, `artifacts[0]` must be the real path you wrote. If the
|
||||
summary cannot be written after `--max-attempts`, the run is reported **failed** even
|
||||
if the design itself passed — because the next run would silently lose its basis for
|
||||
skipping anything.
|
||||
|
||||
## ⚠️ The two human checkpoints are the user's decision, not yours
|
||||
|
||||
The graph stops at two points that **an agent may not decide**:
|
||||
@@ -67,7 +115,7 @@ The graph stops at two points that **an agent may not decide**:
|
||||
| checkpoint | where | what the user confirms |
|
||||
|---|---|---|
|
||||
| `sim_performance` | after step 1 | the `-x` sim meets the requirement and may be frozen as **sim-golden** |
|
||||
| `functional_partition` | after step 3 | the pure-sim / RTL / SoC split and the RTL↔SoC interface doc |
|
||||
| `functional_partition` | after step 3 | the pure-sim / RTL / SoC split and the RTL↔SoC interface doc — **skipped** only when the history doc says the partition is unchanged (see above) |
|
||||
|
||||
When one comes up the driver prints a `!!!` banner. **Relay the question and its context
|
||||
to the user verbatim, then wait.** Do not approve on your own judgement, do not infer
|
||||
@@ -109,6 +157,10 @@ From `Notes/PR01.md` and `Notes/PR01-2.md`; the graph routes on these.
|
||||
`fpga-imx6-flow` / `zynq-imx6-flow` for *diagnosis only*; the moment a code change is
|
||||
needed, stop that sub-flow and report it back here — the fix happens in the
|
||||
sim-rtl-flow main graph, then re-enters Vivado and HIL.
|
||||
7. **Skipping a step needs written evidence, and every run leaves some.** The only
|
||||
grounds for not executing a stage are a history doc that records it as verified and
|
||||
unaffected. Every run ends by writing the next `sim-rtl-flow-<date>.md`; anything you
|
||||
could not verify goes in as *not verified*, so the next run redoes it.
|
||||
|
||||
## Run (agent path)
|
||||
|
||||
@@ -140,6 +192,8 @@ EOF
|
||||
| `fixed_point_required` | `false` skips the `-q` stage |
|
||||
| `rtl_modules` | submodule names; each gets its own parallel `native → ip_replace` chain. Non-empty. |
|
||||
| `soc_modules` | MCU/SoC-side modules (interface-spec input) |
|
||||
| `history_dir` | optional — folder holding `sim-rtl-flow-<date>.md`; defaults to the folder of `requirements_path` |
|
||||
| `history_path` | optional — pin one history doc. Omit and `start` fills in the newest it finds; set `""` to declare "no history, do everything". |
|
||||
|
||||
### 2. Start — exits 10 with a handoff
|
||||
|
||||
@@ -182,6 +236,7 @@ keys with a default success — rehearsal only, and it refuses review keys.
|
||||
|
||||
| key | what you actually do | which skill to use |
|
||||
|---|---|---|
|
||||
| `history_review#n` | read `sim-rtl-flow-<date>.md` + the requirement doc, decide what may be reused; verdict in `metadata` (**first task of every run that has a history doc**) | inline — read the files, don't guess |
|
||||
| `simulink_x#n` | build/revise the `-x` sim, document the performance envelope | MATLAB MCP + `model-based-design-core:building-simulink-models`, `simulating-simulink-models` |
|
||||
| `review:sim_performance#n` | **ask the user** to sign off on sim-golden | — (relay to user) |
|
||||
| `fixed_point#n` | `-q` fixed-point, compare to `-x` | same MATLAB skills |
|
||||
@@ -197,6 +252,7 @@ keys with a default success — rehearsal only, and it refuses review keys.
|
||||
| `hil:fpga-imx6-flow#n` / `hil:zynq-imx6-flow#n` | HIL debug, **read-only** | `fpga-imx6-flow` / `zynq-imx6-flow` |
|
||||
| `timing_rework#n` | fix non-Simulink RTL / SoC / project timing | inline |
|
||||
| `hil_rework#n` | apply the code change HIL asked for | inline |
|
||||
| `design_summary#n` | write `<history_dir>/sim-rtl-flow-<YYYYMMDD-HH>.md` (path handed to you in `context.target_path`) covering every `-x`/`-q`/`-E` version, the partition, per-module status, Vivado/HIL verdicts, what was reused and what is still open; return the real path in `artifacts` (**last task of every run, success or failure**) | inline |
|
||||
|
||||
`#n` is the n-th time that key has been requested this run — retries and rework produce
|
||||
`#2`, `#3`, …
|
||||
@@ -238,9 +294,12 @@ A failing `ip_replace:<M>` (cycle-true mismatch) enters the same chain on its ow
|
||||
| stage | keys handed over at once |
|
||||
|---|---|
|
||||
| after `-x` / `-q` | `interfaces#1` **and** `partition#1` |
|
||||
| module fanout | one `native:<M>#1` per module (3 for `["A","B","C"]`) |
|
||||
| module fanout | one `native:<M>#1` per module (3 for `["A","B","C"]`) — **minus any module reused from history** |
|
||||
| next module stage | one `ip_replace:<M>#1` per module |
|
||||
|
||||
`history_review#1` and `design_summary#1` are always single-task batches, at the very
|
||||
start and the very end of the run.
|
||||
|
||||
Work batched tasks in any order; record all, then `resume`.
|
||||
|
||||
## Rehearsal without touching hardware
|
||||
@@ -311,6 +370,19 @@ Global flags go **before** the subcommand: `--project`, `--work-dir`, `--thread-
|
||||
are fine on Windows; a relative `"."` resolves against wherever the driver was
|
||||
launched — always use an absolute path.
|
||||
- **`start` wipes the ledger** unless `--keep-ledger`. Use a fresh `--thread-id` per run.
|
||||
- **`start` freezes `history_path` into `input.json`.** It must not be re-scanned on
|
||||
every `resume`: the run itself writes a *newer* `sim-rtl-flow-<date>.md` at the end,
|
||||
and a re-scan would make a later replay reference a different history doc than the
|
||||
one already recorded in the ledger. Pinning it also makes `resume` after
|
||||
`WORKFLOW FINISHED` a no-op instead of a spurious new handoff.
|
||||
- **A reused module produces no `native:`/`ip_replace:` keys at all.** If you expected
|
||||
three modules and only got one task, check the `modules_reused_from_history` event —
|
||||
that is the graph honouring your own `history_review` verdict, not a lost module.
|
||||
- **`design_summary` is the deliverable, not a formality.** Record it only after the
|
||||
file really exists on disk with real content; `artifacts[0]` must be its path.
|
||||
- **The summary can fail an otherwise-good run.** `status: failed` with
|
||||
`运行已结束但历史设计说明文件 … 未能生成` means the design work passed but the history
|
||||
doc did not get written — fix that and re-run the summary, don't ignore it.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
||||
Reference in New Issue
Block a user