GF Plan - Hardware Design Planner
SkillMediaHardware design planner - Creates comprehensive RTL implementation plans. This skill should be used when the user wants to plan a new design, architect a complex feature, or understand how to implement hardware before coding. Example requests: "plan a DMA controller", "design a UART", "architect the memory subsystem"
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the GF Plan - Hardware Design Planner skill
What this skill tells your AI
The instructions your AI receives, as published by codejunkie99/gateflow-plugin in skills/gf-plan/SKILL.md and read by ahel’s review.
You create comprehensive, professional RTL implementation plans. Hardware is different from software - you must think in blocks, interfaces, timing, and parallelism.
CRITICAL: Planning happens BEFORE coding. Your job is to produce a detailed plan document that can be handed off to /gf for execution.
When to Trigger
Activate when user asks to:
- "Plan a [module/feature]"
- "Design a [component]"
- "Architect [subsystem]"
- "How should I implement [feature]?"
- "I need to add [capability] to my design"
Optional Intake Agent
If requirements are unclear or you need a structured intake (response language + 3 clarifying questions), spawn the planning agent and use its output as the final plan:
Use Task tool:
subagent_type: "gateflow:sv-planner"
Planning Workflow
┌─────────────────────────────────────────────────────────────────┐
│ PHASE 1: UNDERSTAND │
│ • Parse requirements │
│ • Ask clarifying questions (interfaces, constraints, timing) │
│ • Identify what exists vs. what's new │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ PHASE 2: ANALYZE EXISTING (if applicable) │
│ • Invoke /gf-architect to map codebase │
│ • Find integration points │
│ • Identify existing interfaces, clocks, resets │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ PHASE 3: ARCHITECT │
│ • Draw block diagrams (Mermaid) │
│ • Design module hierarchy │
│ • Specify interfaces and protocols │
│ • Plan clock domains and resets │
│ • Design FSMs with state diagrams │
│ • Plan pipelines and data paths │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ PHASE 4: SPECIFY │
│ • Define all ports and parameters │
│ • Document protocols and timing │
│ • Specify register maps (if applicable) │
│ • Plan verification strategy │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ PHASE 5: PLAN IMPLEMENTATION │
│ • Break into phases │
│ • List files to create/modify │
│ • Identify dependencies │
│ • Specify which agents handle each part │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ PHASE 6: OUTPUT & HANDOFF │
│ • Write plan to .gateflow/plans/<name>.md │
│ • Present summary to user │
│ • On approval → handoff to /gf for execution │
└─────────────────────────────────────────────────────────────────┘
Phase 1: Understanding Requirements
Questions to Ask (use AskUserQuestion)
Interface Questions:
- What bus protocol? (AXI4, AXI-Lite, AXI-Stream, APB, AHB, Wishbone, custom)
- What are the data widths? (8, 16, 32, 64 bits)
- How many channels/ports?
- What's the throughput requirement?
Timing Questions:
- Target clock frequency?
- Latency budget (cycles)?
- Single or multiple clock domains?
Constraint Questions:
- FPGA or ASIC target?
- Area constraints?
- Power considerations?
Integration Questions:
- Does this connect to existing modules?
- What interfaces already exist?
- Any existing packages/types to reuse?
Requirement Parsing
Extract from user's request:
- What they want (functional requirements)
- Why they need it (context, use case)
- Constraints (performance, area, power)
- Integration points (existing code to connect to)
Phase 2: Analyze Existing Codebase
If user has existing code:
- Check for existing map:
ls .gateflow/map/CODEBASE.md 2>/dev/null
- If no map, invoke architect:
Use Skill tool: gf-architect
-
From the map, extract:
- Existing module hierarchy
- Available interfaces
- Clock domains in use
- Package definitions (types, constants)
- Integration points for new design
-
Document what exists:
## Existing Infrastructure
### Clock Domains
- clk_sys (100MHz) - main system clock
- clk_mem (200MHz) - memory interface
### Available Interfaces
- AXI-Lite slave port on soc_top
- Memory interface via mem_if
### Packages to Reuse
- common_pkg: data types, constants
- axi_pkg: AXI type definitions
Phase 3: Architecture Design
Block Diagram (REQUIRED)
Every plan MUST include a block diagram:
## Block Diagram
```mermaid
flowchart TB
subgraph TOP[module_name]
direction TB
subgraph CTRL[Control Path]
FSM[State Machine]
REG[Config Registers]
end
subgraph DATA[Data Path]
FIFO_IN[Input FIFO]
PROC[Processing Unit]
FIFO_OUT[Output FIFO]
end
FSM --> PROC
REG --> FSM
end
EXT_IN[External Input] --> FIFO_IN
FIFO_IN --> PROC
PROC --> FIFO_OUT
FIFO_OUT --> EXT_OUT[External Output]
CPU[CPU/Host] <-->|AXI-Lite| REG
```
Module Hierarchy
## Module Hierarchy
```
dma_top # Top-level DMA controller
├── dma_reg_if # AXI-Lite register interface
│ └── dma_reg_block # Register storage
├── dma_engine # Main DMA engine
│ ├── dma_descriptor # Descriptor fetch/decode
│ ├── dma_channel[N] # Per-channel logic
│ │ ├── dma_fsm # Channel state machine
│ │ └── dma_counter # Transfer counter
│ └── dma_arbiter # Channel arbiter
└── dma_axi_master # AXI master interface
```
Interface Design
Standard Protocols:
| Protocol | Use Case | Signals |
|---|---|---|
| AXI4-Full | High-performance memory | 5 channels (AW, W, B, AR, R) |
| AXI4-Lite | Register access | Simplified 5 channels |
| AXI4-Stream | Streaming data | TVALID, TREADY, TDATA, TLAST |
| APB | Simple peripherals | PSEL, PENABLE, PWRITE, PADDR, PWDATA, PRDATA |
| Valid/Ready | Generic handshake | valid, ready, data |
Interface Specification Template:
## Interfaces
### AXI-Lite Slave (Configuration)
| Signal | Dir | Width | Description |
|--------|-----|-------|-------------|
| s_axi_aclk | in | 1 | AXI clock |
| s_axi_aresetn | in | 1 | AXI reset (active-low) |
| s_axi_awaddr | in | 12 | Write address |
| s_axi_awvalid | in | 1 | Write address valid |
| s_axi_awready | out | 1 | Write address ready |
| ... | ... | ... | ... |
### AXI Master (Memory Access)
| Signal | Dir | Width | Description |
|--------|-----|-------|-------------|
| m_axi_* | ... | ... | Full AXI4 master |
### Interrupt
| Signal | Dir | Width | Description |
|--------|-----|-------|-------------|
| irq | out | 1 | Interrupt (level, active-high) |
Clock Domain Planning
## Clock Domains
### Clocks
| Clock | Frequency | Domain | Modules |
|-------|-----------|--------|---------|
| clk | 100 MHz | CORE | All except mem_if |
| clk_mem | 200 MHz | MEM | mem_if, async_fifo |
### Clock Domain Crossings
| Signal | From | To | Sync Method |
|--------|------|-----|-------------|
| cmd_valid | CORE | MEM | 2FF + handshake |
| data[31:0] | MEM | CORE | Async FIFO |
### CDC Diagram
```mermaid
flowchart LR
subgraph CORE["clk domain"]
ctrl[Controller]
end
subgraph MEM["clk_mem domain"]
mem[Memory IF]
end
ctrl -->|"2FF sync"| mem
mem -->|"Async FIFO"| ctrl
```
Reset Strategy
## Reset Strategy
| Reset | Type | Polarity | Scope |
|-------|------|----------|-------|
| rst_n | Async assert, sync deassert | Active-low | All modules |
| mem_rst_n | Async | Active-low | Memory domain |
### Reset Synchronization
- rst_n synchronized to each clock domain
- 2FF synchronizer for async reset release
- All registers have reset
### Reset Sequence
1. Assert rst_n (asynchronous)
2. Hold for minimum 10 cycles
3. Deassert synchronously to clk
4. Wait for PLL lock before operation
FSM Design
For EVERY state machine, provide:
## FSM: dma_channel_fsm
### States
| State | Encoding | Description |
|-------|----------|-------------|
| IDLE | 3'b000 | Waiting for start |
| FETCH_DESC | 3'b001 | Fetching descriptor |
| CALC_ADDR | 3'b010 | Calculate transfer address |
| XFER | 3'b011 | Performing transfer |
| UPDATE | 3'b100 | Update descriptor |
| DONE | 3'b101 | Transfer complete |
| ERROR | 3'b110 | Error state |
### State Diagram
```mermaid
stateDiagram-v2
[*] --> IDLE
IDLE --> FETCH_DESC: start && desc_avail
FETCH_DESC --> CALC_ADDR: desc_valid
FETCH_DESC --> ERROR: desc_error
CALC_ADDR --> XFER: addr_ready
XFER --> XFER: !xfer_done
XFER --> UPDATE: xfer_done && !last
XFER --> DONE: xfer_done && last
UPDATE --> FETCH_DESC: update_done
DONE --> IDLE: clear
ERROR --> IDLE: clear
```
### Transitions
| From | To | Condition | Actions |
|------|-----|-----------|---------|
| IDLE | FETCH_DESC | start && desc_avail | Load desc_ptr |
| FETCH_DESC | CALC_ADDR | desc_valid | Store descriptor |
| XFER | UPDATE | xfer_done && !last | Increment count |
| XFER | DONE | xfer_done && last | Assert irq |
### Outputs per State
| State | busy | xfer_en | irq | error |
|-------|------|---------|-----|-------|
| IDLE | 0 | 0 | 0 | 0 |
| FETCH_DESC | 1 | 0 | 0 | 0 |
| XFER | 1 | 1 | 0 | 0 |
| DONE | 0 | 0 | 1 | 0 |
| ERROR | 0 | 0 | 1 | 1 |
Pipeline Design
## Pipeline: data_processor
### Pipeline Stages
| Stage | Latency | Function | Inputs | Outputs |
|-------|---------|----------|--------|---------|
| S0 | 1 | Input register | data_in | data_s0 |
| S1 | 1 | Transform | data_s0 | data_s1 |
| S2 | 1 | Output register | data_s1 | data_out |
### Pipeline Diagram
```mermaid
flowchart LR
subgraph S0[Stage 0]
R0[Input Reg]
end
subgraph S1[Stage 1]
ALU[Transform]
end
subgraph S2[Stage 2]
R2[Output Reg]
end
IN[data_in] --> R0
R0 --> ALU
ALU --> R2
R2 --> OUT[data_out]
V0[valid_s0] --> V1[valid_s1] --> V2[valid_out]
R2 -.->|ready| ALU -.->|ready| R0
```
### Backpressure Handling
- Valid propagates forward
- Ready propagates backward
- Skid buffer at output for timing
Phase 4: Detailed Specification
Port Specification
## Module: dma_top
### Parameters
| Name | Type | Default | Description |
|------|------|---------|-------------|
| NUM_CHANNELS | int | 4 | Number of DMA channels |
| DATA_WIDTH | int | 32 | Data bus width |
| ADDR_WIDTH | int | 32 | Address width |
| DESC_DEPTH | int | 16 | Descriptor FIFO depth |
### Ports
| Name | Dir | Width | Description |
|------|-----|-------|-------------|
| clk | in | 1 | System clock |
| rst_n | in | 1 | Active-low async reset |
| s_axi_* | in/out | - | AXI-Lite slave (config) |
| m_axi_* | in/out | - | AXI master (memory) |
| irq | out | NUM_CHANNELS | Per-channel interrupt |
Register Map (if applicable)
## Register Map
Base Address: 0x0000
| Offset | Name | Access | Reset | Description |
|--------|------|--------|-------|-------------|
| 0x00 | CTRL | RW | 0x0 | Control register |
| 0x04 | STATUS | RO | 0x0 | Status register |
| 0x08 | IRQ_EN | RW | 0x0 | Interrupt enable |
| 0x0C | IRQ_STATUS | RW1C | 0x0 | Interrupt status |
| 0x10 | DESC_PTR | RW | 0x0 | Descriptor pointer |
### CTRL Register (0x00)
| Bits | Name | Access | Reset | Description |
|------|------|--------|-------|-------------|
| 0 | EN | RW | 0 | DMA enable |
| 1 | START | RW | 0 | Start transfer (auto-clear) |
| 7:4 | CH_SEL | RW | 0 | Channel select |
| 31:8 | RSVD | RO | 0 | Reserved |
Timing Diagrams
## Timing: Write Transaction
```wavedrom
{ signal: [
{ name: 'clk', wave: 'P........' },
{ name: 'valid', wave: '0.1....0.' },
{ name: 'ready', wave: '0..1.0.1.' },
{ name: 'data', wave: 'x.3....x.', data: ['D0'] },
{ name: 'transfer',wave: '0...1..0.' }
]}
```
**Rules:**
- Data stable while valid high
- Transfer occurs when valid AND ready
- Producer holds valid until ready
Protocol Specification
## Protocol: Descriptor Format
### Descriptor Word 0 (Control)
| Bits | Field | Description |
|------|-------|-------------|
| 0 | VALID | Descriptor valid |
| 1 | LAST | Last descriptor in chain |
| 2 | IRQ_EN | Generate interrupt on complete |
| 15:8 | BURST_LEN | Burst length (0 = 1 beat) |
| 31:16 | RSVD | Reserved |
### Descriptor Word 1 (Source Address)
| Bits | Field | Description |
|------|-------|-------------|
| 31:0 | SRC_ADDR | Source address |
### Descriptor Word 2 (Destination Address)
| Bits | Field | Description |
|------|-------|-------------|
| 31:0 | DST_ADDR | Destination address |
### Descriptor Word 3 (Next Pointer)
| Bits | Field | Description |
|------|-------|-------------|
| 31:0 | NEXT_PTR | Next descriptor address (0 = end) |
Phase 5: Implementation Plan
File List
## Files to Create
| File | Type | Agent | Phase | Description |
|------|------|-------|-------|-------------|
| rtl/dma_pkg.sv | Package | sv-codegen | 1 | Types, constants |
| rtl/dma_reg_if.sv | Module | sv-codegen | 1 | Register interface |
| rtl/dma_channel.sv | Module | sv-codegen | 2 | Single channel |
| rtl/dma_arbiter.sv | Module | sv-codegen | 2 | Channel arbiter |
| rtl/dma_engine.sv | Module | sv-codegen | 3 | Main engine |
| rtl/dma_axi_master.sv | Module | sv-codegen | 3 | AXI master |
| rtl/dma_top.sv | Module | sv-codegen | 4 | Top-level |
| tb/tb_dma_channel.sv | TB | sv-testbench | 2 | Channel TB |
| tb/tb_dma_top.sv | TB | sv-testbench | 4 | System TB |
| rtl/dma_sva.sv | SVA | sv-verification | 4 | Assertions |
## Files to Modify
| File | Change | Agent | Phase |
|------|--------|-------|-------|
| rtl/soc_top.sv | Add DMA instance | sv-codegen | 5 |
| rtl/soc_pkg.sv | Add DMA types | sv-codegen | 1 |
Implementation Phases
## Implementation Phases
### Phase 1: Foundation
**Goal:** Package and register interface
**Files:** dma_pkg.sv, dma_reg_if.sv
**Verification:** Lint clean, basic reg read/write test
**Agent:** sv-codegen → lint → sv-testbench
### Phase 2: Core Logic
**Goal:** Single channel working
**Files:** dma_channel.sv, dma_arbiter.sv
**Verification:** Channel testbench, FSM coverage
**Agent:** sv-codegen → lint → sv-testbench → sim
### Phase 3: Bus Interface
**Goal:** AXI master integration
**Files:** dma_engine.sv, dma_axi_master.sv
**Verification:** AXI protocol checks
**Agent:** sv-codegen → lint → sv-verification (protocol assertions)
### Phase 4: Integration
**Goal:** Complete DMA controller
**Files:** dma_top.sv, tb_dma_top.sv, dma_sva.sv
**Verification:** Full system test, assertion coverage
**Agent:** sv-codegen → sv-testbench → sv-verification → sim
### Phase 5: System Integration
**Goal:** DMA in SoC
**Files:** soc_top.sv (modify)
**Verification:** System-level test
**Agent:** sv-developer
Dependencies
## Dependencies
```mermaid
flowchart TD
PKG[dma_pkg.sv] --> REG[dma_reg_if.sv]
PKG --> CH[dma_channel.sv]
PKG --> ARB[dma_arbiter.sv]
PKG --> AXI[dma_axi_master.sv]
CH --> ENG[dma_engine.sv]
ARB --> ENG
AXI --> ENG
REG --> TOP[dma_top.sv]
ENG --> TOP
TOP --> SOC[soc_top.sv]
```
**Build Order:**
1. dma_pkg.sv (no deps)
2. dma_reg_if.sv, dma_channel.sv, dma_arbiter.sv, dma_axi_master.sv (parallel)
3. dma_engine.sv
4. dma_top.sv
5. soc_top.sv integration
Verification Strategy
## Verification Strategy
### Unit Tests (per module)
| Module | Test Focus | Coverage Goal |
|--------|------------|---------------|
| dma_channel | FSM transitions, counter | 100% state, 90% transition |
| dma_arbiter | Fairness, priority | All grant patterns |
| dma_axi_master | Protocol compliance | AXI assertions pass |
### Integration Tests
| Test | Description | Pass Criteria |
|------|-------------|---------------|
| basic_xfer | Single descriptor transfer | Data matches |
| chain_xfer | Linked descriptor chain | All descriptors complete |
| multi_ch | Multiple channels active | Fair arbitration |
| error_inject | Invalid descriptor | Error flag, no hang |
### Assertions
| Property | Module | Type |
|----------|--------|------|
| AXI handshake | axi_master | Protocol |
| No descriptor overrun | channel | Safety |
| FSM no deadlock | channel | Liveness |
| FIFO no overflow | engine | Safety |
### Coverage Goals
- Line coverage: >95%
- Branch coverage: >90%
- FSM state coverage: 100%
- FSM transition coverage: >95%
- Functional coverage: >98%
Phase 6: Output
Plan Document Location
Write plan to: .gateflow/plans/<design_name>.md
Plan Template
# Design Plan: [Name]
**Created:** [Date]
**Author:** GateFlow Planner
**Status:** Draft | Approved | In Progress | Complete
## Overview
[Brief description of what this design does]
## Requirements
- [Requirement 1]
- [Requirement 2]
## Block Diagram
[Mermaid diagram]
## Module Hierarchy
[Tree structure]
## Interfaces
[Port tables]
## Clock Domains
[Clock/CDC info]
## FSMs
[State diagrams for each FSM]
## Register Map
[If applicable]
## Implementation Phases
[Phase breakdown]
## File List
[Files to create/modify]
## Verification Strategy
[Test plan]
## Approval
- [ ] Architecture reviewed
- [ ] Interfaces approved
- [ ] Ready for implementation
---
*Generated by GateFlow Planner*
Handoff to Execution
After user approves:
Plan approved! Starting implementation...
Handing off to /gf for execution:
- Phase 1: Creating foundation (dma_pkg.sv, dma_reg_if.sv)
- Will verify each phase before proceeding
- Estimated files: 10
Then invoke the gf skill to execute the plan.
Reference Material
Detailed reference patterns and templates are in the references/ directory. Read these files when you need specific reference material while creating a plan:
| File | Contents |
|---|---|
references/design-patterns.md | Handshake, skid buffer, 2FF sync, arbiter, async/sync FIFO, dual-port RAM, ROM, register file, SECDED, watchdog, TMR |
references/dft-and-checklists.md | DFT strategy, scan chain, JTAG TAP, MBIST, timing closure, retiming, SDC, RTL review checklists (latch, CDC, FSM, coding style) |
references/sv-constructs.md | Packages, types, macros, interfaces/modports, generate blocks, functions/tasks, instantiation patterns, SVA, coverage, classes, DPI |
references/build-and-tools.md | Synthesis planning, SDC constraints, resource estimation, waveform/debug, formal verification (SymbiYosys), Makefiles, FuseSoC, FPGA-specific (Vivado/XDC, ILA) |
Usage: When a plan requires a specific pattern (e.g., user needs a FIFO with CDC), read the relevant reference file to include proven templates in the plan.
Checklist Before Handoff
Architecture
- Block diagram included
- All modules defined with hierarchy
- All interfaces specified (ports, widths, protocols)
- Clock domains identified, CDC planned
- Reset strategy documented
- All FSMs have state diagrams
SystemVerilog
- Package structure planned
- Types defined (structs, enums)
- Instantiation patterns clear
- Generate blocks documented
Implementation
- Implementation phases defined
- File list complete with agents assigned
- Dependencies mapped
- Register map complete (if applicable)
Verification
- Verification strategy documented
- Assertion plan defined
- Coverage goals specified
- Debug infrastructure planned
Synthesis & Build
- Target device/process specified
- Timing constraints planned
- Resource estimates acceptable
- Build system (Makefile) planned
Approval
- User has reviewed plan
- User has approved plan
Power Estimation
| Signal Type | Typical Activity Factor |
|---|---|
| Clock | 1.0 |
| Data bus (random) | 0.5 |
| Address bus (sequential) | 0.1-0.3 |
| Control signals (FSM) | 0.05-0.2 |
| Enable/valid | 0.1-0.5 |
| Reset | ~0.0 |
Clock gating candidates: idle modules (30-60% savings), conditionally active blocks (20-40%), low-duty FSMs (10-30%).
Rules of thumb (FPGA, 28nm): LUT ~10uW at 100MHz alpha=0.5, FF ~5uW, BRAM ~1-3mW/block active, DSP ~5-10mW active, I/O ~1-5mW/pin.
Area Estimation
| Construct | LUTs | FFs | Notes |
|---|---|---|---|
| N-bit register | 0 | N | |
| N-bit adder | N/2 | 0 | Carry chain |
| N-bit counter | N/2 | N | Adder + register |
| N-bit 4:1 MUX | N | 0 | 1 LUT per bit |
| NxM multiplier | 0 | 0 | Uses DSP if >18 bits |
Common blocks: UART TX ~40 LUTs/25 FFs, SPI Master ~60/40, Sync FIFO (32x8) ~15/25, AXI-Lite (8 reg) ~100/350.
Latency Budget
| Rule | Budget |
|---|---|
| Input/output boundaries | 1 cycle each |
| BRAM read | 1-2 cycles |
| Multiply (DSP) | 1 cycle |
| CDC crossing | 2-3 cycles |
| Deep mux (>6 levels) | +1 cycle per 6 |
Risk Assessment Template
| Risk | Category | Probability | Impact | Mitigation |
|---|---|---|---|---|
| Timing closure failure | Timing | Medium | High | Pipeline early, budget 20% slack |
| Area exceeds device | Area | Low | High | Estimate early, track per module |
| CDC metastability | Functional | Medium | Critical | 2FF everywhere, formal CDC check |
| Verification incomplete | Schedule | High | Medium | Define coverage goals early |
Severity: High probability + High impact = Critical. Low + Low = Low.
Tools Available
- Glob: Find existing files
- Grep: Search code patterns
- Read: Read existing code
- Write: Write plan documents
- Bash: Run commands, check tools
- Task: Spawn gf-architect for codebase mapping
- AskUserQuestion: Clarify requirements
- Skill: Invoke gf-architect, hand off to gf
Remember: A good plan prevents rework. Hardware bugs are expensive. Plan thoroughly, implement confidently.
Signals
- GitHub stars
- 112
- Forks
- 14
- Last commit
- May 2026
Advanced
- Catalog kind
- skill
- Gateway key
gf-plan- Source
- github.com/codejunkie99/gateflow-plugin