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 顶层"
解析子模块端口 → 智能连接 → 生成顶层 RTL
顶层已生成,集成 5 个模块
📋 智能连接规则
  • 同名 input 端口 → 共享为顶层 input
  • output + input 混合 → 内部 wire(output 驱动 input)
  • output + output → 各自独立,加模块前缀区分
07

端口变更追踪

PORT TRACKING
💬 对话示例
"对比下这个模块端口有没有变"
"检查端口是否符合规范"
保存端口快照 → 对比检测变更 → 生成报告
发现 3 个新增端口,1 个删除
08

刷新顶层(子模块更新后)

TOP REFRESH
💬 对话示例
"子模块端口变了,更新下顶层"
"刷新 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"
解析 IO 配置 → 生成 pad/pinmux 模块 + 寄存器文件 + SDC 约束
IO 模块已生成,32 个 pad
12

生成寄存器 RTL

REGFILE RTL
💬 对话示例
"从 YML 生成寄存器文件"
"帮我生成 apb regfile"
解析 YAML 寄存器描述 → 生成 APB/AHB 接口 regfile
已生成 demo_apb_regfile.v
13

从 Excel 生成寄存器 RTL

REGFILE EXCEL
💬 对话示例
"从 Excel 生成寄存器"
"excel 转 yml"
解析 Excel 寄存器描述 → 生成 YAML → 生成 Verilog regfile
已生成 demo.yml、demo_apb_regfile.v
14

生成 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 模块
已生成 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 依赖pandasnumpy(CRG 生成需要)
  • 生成的顶层文件:文件头带 AUTO-GENERATED 标记,不建议直接手动编辑
  • 手动修改保留流程:修改顶层 → 提取连接关系 → 重新生成
  • 信号命名:独有端口自动加模块前缀,共享端口保持原名
  • CI 自动化测试:每次 push/PR 自动验证初始化、编译、lint、依赖传递