一个完整的SoC通常就是我们所说的CPU,它包含了处理器内核等其他的设备或存储器
1. SOC设计
本节主要对SoC设计的整体架构进行概述,具体详情请参照标题下的链接。
1 处理器核心
Core在总线上作master存在,是所有指令的发起者和终结者。core包含控制器和数据通路
根据core的结构可分类为
- 单核
- Hart(Hardware Thread)
使用超线程技术,在一个核中实现多个硬件线程,每套线程有自己独立的寄存器组等上下文资源,且大多数资源均可被复用 - 多核
2 存储器结构
1)片上存储资源
片上资源一般速度快,容量小。一般存储体是嵌在芯片里的
- Cache
高速缓存,作用和内存一样,但读取速度接近于CPU主频,主要存放一些CPU经常用到的数据,减小core执行和访存延迟之间的性能差异,提高整体运行效率。一般分为一级缓存(L1)和二级缓存(L2),有的也会有三级、四级cache,L1集成在芯片内部,L2是板级的。SoC基本采用SRAM来实现Cache。sram(static ram)掉电丢失,无需复位信号;其存储体一般由Memory Compiler(一般foundry提供)生成。memory complier生成sram后,不止有verlog代码,还有不同温度下的相关的.lib文件。在做 DC综合时 先要把lib文件转换成 相应的.db文件 然后才可以用;
有的也会用紧密耦合内存(RAM)来实现,用于存储指令和数据的高速内存,分为两种:ITCM和DTCM;ITCM:指令存储器,地址区间可由load和store访问,DTCM:数据存储器,只能被core的数据存储器访问指令访问 - eflash
片内flash一般都是NORflash,存储运行程序,能直接像内存RAM一样寻址,CPU可直接内部flash运行程序,通常以高速总线上的slave的形式存在,支持boot区空间的擦写保护。 - fifo
fifo深度的影响:深入理解FIFO(包含有FIFO深度的解释)_foolish的博客-CSDN博客_fifo
2)片外存储资源相关控制器
片外存储容量大,速度相对较慢,存储体由片外外接,片上只有相关控制器电路
- 片外sram控制器
通常以高速总线上的slave的形式存在,支持DFT/BIST功能; - SDRAM控制器
控制SDRAM(synchronous dynamic ram)存储体,以DDR为例,包括controller和PHY两部分 - NandFlash控制器
片外flash,可以存储运行程序,文件数据等。既有norflash,也有nandflash
硬件部分:实现高速总线接口,实现ECC编码,实现错误定位
软件部分:LLD:控制器底层驱动,主要包括存储数据的准备和后处理,对时序控制寄存器的配置,命令地址寄存器的配置,DMA的配置以及ECC纠错;FTL related:包括写均衡,环块管理和碎片管理 - SATA控制器
SATA接口通常是指2.5寸规格的硬盘接口,包括磁盘以及固态硬盘。只使用AHCI协议,SATA接口走SATA总线。主流的SATA3.0总线最大传输速度为6Gbps,实际速度最大为560MB/s左右。
有些SSD(固态硬盘)也采用SATA接口,SSD是采用固态电子存储芯片阵列制成的硬盘,其结构主要包括主控芯片、闪存、外置缓存颗粒、PCB板等,主控芯片类似于CPU负责内部运算,闪存NAND Flash主要用于存储内容。
3 系统总线BUS
系统总线Bus可以为不同厂商的IP提供一个标准的接口,作为IP共享的通信链路,同时总线可以减少互联,方便IP的增加和裁剪。根据协议不同有AMBA等总线。
总线上分为主设备(master)和从设备(slave),有的设备既可以作为从设备,也可以作为主设备,如core、debug模块、I2C,SPI等,但是在同一时刻,只能有一个master占用总线
- AMBA总线
目前做常用的通用总线为ARM的AMBA总线:根据带宽,传输速度等性能不同可分为AXI,AHB,APB三种总线。
- AXI总线
详情参见:SoC设计与验证——总线篇——AXI总线_KGback的博客-CSDN博客 - AHB总线
- APB总线
一种低速、低带宽的系统总线,一般接外部的一些低速IP。
详情参见:APB总线_bleauchat的博客-CSDN博客_apb总线
- 其他总线
4 外设IP
- 大型IP
一般来说,大型IP的RTL代码量较大,功能点较多,设计更为复杂,一般由IP厂商定制设计;IP厂商一般会提供行为级的仿真代码和物理层模型,分别用于验证仿真和后端布局布线以及流片使用。
-
PCIe接口控制器
PCIe一般用在大型数据中心,可以接显卡,网卡等片外设备。CPU核通过DMA控制PCIe,中间介质为DDR存储器。
详细参考链接:SoC设计与验证——大型IP——PCIE控制器_KGback的博客-CSDN博客 -
DDR控制器
-
一些小型外设IP
该部分IP功能较多,且复杂程度不同,且一般带宽较小,通常接在一些低速总线上,例如APB总线
-
Debug模块
-
FLL控制器
锁频环,又称为自动频率控制(AFC)环,其利用反馈对输入时钟变化进行调整,最后达到对时钟的跟踪 -
USB控制器
-
DMA控制器
通过硬件实现的数据传输机制,可在无CPU参与的情况下完成数据的传输。与高速总线相连,用于控制模块间的高速数据传输(无需CPU中转数据,减轻CPU压力,提高了其吞吐率)
在总线上工作时,与存储器交互时作master,与CPU,DSP等处理器交互时作slave,因此在无任务时作为slave存在 -
SD Host控制器
硬件部分:实现高速总线主(DMA)从(寄存器)接口,SD总线接口,命令和数据处理模块
参考链接:SoC设计与验证——外设篇——SD Host和card_KGback的博客-CSDN博客_sd卡控制器
软件部分:底层驱动,主要包括对控制器的配置,初始化、读写操作 -
中断控制器
中断控制器对芯片中各个外设进行管理,进行优先级排队,并发送IRQ信号给CPU。控制器遵循中断机制,即core在顺序执行程序指令流的过程中突然被别的请求打断而中止执行当前程序,转而处理其他事情,处理完后继续处理原来的事情。对于riscv架构来说,通常中断控制器分为Plic外部中断控制器和Clinc内部中断控制器
-
WatchDog
提供reset,或WatchDog中断,防止系统运行失败 -
定时器Timer
-
UART
参考链接:SoC设计——外设篇——uart控制器_KGback的博客-CSDN博客 -
IIC
-
SPI
-
GPIO
与外围总线接口相连 -
PLL
2. SoC验证
SoC的验证根据层级以及内部的模块主要分为CPU系统级验证、CPU子系统模块级验证、外设模块级验证、SoC系统级验证。
参考链接:数字IC设计和验证理论_KGback的博客-CSDN博客
1 CPU系统级验证
参考链接:CPU系统级验证_KGback的博客-CSDN博客
3. SoC软件生态
1 工具链
工具链可以将C代码、汇编代码编译成二进制代码,以及进行反汇编等操作。
代码的编译参考链接:C/C++——代码的编译和运行_KGback的博客-CSDN博客
- 汇编器
将汇编语言译码成二进制语言 - 编译器
使C语言等高级语言编译成汇编语言,在转换成二进制语言
2 操作系统运行
在SOC上运行Linux是有非常大的意义的,在开发SoC时厂家可以提供运行在Linux系统上的成熟的外设硬件支持包,编程时无需从寄存器级别考虑外设间的协作,只需使用标准的API即可,从而降低开发难度
- 移植linux操作系统
参考链接:Linux——操作系统移植——代码编译及文件系统制作_KGback的博客-CSDN博客
- 启动Linux操作系统
参考链接:Linux——操作系统启动——启动过程_KGback的博客-CSDN博客
- 编程开发SoC
对于SoC来说,如果存在MMU,那总线是挂在MMU上的(通常为AXI总线),如果core想对总线上的某个外设地址进行寻址,需要先知道对应总线在MMU上的起始地址。
在Linux系统下,编程的变量或函数都有各自的地址,编译后这些地址都转化成了指令中的操作数,被CPU译码执行后,就成了访存的内存地址,所以在启用MMU的情况下,程序中使用的地址都是虚拟地址,因此也需要在Linux中进行虚拟地址映射。core只要访问某虚拟地址,即可访问到该地址对应的外设寄存器了。
关于虚拟地址、MMU概念详情见链接:计算机体系结构——存储层次结构——虚拟存储器_KGback的博客-CSDN博客
Linux系统中实现虚拟地址映射分为三步:
- 获得MMU的虚拟地址(管理单元的起始地址)
- 通过添加AXI总线桥在MMU的偏移地址获得总线桥的虚拟地址
- 通过添加SoC中某外设在总线上的偏移地址获得在Linux系统中的虚拟地址
在Linux系统中,通过mmap()函数进行虚拟地址的映射,函数原型为:
void *mmap( void *addr, size_t len, int prot, int flags, int fd, off_t offset );
该函数会在调用程序的虚拟地址空间addr处创建设备文件fd,偏移地址为offset的一个长度为len的映射,映射内核地址空间一段到用户程序地址空间。
4. 设计流程
- 前端
- 明确设计需求,包括IP调用,功耗,芯片面积,封装方式,工作电压等
- 确定系统拓扑结构,确定软硬件总体方案
硬件包括:IP核,时序,自编写代码模块
软件包括:硬件驱动,算法,协议,应用程序,实时操作系统 - 根据软硬核情况和芯片面前确定RTL的有效面积,根据工艺确定逻辑门的数量,从而明确代码规模
- 设计和验证软硬件代码,具体验证如图所示
- 各模块验证完成后进行FPGA原型机验证,实现软硬件协同测试
- 后端
- 当验证功能点全部正确、覆盖率达到一定程度,将RTL交付给后端进行综合、布局布线等,生成网表文件
- 网表做完ECO之后,RTL代码也会同步修改的。此时回到前端的步骤4,基于修改后的RTL代码进行功能验证和回归,设计要对修改后的网表和修改后的代码进行formality验证,确保修改后的网表和修改后的RTL代码一致
- 版图设计,生成GDSII文件
- 制造
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82440.html