今天上午开了个务虚会,和研究生一起探讨了一下SoC设计的一般概念,发现很多同学根本没有抓到SoC设计的核心。现在趁着讨论的热度还没有过去,现在先在这记录一下。
首先,SoC设计是围绕着什么在设计?
SoC设计是围绕着总线来开展设计的。SoC最需要掌握的核心知识点其实并不是什么SoC的概念之类的,而是微机原理课程上面讲的那些总线和接口的概念。例如什么叫三总线,什么叫主(Master)什么叫从(Slave)等等。
通过掌握这些概念可以理解处理器如何通过总线把数据读出、写入,从而理解如何通过处理器对于整个系统芯片加以控制和管理。
在理解总线时,最核心的一点是要理解主-从模式的通信机制。既处理器作为主机,是发起通信的一方。而外设、片上存储器作为从机,是响应主机发起的通信。更在此基础上进一步的,需要理解总线的时序,理解在总线上发起通信到通信结束的全过程。这样就可以理解,如何能够通过软件对于特定的地址空间加以访问。
其次,SoC如何实现IP核的集成?
要实现IP核的集成,本质上是要让数据写得进,结果读得出。也就是把需要这个IP处理的数据能以某种方式输入到这个IP核内部,在IP核在数据处理完毕以后的结果通过某种方式能够读出。如果这个IP本身的功能有好多种,还需要通过一个特定的方式把需要完成的功能类型传输给IP核。而如果结果运算完毕了,则还需要以某种方式来告知CPU现在的运算已经结束。这些都是需要由写得进/读得出的方式来实现的。
那么如何实现数据写得进,结果读得出呢?说到底就是要实现IP核在软件层面的“可见”。要让软件层面可见,就需要能够通过执行指令的方式对IP核进行访问。如何访问,当然是通过总线?下图一目了然:
最后,SoC设计上软硬件协同如何解决?
这就要做好软件和硬件IP核的任务划分和规划了。一般说来,用处理器执行的软件部分适合完成调度、决策、判断等管理性质的任务,而硬件IP核适合完成比较规整的运算任务。而在软硬件的划分边缘,就要设置合理的寄存器组来传递信号和数据。
例如,我们要实现一个快速计算三角函数的电路。那就需要实现一个Cordic算法的硬件计算单元。但仅仅实现这个硬件单元还不够,还需要编写一段软件代码把外部读取的运算数据送进去、设置需要完成的计算(Cos/Sin等)、在运算完成以后把计算的结果读出。而在这个过程中还要有必要的握手、联络过程。可以依靠程序查询的方式来完成,也可以依靠中断的方式完成。
其实以上这些内容,不是靠学习什么《SoC设计》之类无聊的课程习得的,核心的问题都在《微机原理》里面讲清楚了。然而现在很多高校的教务部门以及部分高校教师,在急不可耐的将《微机原理》赶出培养方案,而用快餐式的单片机、嵌入式系统设计或者SoC设计之类的课题替代。这种短视而愚蠢的行为,最终却要无辜的学生买单。各位看到本博客的同学,如果你们的学校/学院也在干类似的事情,你们一定要警惕啊!