Use when processing RTL modules at the microarchitecture level - including FIFO, state machines, counters, arbiters, decoders, or any Verilog/SystemVerilog hardware design. Load this skill immediately upon identifying RTL design tasks, before diving into brainstorming,planning or implementation.
This skill provides microarchitecture design guidance for RTL modules. It covers design principles, naming conventions, interface design, module partitioning, and architectural decisions that should be established before writing code.
Core principle: Good microarchitecture decisions made early prevent costly refactoring later.
Load this skill when:
Do NOT wait until coding phase. Microarchitecture decisions shape the entire design process.
Define interfaces before implementation:
Module Interface Template:
- Clock and reset naming (clk, rst_n)
- Data signals: prefix-based naming (in_vld, in_rdy, in_data)
- Control signals: clear semantic names
- Parameter naming: ALL_CAPS with explicit types
Split modules by:
Signal naming:
_n (rst_n)xxx_vld, xxx_rdy, xxx_datav_ for independent signals of same typeModule naming:
sc_bus_arbiter not arbiterParameter naming:
DATA_WIDTH, FIFO_DEPTHparameter integer unsigned DATA_WIDTH = 8For async designs:
| Design Aspect | Key Considerations |
|---|---|
| Interface | Define before implementation, use consistent prefixes |
| Partitioning | Single responsibility, separate timing domains |
| Naming | Meaningful, consistent, prefix-based for buses |
| Parameters | Type-explicit, ALL_CAPS, synthesizable defaults |
| Clock Domains | Identify early, plan CDC structures |
| Reset | Document type, synchronous release |
Before coding, answer:
| Mistake | Impact | Fix |
|---|---|---|
| Inconsistent naming | Debugging nightmare | Define naming convention upfront |
| Late partitioning | Rewrites, bugs | Partition during design phase |
| No interface spec | Integration failures | Define all interfaces first |
| Ignoring CDC | Metastability, data corruption | Identify clock domains early |
| Hard-coded values | Non-reusable modules | Parameterize from start |
Interfaces:
- Write side: wr_clk, wr_rst_n, wr_en, wr_data, full
- Read side: rd_clk, rd_rst_n, rd_en, rd_data, empty
Key decisions: Depth, width, clock domains, full/empty logic
Interfaces:
- Control inputs, status outputs
- State-specific data paths
Key decisions: Encoding (one-hot/binary), state partitioning, FSM type (Moore/Mealy)
Interfaces:
- Request/Grant pairs per master
- Shared resource interface
Key decisions: Arbitration policy, priority scheme, fairness
Good microarchitecture:
Poor microarchitecture: