SoC Build 教程
SoC 前端 RTL 自动化构建工具集,通过自然语言交互,完成 SoC 项目初始化、模块集成、CRG 生成,PINMUX 生成等工作
一、项目脚手架
01
初始化 SoC 项目
PROJECT INIT
💬 对话示例
"帮我初始化一个 soc 项目"
解析需求 → 创建目录结构 → 生成 Makefile 和 README
项目骨架已生成,共 8 个目录
📁 <project_name>/
├── Makefile # 顶层构建入口
├── README.md
├── chip/ # RTL 设计源码
│ ├── core/ # 处理器核心
│ ├── bus/ # 总线
│ ├── periph/ # 外设
│ ├── interconnect/ # 互联
│ ├── top/ # SoC 顶层
│ ├── lib/ # 通用库
│ └── Makefile # Chip 级仿真入口
├── ip/ # IP 目录
│ ├── digital/ # 自研 IP
│ │ └── template_ip/ # IP 模板(可独立仿真)
│ └── third_party/ # 第三方 IP
├── doc/ # 文档
│ ├── arch/
│ └── spec/
└── scripts/ # 公共脚本
├── setup.sh # 环境初始化
└── common.mk # 公共仿真编译规则
各目录用途:
• chip/ — RTL 源码,按功能分区(core/bus/periph/interconnect/top/lib)
• ip/ — IP 仓库,自研 IP 放在 digital/,第三方 IP 放在 third_party/
• doc/ — 架构设计文档与接口规范
• scripts/ — 公共编译规则 common.mk,被 chip/ip 共享
二、仿真与验证
02
模块仿真
SIMULATION
💬 对话示例
"编译这个模块" / "跑下仿真" / "做 lint 检查"
在模块目录下执行 Makefile 目标
支持 VCS、Verilator、Iverilog、Xcelium
# 编译(de/ 下默认顶层为 RTL 模块)
cd chip/top/de && make comp SIMULATOR=iverilog
# 编译(dv/ 下默认顶层为 tb)
cd chip/top/dv && make comp SIMULATOR=iverilog
# lint 检查
make lint LINT_TOOL=verilator
make lint LINT_TOOL=iverilog
# 运行仿真
make run
03
filelist.mk 依赖管理
FILELIST
💬 对话示例
"这个模块依赖了 core,怎么加到 filelist"
在子模块的 filelist.mk 中声明依赖
make comp 时自动按依赖顺序展开
# chip/top/de/rtl/filelist.mk
include $(PROJECT_ROOT)/chip/core/de/rtl/filelist.mk
# 父模块 Makefile 中取消注释
include $(RTL_PATH)/filelist.mk
filelist.mk 在注册到 MODULE_FILELISTS 时会自动去重,避免同一模块被重复添加。
三、顶层集成
04
提取模块端口
PORT EXTRACTION
💬 对话示例
"提取这个模块的端口"
"看看这个模块有什么接口"
"看看这个模块有什么接口"
解析 Verilog → 提取参数和端口信息
模块有 3 个参数、28 个端口
05
生成实例化代码
INSTANTIATION
💬 对话示例
"帮我生成这个模块的实例化代码"
解析模块端口 → 生成对齐格式的实例化
已生成实例化代码,28 个端口
06
集成模块到顶层
TOP INTEGRATION
💬 对话示例
"把这几个模块集成到顶层"
"生成 soc 顶层"
"生成 soc 顶层"
解析子模块端口 → 智能连接 → 生成顶层 RTL
顶层已生成,集成 5 个模块
📋 智能连接规则
- →同名 input 端口 → 共享为顶层 input
- →output + input 混合 → 内部 wire(output 驱动 input)
- →output + output → 各自独立,加模块前缀区分
07
端口变更追踪
PORT TRACKING
💬 对话示例
"对比下这个模块端口有没有变"
"检查端口是否符合规范"
"检查端口是否符合规范"
保存端口快照 → 对比检测变更 → 生成报告
发现 3 个新增端口,1 个删除
08
刷新顶层(子模块更新后)
TOP REFRESH
💬 对话示例
"子模块端口变了,更新下顶层"
"刷新 soc_top"
"刷新 soc_top"
检测端口变更 → 更新实例化 → 标记变更点
已更新 3 个模块,5 个端口变更
📌 变更标记
- [NEW] 新增端口
- [MOD] 方向/位宽修改
- [DEL] 已删除端口(实例化末尾保留注释)
09
保留手动修改的连线
MANUAL SYNC
💬 对话示例
"我手动改了顶层,帮我同步到配置"
提取修改后的连线 → 同步到配置文件
已同步 12 条手动连线
四、RTL 自动生成
四、RTL 自动生成
10
生成 CRG
CRG GENERATION
💬 对话示例
"帮我生成 CRG"
"生成时钟复位模块"
"生成时钟复位模块"
解析 Excel 配置 → 生成时钟/复位逻辑
CRG 已生成,50 个时钟,54 个复位
11
生成 IO/PINMUX
IO GENERATION
💬 对话示例
"生成 IO pad"
"生成 pinmux"
"生成 pinmux"
解析 IO 配置 → 生成 pad/pinmux 模块 + 寄存器文件 + SDC 约束
IO 模块已生成,32 个 pad
12
生成寄存器 RTL
REGFILE RTL
💬 对话示例
"从 YML 生成寄存器文件"
"帮我生成 apb regfile"
"帮我生成 apb regfile"
解析 YAML 寄存器描述 → 生成 APB/AHB 接口 regfile
已生成 demo_apb_regfile.v
13
从 Excel 生成寄存器 RTL
REGFILE EXCEL
💬 对话示例
"从 Excel 生成寄存器"
"excel 转 yml"
"excel 转 yml"
解析 Excel 寄存器描述 → 生成 YAML → 生成 Verilog regfile
已生成 demo.yml、demo_apb_regfile.v
14
生成 Memory Map
MEMORY MAP
💬 对话示例
"生成地址映射"
"memory map"
"memory map"
解析 Excel memorymap sheet → 生成地址映射 YML
已生成 soc_asic.yml,包含 8 个 address block
15
生成 Memory Wrapper
MEMORY WRAPPER
💬 对话示例
"生成 memwrap"
"memory wrapper"
"memory wrapper"
生成 memory wrapper 模块
已生成 memwrap 模块
五、端口变更追踪
MCP Server
MCP
MCP Server
INTEGRATION
💬 快速开始
soc-build 提供轻量级 MCP Server,AI 助手可直接调用全部 22 个工具
一键安装依赖 + 自动配置 MCP
核心 CLI 脚本保持不动,MCP 只是包装层
# 一键安装依赖 + 自动配置 MCP
./setup.sh --install
# 或手动启动
python3 mcp_server.py
注意事项
- Python 依赖:
pandas、numpy(CRG 生成需要) - 生成的顶层文件:文件头带
AUTO-GENERATED标记,不建议直接手动编辑 - 手动修改保留流程:修改顶层 → 提取连接关系 → 重新生成
- 信号命名:独有端口自动加模块前缀,共享端口保持原名
- CI 自动化测试:每次 push/PR 自动验证初始化、编译、lint、依赖传递