写完了低功耗SOC设计,我们来介绍一个实际可用于边缘端AI计算的SOC设计。
这个系列要达到两个目的。一是介绍某个可以直接用于实际生产超简单的边缘端超低功耗SOC。二是尽量科普向,多介绍重要的原理,少介绍冗长的细节,尽量涉及到方方面面。三,如果有时间,会简单介绍一下常用的AI加速核心设计。
我们愉快的开始吧~
一、芯片整体架构
芯片架构如上图所示。共有三个模块组。
计算核心组。其中只有一个主设备,既RISC-V核心。此处需要注意的是一般来讲我们在这种RISC核心中倾向于使用哈弗架构而不是冯诺依曼架构。也就是说数据和指令不共享总线。所以指令存储IMEM可以做进RISC-V核心。内容主要包括了
-
- RISCV的CPU核心,数据存储DMEM(一般由SRAM来实现)。
- QSPI FLASH。
- AI加速核心。
这一组主要用于芯片和外界进行数据交换。由于芯片的应用场景是低功耗场景,故没有高速的接口(例如DDR PHY),全部用APB总线连接。主要包括了
- ADC用于连接各种传感器(例如震动与温度)
- SPI接口用于提供外设控制(例如FLASH和震动传感器)
- I2C用于连接EEPROM等外设
- UART可以连接蓝牙和加速度传感器等
- GPIO用于调试以及灵活处理其他输入输出信号
该组模块包括了维持SOC正确运转所需要的必须模块。包括了
- PMU,Power Manager Unit, 用于管理芯片的功耗。
- RTC, Real-time Counter, 一个计数器,计数完成后生成中断。
- Watchdog, 看门狗。用于发现系统挂死后reset系统的。
- RSTGEN, 用于产生系统复位信号的模块。
- CLKGEN, 用于产生系统所需的各个时钟的模块。
二、SOC的时钟管理
时钟和时钟频率会极大影响功耗。由于我们是边缘端低功耗的芯片,故一共需要两个时钟域。
主时钟域:计算核心组和数据外设组位于主时钟域。该时钟域在运行时速度较快,一般来讲运行于8M-100M之间。
常开时钟域:主要用于系统外设组。由于这个时钟域需要常开的,所以频率会比较慢,常见的值是32.768KHz。
具体的时钟管理以及CLKGEN模块详见文章桔里猫:RISCV AI SOC实战(二,SOC的时钟管理)。
三、SOC的电源功耗管理
由于是边缘低功耗芯片,故设计低功耗模式时非常重要的。该芯片同样具有两个电源域。
主电源域:计算核心组和数据外设组位于主电源域。该电源域是可以被关断的。
常开电源域:主要用于系统外设组。这个电源域不应该断电。
可以实现三种低功耗模式
- 正常模式, 两个电源域都打开。
- 等待模式, 两个电源域都打开。有一条专门的指令(WFI, Waiting for Interrupt),core执行以后会关断核心的时钟。等待中断后再打开时钟。
- 睡眠模式。 直接把住时钟域关断。
具体的电源管理模块及PMU模块详见文章桔里猫:RISCV AI SOC实战(三,SOC的功耗管理)。
四、SOC的复位管理
由于存在多个电源域与时钟域,故系统的复位显然是要有顺序的。否则容易发生复位错误。一个总的原则是先复位低优先级的模块(也就是外设)。对于本设计来讲,先复位常开时钟域,再复位主时钟域。需要注意的是每个时钟域都要对复位信号进行异步接受同步释放。
具体的复位管理及RSTGEN模块详见文章桔里猫:RISCV AI SOC实战(四,复位管理)。
五、SOC的中断管理
emm 这块在上图里没有专门的模块。因为一般来讲中断会划分在RISC-V Core那个大模块里。这个东西一般RISCV核心的提供商会提供这个东西,但是还是要明白原理。
具体的中断管理详见文章桔里猫:RISCV AI SOC实战(五,中断管理)。
六、SOC的软件流程及上电流程
程序编译好后会先放入FLASH,SOC上电以后会把程序从FLASH拷到片上开始执行。具体上电boot流程可以看以前这篇文章桔里猫:你码的代码是如何在SOC芯片上跑起来的。
七、AI CORE如何设计
这个东西讲起来就比较多了。和SOC关系其实不是很大。所以放在了一个新的系列讲。桔里猫:如何设计AI芯片中的加速核心(一,综述)。
总结
这个系列主要是介绍一个实际使用的低功耗AI SOC里面方方面面的设计。边缘端芯片的好处就是能简化就简化,所以介绍起来还算比较方便。SOC主要也是一些经验性的东西,只要走过一遍其实就变成了一个纯工程问题,没有特别难的科研问题需要解决。但SOC确实是国内各个小芯片公司最喜欢的形式,因为专用的同时能兼顾一部分通用性,又避免了直接在通用领域和巨头进行竞争。
纸上得来终觉浅啊,有机会一定要自己参与流片一两个SOC对里面的细节才能算是真正了解。