处芯积律 RISC-V SoC 基础版(SoC V1.1)
单核 RISC-V SoC 完整入门闭环:含顶层互连、存储与外设通路、TB 与脚本入口;配套概念框图与架构/设计/验证分域知识点,训练从「跑通」到「能讲清、能定位」的工程习惯。
/project/SOC_V1.1/To_Customer
SoC V1.1 是单核 RISC-V SoC 的体系化入门项目,目标不是“只把仿真跑起来”,而是让学员真正建立 SoC 级工程认知:顶层如何组织、总线如何连接、外设如何挂接、仿真如何闭环。项目内容覆盖从目录理解、脚本入口、基础用例到问题定位的完整链路,强调“看懂系统 + 会做调试 + 能产出结论”。
导读:这是什么 · 能学什么 · 怎么学
一、这是什么项目?
本项目是面向入门的「单核 RISC-V SoC」完整仿真工程:在服务器上提供从 SoC 顶层、CPU、总线互联到外设与存储的一套可跑通 RTL 与仿真脚本组织。学员在 VNC 远程环境的个人目录下的工程副本中完成实践;官方源为只读,路径见本页「快速开练命令」,须先使用 cp -a 复制到你的家目录后再改。
它与「只写一个小模块的 testbench」不同:强调的是 SoC 级工程视角——顶层如何划分、总线与外设如何挂接、从编译到出波形的脚本入口在哪、出问题如何下钻到 RTL 或 TB。适合需要第一份可写进简历、能口头讲清主链路的 SoC 闭环经历的 IC 设计或验证入门者。
下文给出「验证平台 ↔ SoC DUT」的概念框图与典型功能块说明,便于先建立心理模型;具体实例化名与目录划分以你手上的工程 README、RTL 顶层与讲义为准。
二、能学到什么?
下面按架构、RTL 设计、验证三条线拆开,你可逐项自查是否「讲得出来、做得出来」。
架构与系统视角
- 单核 SoC 常见划分:处理器子系统、系统互连(含地址译码或路由)、存储子系统或存储器接口、外设子系统(UART/Timer/GPIO 等)、可选的调试或中断聚合等。
- 地址映射:同一总线主设备发起的读写如何经译码落到不同从设备;能结合简单框图口述一次取指、一次对外设寄存器的写、一次对 SRAM/ROM 区的读的大致路径。
- 时钟与复位:复位释放顺序、外设缺省初值与「谁先就绪」对首条指令或首轮总线访问的影响(以本工程约束为准)。
- 软件可见性:即便当前以 RTL+TB 仿真为主,也应能说出「第一条指令从哪里取」「某外设寄存器大致落在哪个地址区间」,为日后接固件打基础。
RTL / 设计向知识点
- 层次化 RTL:从 SoC 顶层看清例化关系、接口位宽与主从方向;可向下定位 Core、互连桥、外设 IP,并核对时钟域与复位域(即使单同步域也需自行确认)。
- 总线侧行为:主设备发起 transaction 的握手与反压、从设备响应;单次与突发(若协议支持)在本工程实现中的体现。
- 常见可综合改动类型:寄存器默认值、参数化位宽、条件分支局部调整、打拍或门控(仅限课程允许范围),体会改动面与所需验证面的对应关系。
- 编码习惯:命名、注释、端口列表、避免隐式 latch、复位策略等在本工程中的落点,为参与团队 RTL 评审做演练。
验证与平台知识点
- Testbench:DUT 例化方式、时钟复位产生、激励加载、比对手段(参考模型、文件比对、断言等,以工程为准)。
- 脚本分层:编译文件列表与 `+incdir`、仿真器调用、seed、批处理与波形调试两种入口的职责划分。
- 日志调试:关键字检索、仿真时间与波形时间对齐;整理失败用例的时间轴与期望/实际对照表。
- 波形方法:信号分组、总线事务展开、沿激励回溯至 RTL;能写明「观测了哪些信号、它们如何支撑结论」。
- 最小回归:改动后跑与本次相关的用例子集,记录命令、结果与相对基线的差异,避免凭感觉过关。
三、怎么学?
建议按「环境 → 副本 → 零改动基线 → 读代码地图 → 受控实验 → 复盘」推进;首轮闭环约一至二周、每天一至二小时可完成。
- 环境与权限:开通仿真实践与 VNC,登录实践桌面;核对 shell、EDA 版本与工程 README(若有 module/source 脚本须按说明加载)。
- 个人副本:cp -a 只读路径到家目录;一切编辑与仿真仅在副本中进行,便于 diff 与回滚。
- 零改动跑通:按 README/讲义找到默认仿真入口与用例,完整跑一轮;保存完整 log,必要时另存波形,标注为 baseline。
- 绘制地图:手写或笔记中画出主数据路径与目录树;对照本页架构图,把 RTL 顶层真实模块名填入框图。
- 三遍读代码:第一遍只看顶层与各子模块端口表;第二遍沿一条主线(取指→总线→外设寄存器)顺藤摸瓜;第三遍只看 TB 如何驱动出第一条有意义的事务。
- 受控实验:每次只改一处(参数或少量 RTL),立即记录动机与预期;跑与改动强相关的最小用例集,对比 baseline。
- 复盘交付:至少完成一份含「现象、假设、证据链、结论、回归记录」的调试复盘,可附关键波形说明或信号列表。
分周节奏(可按个人情况伸缩)
- 第 1~2 天 环境打通、副本就位、默认用例零改动跑通并保存 baseline;浏览 README,列出三个最陌生的术语作为后续清单。
- 第 3~5 天 对照框图精读顶层与子系统例化;画出地址与数据主路径;能向他人讲解从复位释放到第一条有效总线访问。
- 第 6~8 天 理清 compile/run/wave 脚本链;练习日志与波形对照;在讲义允许范围内尝试切换参数或小用例。
- 第 9~10 天(可选巩固) 完成一处最小 RTL 或参数改动并做最小回归;撰写复盘;对照本页「完成标准」自检。
系统架构示意(概念框图)
用于建立整体心理模型;工程内模块命名、时钟域划分、存储具体形态以实际 RTL 与讲义为准。
IF·ID·EX·LSU"] DBG["Debug / IRQ"] end subgraph BUS["互连域"] DEC["译码 / 路由"] ARB["仲裁 / 桥"] end subgraph MEM["存储子系统"] IM["指令通路
ITCM/IROM"] DM["数据通路
DTCM/SRAM"] end subgraph PERI["片上外设 IP"] UART["UART"] TIM["Timer/PWM"] GP["GPIO/WDT"] end end TB_CLK --> RV TB_LD --> RV RV --> DEC DBG -.-> RV DEC --> ARB ARB --> IM ARB --> DM ARB --> UART ARB --> TIM ARB --> GP TB_WV -.-> RV
连线表示关注的主数据与控制关系,非某具体总线协议的时序细节;请在工程中结合协议与信号名核对。
片上 IP / 外设类型(教学归纳)
下列为单核 SoC 入门工程中常见的挂载类别;实例化名与地址映射以 RTL 与课程讲义为准。
典型功能块说明
下表按教学视角归纳常见职责与设计/验证关注点;具体层次名、信号名与协议细节以你手中的 RTL、顶层例化与课程讲义为准。
RISC-V Core 子系统
职责概要:完成取指、译码、执行、访存,是大多数总线事务的发起方。
设计侧:关注与互连的接口约定、流水停顿、异常/中断/调试(若已例化)对接口侧的影响。
验证侧:从复位后首次取指到首次访问存储或外设,在波形上标注阶段与对应总线事务。
系统互连 / 地址译码
职责概要:将 Core 访问路由到存储、外设等不同从设备,决定可访问空间与仲裁。
设计侧:译码规则、片选与多从设备并联;若存在协议桥,弄清主从端口与握手时序。
验证侧:据地址预判哪一路从端口应响应;可用波形验证边界或非法访问行为(若 TB 覆盖)。
存储与指令/数据通路
职责概要:承载启动镜像、常量与数据访问,可能为分立 ITIM/DTIM、ROM 或统一存储模型。
设计侧:数据宽度对齐、字节使能、与互连的拍对齐关系;弄清复位后 PC 与映射关系约束。
验证侧:对齐 log 中访存地址与波形通道上的读写 beat,确认与用例预期一致。
外设子系统
职责概要:UART、Timer、GPIO 等,多以寄存器映射挂于窄总线或 APB。
设计侧:寄存器位域与复位初值;中断合并或时钟门控(若有)对可见行为的影响。
验证侧:练习「写寄存器→内部状态或 TX→状态位/中断」闭环,并指出波形观测点。
Testbench 与仿真平台
职责概要:产生时钟复位、加载程序或向量、控制仿真结束;常含波形 dump 开关。
设计侧:明确 TB 与 DUT 边界;扩展用例前优先读懂现有 TB 结构。
验证侧:从 log 关键字跳到波形时间戳;会开关波形、调整仿真时长或断言(若允许)。
项目核心内容(完整范围)
- SoC 顶层与模块层级:core、互连/译码、存储通路、外设、TB 边界与接口关系。
- 系统地址映射与数据路径:能在纸上画一遍「读写落在哪儿」。
- 仿真工程:编译列表、运行脚本、日志与波形、默认用例与常用开关。
- 定向改动与小回归:参数与局部 RTL 变更的影响评估与验证闭环。
- 目录与脚本组织:为进阶 SoC 工程建立统一导航习惯。
关键难点与常见卡点
- 第一次接触 SoC 时,容易只看局部模块,忽略系统链路。
- 波形和日志信息多,如何快速收敛定位点是关键。
- 改动后回归不充分,容易出现“看似通过、实际埋雷”。
模块级深度讲解(做什么、看什么、怎么验)
SoC 顶层与总线主链路
重点:在 RTL 中找到 Core、互连、存储与外设的例化层级;对照地址映射表(讲义或头文件)理解一次读写的路由。
验收:不看讲义能在白纸或文档上画出主数据流,并向同伴口述「CPU 发起→译码→目标从设备」的一条完整路径。
存储与启动路径
重点:复位后 PC、第一条指令所在存储区域、与 TB 装载镜像(若有)之间的关系。
验收:能用波形标出首次取指对应的存储访问,并解释其与仿真 log 中打印一致。
外设寄存器路径
重点:选一个 UART 或 Timer 类外设,追到寄存器 RTL 与访问路径。
验收:完成一次「写寄存器→观测波形内部节点或输出→读状态寄存器」的可叙述闭环。
仿真入口与脚本层级
重点:Makefile 或脚本中 compile、elaborate、run、dump 的分工;环境变量与 `+define+` 对结果的影响。
验收:在不动功能代码的前提下切换默认用例或打开/关闭波形,且两次结果可解释、可复现。
波形与日志联合定位
重点:为关键总线或控制信号建组;用 log 时间戳在波形中打时间游标。
验收:任选一失败或异常结束用例,写出含时间、信号、根因假设的半页纸分析(可配截图)。
分阶段执行方案(讲义级节奏)
以下四阶段与上文「导读—三、怎么学」「分周节奏」一一挂钩:每阶段都要有可检查产出(日志、波形、框图、diff、对照表),避免只「感觉学过了」却没有物证。阅读时建议对照右侧「过关标准」,用勾选表自评进度。
本阶段目标:建立可复现的仿真入口与「跑通证明」,作为后续一切对比的唯一基准。
与导读的衔接:对应导读「副本 + 零改动跑通」。没有稳定的 baseline,谈不上回归与归因。
任务分解:
- 完成 VNC/权限与 shell、EDA 环境对齐(module、PATH 等以 README 为准)。
- 使用 cp -a 将只读工程复制到个人目录;此后所有操作仅在副本中进行。
- 定位默认 compile/run 命令与基准用例名,一次性跑通并保存完整 log。
- 若讲义要求波形:打开 dump,记录波形文件路径与生成命令(便于他人复现)。
- 在笔记中绘制第一版系统框图:将本页示意图中的占位名替换为 RTL 顶层真实模块名。
建议产出(物证):
- 标注日期的 baseline 日志(或校验摘要)
- 可选 baseline 波形与生成命令
- 含真实模块名的框图草稿
过关标准:从零开始在约一刻钟内可重复同一通过结果;能口头说出 sim 产物所在目录与主脚本入口。
本阶段目标:把「地址—数据—控制」与 RTL 层次、TB 激励对齐,形成可讲解、可验证的心智模型。
与导读的衔接:对应导读「三遍读代码」与模块功能表;本阶段结束应能回答「第一次总线事务谁发起、落到哪个从端口」。
任务分解:
- 精读 SoC 顶层例化与子模块端口表,标注主设备与从设备方向。
- 按讲义整理内存/外设地址区间表,并与 RTL 译码或参数化定义交叉核对。
- 任选一条主线(建议:复位释放 → 首次取指 → 首次访存或外设访问)沿 RTL 跟完。
- 对照 TB:从 `initial`/`task`/激励序列追踪到「第一条有效总线事务」出现的时刻与条件。
- 记录三个「若被追问」问题:PC 初值、镜像装载方式、默认外设初态来源。
建议产出(物证):
- 手写或电子地址映射表
- 主线追踪笔记(模块路径 + 关键信号名)
- TB 驱动路径摘要(可选贴代码行号)
过关标准:可连续口头讲解不少于 10 分钟的「架构与映射」,同伴能听懂且少追问基础概念。
本阶段目标:用一次最小可行改动验证你是否真理解影响面,并练习「改—证—比」的工程节奏。
与导读的衔接:对应导读「受控实验」;改动必须可描述、可 diff、可回归,否则无法写进简历。
任务分解:
- 在课程允许范围内选择一处极小改动:寄存器默认值、参数化常量、或局部 RTL 的几行逻辑。
- 列出「最小回归清单」:只包含与该路径相关的用例或子集,避免迷信全量。
- 保存改动前后 diff、完整命令行、两次运行的 log 摘要(含 pass/fail 与关键打印)。
- 若结果异常:写下假设 → 用波形/日志验证 → 通过则收敛,否则回到阶段 2 扩展观测点。
建议产出(物证):
- git diff 或文件 diff
- 回归命令与用例列表
- 前后对照表(状态/打印/波形截图要点)
过关标准:任意同事可根据你的记录复现「改动 + 回归 + 结论」,无需口头补充关键命令。
本阶段目标:把隐性经验显性化,形成可投递、可答辩、可迁移的文档资产。
与导读的衔接:对应导读「复盘交付」与下文「完成标准」;可选故障注入用于强化定位叙事。
任务分解:
- 按「现象—假设—证据(日志时间戳与信号)—结论—回归是否通过」撰写结构化复盘。
- 可选练习:在副本中故意引入一处轻微错误(随后恢复),练习从 log 到 RTL 的定位叙述。
- 整理一页纸:框图 + 一条代表波形路径 + 一条改动案例,用作面试附录或星球打卡。
- 自查:对照本页「完成标准」与「避坑手册」,勾选是否每一项都已覆盖。
建议产出(物证):
- 复盘正文(建议 Markdown/PDF)
- 一页纸答辩摘要
- 可选故障注入的前后对比
过关标准:第三者阅读你的文档后,能大致复现实验命令并理解结论依据;你本人能脱稿讲述 STAR。
避坑手册
- 只盯一个模块,不看总线链路,导致定位方向反复偏移。
- 改动后没有基线回归,无法判断是新问题还是旧问题。
- 只看 pass/fail,不看关键波形与日志细节,结论不可靠。
完成标准(你做到这些才算真正做完)
- 默认用例可稳定运行,且可重复复现结果。
- 至少完成 1 次可解释的改动验证闭环。
- 提交 1 份结构化调试复盘(含信号与日志证据)。
答辩与简历:一页纸浓缩表述
上文已从「是什么、学什么、怎么学」分域展开;下列三条线与导读不是简单重复——侧重「对外叙事」:面试或简历里如何用有理有据的一句话证明你真的做过 SoC 闭环。
可复述的「能力证据」(STAR / 证据链)
- Situation:说明工程规模——单核 RISC-V SoC,含 Core、互连译码、存储与外设通路,仿真在远程个人副本完成。
- Task:说明你承担的任务——跑通基线、读懂顶层与映射、完成一次受控改动并最小回归。
- Action:列出关键动作——指向具体产物:框图模块名来自真实 RTL、日志时间戳与波形对齐、留存 diff 与命令行。
- Result:用结果说话——回归对比结论、定位到具体 RTL/TB 行或参数、他人可按你的记录复现实验。
相对「只做子模块 TB」的增量价值(面试官常问)
- 你掌握的是跨 Core—互连—从端口的地址与数据路径,而不是单点波形通过。
- 你习惯用基线—对比—最小回归论证改动,而不是「仿真结束就交差」。
- 你能把脚本层(谁 compile、谁 run、产物在哪)与 RTL 行为串成一条故事,这正是企业 SoC 岗日常沟通方式。
与后续路线(V2.0 / V3.0 / 多核等)如何衔接
- V1.1 提供统一「读目录—认顶层—跟脚本—做基线」的方法论;进阶项目主要换规模与专题,不换做事方式。
- 把本项目的复盘文档与命令模板当作个人资产,进阶时只增量维护,不必从零摸索工程习惯。
建议产出(可用于复盘/求职)
- 个人目录可复现运行的工程副本与关键命令记录。
- 至少 1 份含日志—波形—RTL 指向的定位说明或结构化复盘。
典型实验任务清单(1-2-3 步)
- 复制基础版工程到个人目录并跑通默认仿真用例。
- 修改一个小模块或参数,观察日志与波形变化。
- 输出一次问题定位记录(现象、原因、修复、回归结果)。
快速开练命令
cd /home/USER/soc3_practice
cp -a /project/SOC_V1.1/To_Customer ./soc-v1-1_my
cd ./soc-v1-1_my && ls -la
建议前置基础
Verilog/SystemVerilog 基础、数字电路基础、基本 shell 命令。