引言
在SOC芯片设计中,一般都会包含一定数量的存储器,如RAM,ROM,在大型规模的项目中这个数量可能会是几百,甚至上千;这些大大小小的存储器会分散到各个子系统的模块中,由于设计要求的不同,如果使用统一的存储器势必会造成大量不必要的浪费,也提高了成本,所以必须对每一个存储器进行分别设计,显然这个工作没有那么容易;
通常这个工作由各个公司的DFT工程师来集中完成,基于每个模块设计者的要求,使用存储器供应商的Memory-Compiler将物理存储器定制出来,存放到统一的地方,然后作为一个IP库发布出来,供各个模块的设计者使用,这些IP库对于后端流程也是很重要的;
为了避免在设计过程中对于频繁更换物理存储器而造成模块的设计需要跟随不停的更新,通常会引入Memory-Wrapper的概念来保证设计的相对稳定性;意思是这个Memory-Wrapper模块是相对稳定的,在里面包含的物理存储器更换时,Wrapper的端口一般不会发生变化,从而保证了模块的设计也是稳定的,不需要更新;
存储器工具
基于上面所述的流程,我们需要一个存储器工具来帮助工程师完成很多的手动工作,这个工具需要具备以下一些功能:根据设计者定义的逻辑存储器,推荐出对应的物理存储器类型及端口尺寸
支持对逻辑存储器的灵活拆分
基于确定后的物理存储器参数,用Memory-Compiler将存储器定制出来
生成Memory-Wrapper,将定制出来的物理存储器例化进去
Wrapper代码还需要支持验证环节的替代存储器,如Generic,FPGA等等
对于ROM,需要支持代码文件的自动定位
对于有拆分的ROM/RAM,支持验证代码中的存储器数据进行相应的拆分
对设计需求和定制后的存储器参数做一些检查,报告出冲突和错误
流程需要拆分成多个小的步骤,可以分别单独执行,以应对不同的场景需求
有了存储器工具的帮忙,工程师便可以轻松应对这项工作,在项目开发过程中通过对设计需求的增加和修改,然后运行工具,就可以实现快速发布和交付;MemFab
MemFab是笔者开发的基于以上功能需求的存储器自动化工具;有多个工作模式,满足不同工程师的工作喜好:工具支持多个数据输入途径,可以界面输入,也可以文件输入,并且可以相互转换:工具对逻辑存储器的拆分有比较灵活的支持,可以用算术表达式来分别表示宽度和深度的拆分形式,但也不是完全随意的,拆分的所有行遵守同一个表达式,所有列遵守一个表达式;如下面一些例子都是合法的拆分表达式:- 64*2+32 // 2块64位宽/深,加上1块32位宽/深的拼接
在针对设计者的逻辑存储器的要求,如单双口,宽度深度,工具根据Memory-Compiler支持的类型及参数,可以给出选型的建议,包括拼接形式,省去了人工选型的耗时耗力,还能避免如出现非2的整次幂的情况;MemFab将工作流程分成了以下几个步骤,方便单独执行,节省了一部分重复运行的时间:- Prepare步骤,将需要定制的存储器生成Memory-Compiler的运行命令
- Compile步骤,运行上面生成的命令,将存储器定制出来
- lib2db步骤,用library-compiler将.lib文件生成.db文件
- milkyway步骤,生成Milkyway所需要的文件
- checkrom步骤,对生成的ROM跟代码数据文件进行比较,看数据是否一致
- check步骤,对输入文件和输出数据进行一些检查,报告冲突和错误
- generate步骤,生成Memory-Wrapper文件
在产生Memory-Wrapper时,支持对一些常用的情况进行配置,如:- 一部分端口的可见性,如SLP/DSLP/SD/PUDLAY/BWEB等
在验证时,常常需要将一些CPU代码或者数据通过数据文件格式将存储器模型初始化,由于拆分情况的存在,这些完整的数据需要按照物理存储器的拆分形式进行同样的拆分,否则仿真就会得到错误的数据;MemFab支持将数据文件按实现拆分情况进行拆分,保证数据的正确性;总结
存储器自动化工具在多存储器SOC项目的设计中是不可缺少的工具,工具的功能性和使用便捷性对工作效率的影响也是比较大的;一款通用性强的工具将大大减少维护成本,让工程师专注到设计本身上,从而提高产品质量。
*免责声明:文章来源于知乎,版权归原作者Quickor所有。如有侵权,请联系路科验证删稿。文章内容系作者个人观点,路科验证转载仅为了传达一种不同的观点,不代表路科验证对该观点赞同或支持,欢迎评论区留言交流。原文官网链接:http://www.quickor.cn/doc/index.html