“ 何志恒老师是香山项目的DFT负责人,本篇文章转发自他的知乎账号“恒芯闪耀”。这是香山后端团队的工作之一。后续团队还将继续撰写物理实现文章,以支撑与完善香山的开源社区。欢迎关注!”
前言
根据香山处理器的RoadMap,我们同时启动了第三版昆明湖微架构的设计与实现,以及南湖微架构的产品化改造。
下一版昆明湖架构将实现 RISC-V Vector 扩展,同时进行性能优化迭代,这一版我们也将会与更多的第三方企业进行深入合作,实现开源平台下的协同创新。
南湖架构产品化改造则是一个全新的项目类型,我们将会与企业合作,以工业级产品的要求对南湖架构进行更加细致的验证与优化,此项目我们称为南湖V2。产品化改造中核心是PPA(Performance『性能』、Power『功耗』、Area『尺寸』),我们会在实现更高性能、更低功耗、更小面积上不断地寻求最佳路径。而在定位量产的产品化改造中,DFT(Design For Test)更是一个绕不开的规格,在雁栖湖微架构上,我们已经落实了一版基本的DFT方案;在南湖V2架构上,我们会基于PPA对DFT方案进行更加细致的优化。
南湖V2的DFT相关更新
上周我们更新了【香山双周报】20220613期,其中包括了些功能修复以及新feature的加入,在南湖架构产品化改造中,这次的设计改动合入了两个DFT相关的更新:
因为CPU系统从同步复位切换到异步复位,在异步复位、同步撤离模块当中我们加入了DFT对复位可控以满足DFT在扫描链设计中的design rule要求:
最近在知乎上也刷到一篇同步复位和异步复位的对比,写得挺好,在此分享下:
黄泉:同步复位和异步复位的对比
第二个Feature是添加对SRAM的MBIST支持,采用sharedbus方案;在南湖上实现的MBIST方案有区别于雁栖湖上的MBIST方案,这个是本篇内容重点,文章标题命名为《香山处理器第二代MBIST架构》。
南湖V2 MBIST架构调整出发点
香山的第二版代号为南湖,加入新的non-inclusive L2/L3 Cache,初步性能评估结果显示,南湖能够在2GHz主频下达到SPECint 2006 18分,SPECfp 2006 20分的成绩。一方面南湖较雁栖湖增加了容量超大的L3 Cache,在双核版本中达到了6MB,另一方面南湖期望跑更高的主频,这也大大地增加了芯片物理实现难度。在南湖的开发实现上,我们更加讲求前后端协同的作战能力。在雁栖湖上实现的MBIST方案,实际上已经看到了一些设计矛盾点:
1、一个Mbist Controller所带的SRAM不能太多,而且需要根据SRAM的物理位置进行分组,并且Mbist Controller必须靠近SRAM放置,这样子才能尽量保证Mbist的时序不成为关键路径,因此雁栖湖划分了17个Mbist Controller2、Mbist Controller划分太多又导致了MBIST增加的逻辑太多,挤占芯片面积;MBIST逻辑数量与Cache Size成正比,若L3 Cache采取传统的MBIST设计方法,MBIST逻辑将比功能逻辑都多。从雁栖湖MBIST数据中可以看到MBIST逻辑增加的比例:- “雁栖湖”功能逻辑的reg count为36w,设计范例所加mbist逻辑的reg count为14.7w
3、虽然雁栖湖上MBIST可以支持所有SRAM并行测试,但测试功耗太大,特别是MBIST Controller开启瞬间会导致瞬时功耗冲高导致Vmin极差;因此也只能在测试向量上根据功能应用场景进行拆分,组间串行测试,组内并行测试。南湖需要冲2G的主频,实际上功能逻辑在Memory周边的时序已经非常地紧张,若Mbist Controller还挤占Memory周边的资源(无论是逻辑还是绕线),无疑是雪上加霜。我们可以从真实floorplan中深刻感受到L2 Cache和L3 Cache的Memory里三层外三层的密密麻麻排布:
L2、L3 Cache的Memory Placement
L3 Cache中DataStorge的SRAM跟主频同频已经变得不现实,大块头SRAM本身已经不支持跑那么高的频率,因此我们无论在功能设计及MBIST设计上,SRAM的读写均存在multicycle。其实商业化的高性能处理器设计中L2、L3 Cache均存在分频设计以降低物理实现难度。
南湖V2 MBIST架构
从这些设计矛盾点出发,在“南湖V2”上我们从MBIST架构上进行了设计优化,我们是怎么优化MBIST的设计,我们从如何设计一个MBIST电路开始说起。
基于physical memory的MBIST设计流程
内建自测试(Built-in Self Test) 简称BIST是在设计时在电路中植入相关功能电路用于提供自我测试功能的技术,以此降低器件测试对自动测试设备(ATE)的依赖程度。数字BIST大致可分为两类Logic BIST(LBIST) 和 Memory BIST (MBIST),设计MBIST电路来测试Memory是业界主流做法(这里的Memory通常代指SRAM)。
Memory BIST Architecture
MBIST作为成熟的结构化电路,可以通过EDA工具自动化完成MBIST设计流程:Memory的IP供应商通常会提供主流EDA工具的MBIST模型格式文件(常见的是lvlib、masis等),该MBIST模型格式文件将Memory的端口信息、Memory内部的物理结构进行抽象化描述,作为MBIST设计流程的输入件;EDA工具通过识别MBIST模型自动找出设计中的Memory,并在设计中插入MBIST电路,这也是雁栖湖DFT方案当中的MBIST设计流程。
基于logical memory的MBIST数据旁路
Chisel在语言库里定义了很多常用的硬件原语,在Chisel based设计中我们通常使用SyncReadMem来进行Memory行为描述;当我们把Chisel生成的Verilog给到EDA工具时,如不进行特殊说明,Chisel会将定义的Memory全都以寄存器形式来声明,如下代码所示:
但基于寄存器搭建的Memory非常占面积,所以更大的Memory一般通过SRAM搭建;香山代码使用 Scala FIRRTL 编译器的“替换顺序内存”传递来对内存进行黑盒处理,我们约定在sram_array模块中例化真实SRAM。而实际上sram_array中往往存在不止一片真实SRAM,因为满足sram_array大小的SRAM形状及速度有时候不是物理实现最佳,我们通常将形状及速度俱佳的SRAM拼接起来,以下为3种常见的Memory拼接方式:
我们将sram_array称为logical memory,真实SRAM称为physical memory。
以简单的宽度拼接电路为例:功能上两片physical memory除了DataIn/DataOut的信号是独立,但地址线和控制线都是复用的。基于physical memory的mbist数据旁路会在physical memory边上均加入旁路mux及连线,各信号线间均是独立;如以下对比图所示,基于logical memory的mbist数据旁路更加节省mux及连线。
基于physical memory及基于logical memory的mbist数据旁路对比香山处理器中存在众多的Memory拼接场景,基于logical memory的mbist数据旁路带来的面积优化可以积小成多。基于sharedbus的MBIST总线接口
MBIST设计的第二层优化,我们在前端代码中设计了一套基于sharedbus(共享总线)的MBIST总线接口。
基于sharedbus的MBIST总线电路基本架构示意图基于sharedbus的MBIST总线接口有以下设计思想:该总线为Mbist Controller与logical memory之间搭建一条数据通路
该总线内所有Memory共享数据通路,包括地址线、数据线、控制线均为复用,用极简电路实现memory的访问完备,总线内Memory串行访问。
该总线包含Pipeline Stage,尽可能复用功能的Pipeline Stage;Pipeline级数经过后端评估,支持Mbist Controller远离Memory放置
对Memory的读写通过流水线式的访问时序实现:
传统在Memory周边插入MBIST的设计流程,虽然EDA工具在提高Performance和降低Area方面做了很多努力,提供了很多option,但这也消耗DFT工程师大量的时间和精力做各项参数评估,最后不一定能找到PPA均衡的solution,且有可能到后期才发现难以收敛的时序关键点。
GO REG容易成为MBIST时序的关键点
基于sharedbus的MBIST总线接口,举一个不太严谨但容易理解的比喻:
MBIST总线可以看成是将内部小Memory拼接成一个大Memory,Mbist Controller针对这片大Memory进行测试。这个MBIST总线可以挂载许多Memory,以达到减少Mbist Controller的目的;同时MBIST总线可提前识别时序风险,内部pipeline级数经过评估后以设计形式固化下来,节省开发者的后端的评估工作量。
MBIST Controller与mbist总线对接,远离Memory放置
而对于Memory串行访问对测试时间的影响,DFT的设计宗旨是“经济”地完成芯片测试,我们除了考虑测试时间成本,也应该考虑DFT设计所占芯片面积带来的成本。基于sharedbus的MBIST设计,能带来Mbist Controller的减少,而实际上mbist测试是full speed测试,从雁栖湖方案中组内并行测试、组间串行测试,切换到现在的组内串行测试,组间并行测试,测试时间增长幅度可控,且芯片测试功耗分布会更加均匀。这一笔时间换空间的帐,其实是划算的。
南湖V2 MBIST总线开发与配套
基于南湖微架构中的Cache结构,结合对Memory测试定位便利性及测试时间的均衡,我们对CPU整系统的MBIST总线划分如下:
南湖微架构MBIST总线划分
开发者对于处理器核的DFT设计流程,仍是建议从Chisel编译出来的rtl开始:
DFT设计流程
基于双核版本的南湖微架构,每一组MBIST总线的接口信息如下:
Section 1: L1 Mbist Interface Info |
mbist_array[8:0]
| input
|
mbist_addr[10:0]
| input
|
mbist_addr_rd[10:0]
| input
|
mbist_indata[255:0]
| input
|
mbist_be[15:0]
| input
|
mbist_readen
| input
|
mbist_written
| input
|
mbist_all
| input
|
mbist_req
| input
|
mbist_outdata[255:0]
| output
|
mbist_ack
| output
|
总深度(测试时间影响因子)
| 41920
|
总宽度(面积影响因子)
| 256
|
Section 2: L2 Mbist Interface Info
|
mbist_array[6:0]
| input
|
mbist_addr[11:0]
| input
|
mbist_indata[209:0]
| input
|
mbist_be[9:0]
| input
|
mbist_readen
| input
|
mbist_written
| input
|
mbist_all
| input
|
mbist_req
| input
|
mbist_outdata[209:0]
| output
|
mbist_ack
| output
|
总深度(测试时间影响因子)
| 173824
|
总宽度(面积影响因子)
| 210 |
Section 3: L3 Mbist Interface Info
|
mbist_array[4:0]
| input
|
mbist_addr[14:0]
| input
|
mbist_indata[155:0]
| input
|
mbist_be[7:0]
| input
|
mbist_readen
| input
|
mbist_written
| input
|
mbist_all
| input
|
mbist_req
| input
|
mbist_outdata[155:0]
| output
|
mbist_ack
| output
|
总深度(测试时间影响因子)
| 268283 |
总宽度(面积影响因子)
| 156 |
MBIST总线代码开发人员配置:1个DFT工程师+1个熟悉Chisel开发的学生虽然南湖微架构的MBIST总线开发从零开始,但凭借Chisel语言在参数化设计上的便利、强大的穿线功能,学生仅花了一周多的时间完成了整个CPU系统MBIST总线从Chisel代码框架、具体开发到功能验证的相关工作,并且是超越我预期的出色设计。在此也感谢易难和嘉炜在Chisel代码框架上的支持。MBIST相关文件配套
同时也是凭借Chisel语言在参数传递上的便利,我们在Chisel生成Verilog的同时,自动生成描述MBIST总线接口到Memory映射关系的csv格式文件;该文件可以直接文本打开或者通过excel打开,以一个清晰简洁的界面让开发者认识MBIST总线:
MBIST_L1.csv
MBIST_L2.csv
MBIST_L3S0.csv
MBIST_L3S1.csv
MBIST_L3S2.csv
MBIST_L3S3.csv
虽然现在的主流EDA工具已经配备sharedbus learning的功能,但我们也乐于提供脚本通过csv文件转换成主流EDA工具的MBIST输入件,给开发者一个参考:
MbistIntfTcdGen.py -csv MBIST_L1.csv
MbistIntfBuscfgGen.py -csv MBIST_L1.csv
下图为L3 slice完成MBIST Controller设计之后,MBIST算法fastsim testcase仿真波形实例:
L3 slice MBIST算法fastsim testcase仿真波形MBIST总线演进及测试场景扩展
在南湖微架构产品化改造项目上,我们的MBIST总线架构方案被合作企业(重量级芯片大厂)认可并采用。MBIST总线架构也会落实到昆明湖架构上,同时我们也会对MBIST总线不断地进行演进,比如支持多读多写的SRAM挂载、支持SRAM的HBE特性等等。MBIST总线设计可以让Memory与Mbist Controller分离到不同模块,这样子可以带来一些测试场景扩展。比如在服务器芯片上,通常会将L3 Cache的部分Memory推向ring bus模块,以提高芯片利用率;甚至可以将Mbist Controller与Memory分离到不同的die上。
最后是则广告贴:
北京开源芯片研究院(开芯院)开放DFT职位招聘,包括实习/校招/社招;对DFT方向感兴趣的同学们可以把你们的简历投到hr@bosc.ac.cn另外我们还有其他职位的招聘,HC多多,欢迎大家来投: