| name | gf-ip-detect |
| description | Auto-detect IP blocks within FPGA and hardware codebases. Scans for module instantiations, identifies missing implementations, matches standard IP patterns, and dispatches agents to fill gaps. Example: "scan for missing IP blocks", "detect what needs implementing", "find unimplemented modules", "auto-fill IP blocks"
|
| allowed-tools | ["Bash","Read","Write","Glob","Grep","Task","AskUserQuestion"] |
GF-IP-Detect — IP Block Auto-Detection and Auto-Fill
Scans hardware codebases to find IP blocks, identify gaps, and dispatch
agents to implement missing pieces.
What This Detects
1. Missing Module Implementations
Modules instantiated but never defined in the project:
grep -rn "^\s*\w\+\s\+\w\+\s*(" rtl/ tb/ --include="*.sv" --include="*.v" --include="*.vhd"
grep -rn "^\s*module\s\+\w\+" rtl/ --include="*.sv" --include="*.v"
2. Stub Modules (Empty or TODO)
Modules defined but with no real implementation:
grep -rn "TODO\|FIXME\|STUB\|NOT IMPLEMENTED" rtl/ --include="*.sv"
3. Standard IP Pattern Matching
Detect common hardware patterns that could use verified IP blocks:
| Pattern Detected | Matching IP Block | Confidence |
|---|
| FIFO-like read/write with full/empty | fifo_sync or fifo_async | High |
| 2+ flip-flop chain (synchronizer) | cdc_2ff | High |
| Req/ack handshake across clocks | cdc_handshake | High |
| UART-like shift register with baud | uart | Medium |
| SPI-like SCLK/MOSI/MISO/CS_N | spi_master | High |
| AXI-like valid/ready with addr/data | axi4lite_slave | Medium |
| Counter with debounce logic | debouncer | Medium |
4. Interface Gaps
Ports declared in a top module but not connected to any implementation:
5. Vendor IP Placeholders
Detect instantiations of vendor-specific IP that could have open-source alternatives:
grep -rn "IBUF\|OBUF\|BUFG\|MMCME2\|PLLE2\|BRAM" rtl/ --include="*.sv"
grep -rn "SB_IO\|SB_GB\|SB_PLL\|SB_RAM" rtl/ --include="*.sv"
Detection Workflow
Step 1: Scan Codebase
Read all .sv/.v/.vhd files in project
|
Extract: module definitions (name, ports, parameters)
|
Extract: module instantiations (what's used)
|
Extract: signal patterns (FIFO, CDC, protocol)
|
Build dependency graph
Step 2: Identify Gaps
For each instantiated module:
- Is it defined in the project? → if no, MISSING
- Is it a known IP block from GateFlow library? → suggest
/gf-ip add
- Is it a vendor primitive? → flag for review
- Is it defined but empty/stub? → NEEDS IMPLEMENTATION
For each signal pattern:
- Does it match a standard IP pattern? → suggest replacement
- Is the implementation ad-hoc? → suggest verified IP block
- Is there a CDC crossing without synchronizer? → CRITICAL: suggest cdc_2ff
Step 3: Report
---GATEFLOW-RESULT---
STATUS: PASS | NEEDS_ACTION
SCAN_RESULTS:
total_modules: 15
defined: 12
missing: 2
stubs: 1
MISSING_MODULES:
- name: fifo_controller
instantiated_in: rtl/top.sv:42
ports: [clk, rst_n, wr_en, wr_data, rd_en, rd_data, full, empty]
suggested_ip: fifo_sync (92% match)
- name: spi_peripheral
instantiated_in: rtl/top.sv:67
ports: [clk, rst_n, sclk, mosi, miso, cs_n, tx_data, rx_data]
suggested_ip: spi_master (88% match)
STUBS:
- name: uart_wrapper
file: rtl/uart_wrapper.sv:1
status: "Module defined but body is empty (TODO marker at line 15)"
suggested_action: "Implement using uart IP block as base"
PATTERN_MATCHES:
- pattern: "Ad-hoc 2FF synchronizer at rtl/sync.sv:10"
suggestion: "Replace with verified cdc_2ff IP block"
- pattern: "CDC crossing without synchronizer at rtl/top.sv:55"
severity: CRITICAL
suggestion: "Add cdc_2ff between clk_a and clk_b domains"
IP_OPPORTUNITIES:
- "3 modules could use GateFlow IP blocks (fifo_sync, spi_master, cdc_2ff)"
- "1 stub module needs implementation (uart_wrapper)"
- "1 critical CDC issue detected"
---END-GATEFLOW-RESULT---
Step 4: Auto-Fill (with user approval)
Present findings and ask:
Found 2 missing modules and 1 stub:
1. fifo_controller → 92% match with fifo_sync IP block
Action: /gf-ip add fifo_sync and rename to fifo_controller? [Y/n]
2. spi_peripheral → 88% match with spi_master IP block
Action: /gf-ip add spi_master and adapt ports? [Y/n]
3. uart_wrapper → Empty stub, matches uart IP pattern
Action: Generate implementation using uart IP as base? [Y/n]
4. CRITICAL: CDC crossing at top.sv:55 without synchronizer
Action: Insert cdc_2ff synchronizer? [Y/n]
Auto-Fill Dispatch
When user approves auto-fill, dispatch appropriate agents:
For IP Block Matches
Use Task tool:
subagent_type: "gateflow:sv-codegen"
prompt: |
Implement module <name> based on the <ip_block> IP block.
Adapt ports to match the instantiation in <file>:<line>.
Original ports: <detected_ports>
IP block ports: <ip_ports>
Generate the module, then create a testbench.
For Stubs
Use Task tool:
subagent_type: "gateflow:sv-codegen"
prompt: |
Implement the stub module at <file>.
The module signature is already defined:
<module_signature>
Based on the port names and context, this appears to be a <type>.
Implement full functionality, following the existing codebase patterns.
For CDC Issues
Use Task tool:
subagent_type: "gateflow:sv-refactor"
prompt: |
Add CDC synchronization at <file>:<line>.
Signal <signal> crosses from <src_clk> to <dst_clk> domain
without synchronization.
Insert a cdc_2ff synchronizer (from GateFlow IP library).
Ensure the synchronizer is properly reset.
Pattern Detection Rules
FIFO Detection
Confidence: HIGH if module has:
- wr_en/write + rd_en/read signals
- full + empty signals
- data_in/wr_data + data_out/rd_data signals
- Single clock → fifo_sync
- Dual clock → fifo_async
CDC Detection
Confidence: HIGH if:
- Signal assigned in always_ff @(posedge clk_a)
- Signal read in always_ff @(posedge clk_b) where clk_a != clk_b
- No synchronizer between domains
Confidence: MEDIUM if:
- 2+ flip-flop chain detected but not using standard sync pattern
Protocol Detection
SPI: sclk + mosi + miso + cs_n (any naming variant)
UART: tx/rx + baud-related parameter
I2C: scl + sda (bidirectional)
AXI: *valid + *ready + *addr + *data patterns
Vendor IP Detection
Xilinx: IBUF, OBUF, BUFG, MMCME2, PLLE2, BRAM_TDP, DSP48E1
Lattice: SB_IO, SB_GB, SB_PLL40, SB_SPRAM, SB_RAM
Gowin: IBUF, OBUF, rPLL, SDPB, pROM
Intel: altpll, altsyncram, altddio
Integration with /gf Orchestrator
The /gf orchestrator can invoke IP detection:
- Before any new feature implementation (check what exists)
- After codebase mapping (enrich with IP analysis)
- When user says "what's missing" or "scan for gaps"
Integration with /gf-architect
Combine with codebase mapping:
/gf-architect maps the module hierarchy
/gf-ip-detect overlays IP analysis on the map
- Result: hierarchy + IP opportunities + CDC issues
Commands
- "Scan for missing IP blocks" → full detection + report
- "Auto-fill missing modules" → detect + dispatch agents
- "What IP blocks does my project need?" → detection + suggestions
- "Find CDC issues" → focused CDC crossing analysis
- "Replace ad-hoc code with verified IP" → pattern match + swap
Extended Vendor IP Detection
Additional primitives to detect beyond existing list:
- Xilinx UltraScale+: URAM288, DSP48E2, BUFGCE, MMCME4_ADV, GTHE4_CHANNEL, STARTUPE3
- Intel Agilex: IOPLL, RAM20K, M20K, MLAB, tennm_ph2_iopll
- Lattice ECP5: EHXPLLL, DP16KD, TRELLIS_FF, DCUA, EXTREFB
- Gowin (extended): rPLL, PLLVR, SDPB, DPB, pROM, EMCU, DHCEN
- Microchip PolarFire: LSRAM, uSRAM, MACC, CCC, SERDES_IF
- Efinix: EFX_PLL, EFX_RAM_5K, EFX_DPRAM_5K, EFX_GBUFCE
False Positive Reduction
| Pattern | False Positive When | Action |
|---|
| 2FF chain | Inside shift register (3+ stages) | Skip |
| 2FF chain | Both FFs same clock | Skip |
| FIFO signals | Inside module named *fifo* | Skip |
| valid/ready | AXI bus already using IP block | Skip |
| SPI signals | Inside testbench files (tb_*, *_tb.sv) | Skip |
| Vendor primitive | In comments or string literals | Skip |
Severity Scoring
| Severity | Criteria | Examples |
|---|
| CRITICAL | Data corruption, metastability | CDC without synchronizer |
| HIGH | Missing module, empty stubs | Instantiated but undefined |
| MEDIUM | Ad-hoc reimplementation | Hand-rolled FIFO, manual 2FF |
| LOW | Style, minor optimization | Vendor primitive with OSS equivalent |
| INFO | Already correct | Verified IP properly used |
Auto-Suggestion Integration
| Detected Pattern | Suggested Command | Parameters |
|---|
| Sync FIFO signals | /gf-ip add fifo_sync | WIDTH=detected, DEPTH=next_pow2 |
| Async FIFO signals | /gf-ip add fifo_async | WIDTH=detected, DEPTH=8 |
| 2FF CDC crossing | /gf-ip add cdc_2ff | default |
| Multi-bit CDC handshake | /gf-ip add cdc_handshake | WIDTH=detected |
| UART pattern | /gf-ip add uart | CLK_FREQ=detected, BAUD=115200 |
| SPI pattern | /gf-ip add spi_master | CLK_DIV=computed |
| AXI register pattern | /gf-ip add axi4lite_slave | ADDR_WIDTH=detected |
| Button debounce | /gf-ip add debouncer | DEBOUNCE_MS=20 |