很多人自嘲做SOC就是连连看,那么今天我们就来看看连连看的技术,是不是你上你也行呢。
集成
做SOC最典型的一项工作就是集成,也就是我们常说的连连看,看起来很简单,其实也很“简单”。前提是必须有集成工具,顶层下面的子模块之间信号名统一好,用集成工具自动生成实例化,然后自动定义wire就连接起来了。听说有人做集成手写wire写了一整天的,这个动作对于集成工具来说,只需要1秒钟。啪的一下就好了,很快啊,然后就关显示器,下班。
包括我们开发IP的时候,涉及到子模块的例化和自动定义reg、wire,集成工具都是一键生成,既准确又高效。很久以前我自动集成好的代码,手改了一行例化,跑编译发现报错了,最后查出来发现是少写一个点,如果工具能做到让工程师对语法都手生,这时候它就真成了。我已不例化端口好多年。
集成工具这块我之前也分享过一款开源的地表最强gVim编写Verilog插件,这款做日常的IP开发完全胜任,更大型的系统暂时有些吃力。
filelist管理
代码连接好了怎么整合到一起编译呢,这就要谈到filelist管理。filelist有这几类,自研IP、第三方IP
、工艺库的标准单元和仿真模型、模拟IP的仿真模型、memory、common IP等。这其中又要再分仿真的filelist和综合的filelist,仿真的filelist里再区分不同编译器的filelist。
filelist放在哪个目录,格式怎么编写。如何把这些filelist集成到顶层而保证filelist不会重复,使用方式也要简单并且高效。简单来说就是每个IP有自己的filelist,不同的的编译选项分支区分开,公用的IP各调用各的,顶层集成工具自动去重,这也就是集成flow要解决的问题。
版本发布
代码编译通过了,要发布出去给各个平台用,验证、综合等不通过平台的版本如何发布。代码版本管理用git、svn还是perforce或其他。代码发布的形式是分支还是标签,发布出去后bug fix如何merge。子模块的IP可能需要独立发布版本,独立迭代,多个子模块之间端口和支持的feature如何对齐,从而获得一个整体SOC的版本。这是版本发布flow要解决的问题,每个团队解决方式不完全相同。
代码生成工具
对于有固定规则的,并且用的地方很多的代码,肯定不能是每个人都写一套。这时候就需要引出代码生成工具,用户填写简洁的交互界面,用同一套规则批量生成代码。
regfile代码生成工具,生成配置寄存器代码,支持基本的协议,ahb/apb,支持中断控制器,支持验证平台使用reg model自动生成,软件用的sysmap,寄存器宏定义。用户交互界面最后就是一个所有人一看就明白的寄存器表格,填好寄存器表格后,上面提到的就一键生成。
crg代码生成工具,复杂的芯片时钟和复位可能分别上百个了,对于每个时钟复位的生成套路可能都类似的,那么也可以通过填写对用户交互友好的界面,来实现一键生成所有代码。
io代码生成工具,芯片顶层的端口对外都是pad,引脚不够或有做pinmux,对于代码实现来说一个pad的pinmux复用和几百个实现套路也是一样的,那么用户只需要把硬件需求的pinlist和pinmux表格提供给工具,那么后续对应的io相关的代码都一键生成。
更重要的是,此类代码生成工具,一个项目验证成熟后所有的项目都可以通用。
我们不相信人,我们只相信工具
说白了怎么搞了半天做SOC都是用工具写代码,不写Verilog了?没错,我已不写Verilog好多年(夸张的说法)。那么用什么脚本呢?做工程没有一通百用的,可能公司的历史积累也会有些古老语言的的脚本,所以Ruby、Python、Perl等各种脚本语言+AI GPT都可以,需要哪个学哪个,哪个好用用哪个。
我们的宗旨是,我们不相信人,我们只相信工具。
最后
掌握这些连连看技术就学会做SOC了吗?NO NO NO,这些算是底层建设,会使用后就掌握了基本功,熟练后,SOC设计才要刚刚开始。
作者:硅农
文章来源:硅农
推荐阅读
更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。