详细描述和解释GOF ECO每一个步骤的实现方法和注意事项

电子说

1.3w人已加入

描述

GOF ECO介绍

GOF ECO是一款芯片网表功能ECO的软件。在项目中后期或流片之后,发现逻辑功能有BUG或者设计需求有变更时,不需要重走“综合 -> DFT -> APR”的完整流程,利用GOF ECO即可自动分析新旧两个版本的差异,并对APR网表进行局部修改。GOF ECO不仅大大缩短了芯片ECO的Turn-around时间,还大大提升了芯片复杂逻辑ECO的成功率。

GOF ECO流程

RTL

如上图所示,当我们设计(RTL)上有改动,并充分仿真验证确认功能正确后,就可以开始网表ECO工作了。大致分为以下几个步骤:

首先,我们需要收集老设计的文件,并确认文件的完整性和准确性。

其次,对设计重新做综合,得到重新综合的网表(这一步可选)。

再次,用GOF LEC分析新设计与老设计的差异,确认这些差异是否合理。

然后,用GOF ECO做网表的ECO,并调整ECO方案和约束来获得最佳结果。

最后,在后端工具里实现ECO Place和ECO Route,完成逻辑功能ECO。

下面将详细描述和解释每一个步骤的实现方法和注意事项。

一、准备工作

准备工作的目的?

这些文件通常来自于不同的部门或组,我们要确保ECO所需文件的准确性,防止用错文件版本,确保后续ECO工作正常开展。

需要准备哪些文件?

需要提前收集的文件如下:

老设计

老RTL

老综合网表

老DFT网表和DFT约束文件

老APR网表(我们的ECO目标)

并对老设计做逻辑等价性检查(LEC),来确保收集到的文件和版本是正确的:

RTL vs 综合网表

综合网表 vs DFT网表

DFT网表 vs APR网表

二、重新综合(可选)

这一步是可选的,但我们建议做,因为新RTL与老APR网表中间经过了很多次优化,这些优化使得网表结构发生了巨大的变化,而这些变化会加大逻辑功能ECO的难度和准确性。对于超大规模设计,重新综合一次需要两三天或者一周,这个时候我们建议可以先忽略这一步。

一般来说,这一步我们用原有的综合脚本重新跑一次即可。

三、一致性检查

逻辑一致性检查结果的正确性和合理性是保证网表ECO效果的前提。GOF ECO正是利用一致性检查的技术来分析两个设计的差异,来找到应该修理的地方。如果一致性检查有虚假的不等价,GOF ECO就很可能会做一些无用的修改,会或多或少影响补丁的大小和ECO的成功率。

用GOF做一致性检查的流程如下:

RTL

下面是参考代码:

 

# gof_lec.pl
use strict;


# 读入lib库
read_library("art.5nm.lib");
read_library("sram.lib");
read_library("analog.lib");


# RTL流程
my $rtl_flow = 1;
if($rtl_flow){


    # 设置define和include
    set_define("SYNTHESIS");
    set_define("NO_SIM");
    set_inc_dirs("/project/nd900/vlib/include", "/project/nd900/IPS/include");


    # 读入老RTL
    my @rtl_old = ("ref0.sv", "ref1.sv", "ref2.sv");
    read_rtl('-ref', @rtl_old);


    # 读入新RTL
    my @rtl_new = ("imp0.sv", "imp1.sv", "imp2.sv");
    read_rtl('-imp', @rtl_new);


    # 设置顶层模块
    set_top("topmod");


    # 对比RTL
    rtl_compare;
}


# 读入重新综合的网表
read_design("-ref", "reference.gv");


# 读入老的APR网表
read_design("-imp", "implementation.gv");


# 设置顶层
set_top("topmod");


# 设置DFT约束
set_ignore_output("scan_out*");
set_pin_constant("scan_enable", 0);
set_pin_constant("scan_mode", 0);


# 做一致性检查
run_lec();

 

运行gof_lec.pl的脚本,分析不等价的点是否合理:

 

gof -run gof_lec.pl

 

先确认log里unmapped点是否合理。当设计里新加了dff或者输出端口,GOF LEC就会分析出这些新加的点并报出来。

如果有不合理的点报出来,就要debug找到原因:

首先,可以与formality或者conformal的LEC结果做对比,来排除用错文件、约束设置错误等问题。

然后,可以用GOF的电路图的方式来调试:

用start_gui来启动GUI

在网表里找到不等价的点,右击在电路图上显示

也可以按ctrl-g来快速加载

常见的电路图调试方法:

在电路图中显示老设计和新设计的fanin,查看fanin是否一样,这是最容易发现问题的地方

然后,同时选中两个设计的时钟pin或复位pin,查看两个设计的时钟和复位是否等价

再排查scan enable pin的设置

最后,逐步trace出两个设计的逻辑锥的电路,从后向前,寻找不等价的点。

RTL

四、PreMask网表ECO

在确认一致性检查报出的不等价的点都是合理的情况下,就可以正式开始ECO了。

参考脚本如下:

 

# gof_eco.pl
use strict;


undo_eco(); #<-- 撤销之前的改动
setup_eco("eco20221102");  #<-- 设计ECO的名字,GOF ECO输出网表中新加的cell和连线会自动加上这个前缀


# 读入lib库
read_library("art.5nm.lib");
read_library("sram.lib");
read_library("analog.lib");


# RTL流程
my $rtl_flow = 1;
if($rtl_flow){


    # 设置define和include
    set_define("SYNTHESIS");
    set_define("NO_SIM");
    set_inc_dirs("/project/nd900/vlib/include", "/project/nd900/IPS/include");


    # 读入老RTL
    my @rtl_old = ("ref0.sv", "ref1.sv", "ref2.sv");
    read_rtl('-ref', @rtl_old);


    # 读入新RTL
    my @rtl_new = ("imp0.sv", "imp1.sv", "imp2.sv");
    read_rtl('-imp', @rtl_new);


    # 设置顶层模块
    set_top("topmod");


    # 对比RTL
    rtl_compare;
}


# 读入重新综合的网表
read_design("-ref", "reference.gv");


# 读入老的APR网表
read_design("-imp", "implementation.gv");


# 设置顶层
set_top("topmod");


# 设置DFT约束
set_ignore_output("scan_out*");
set_pin_constant("scan_enable", 0);
set_pin_constant("scan_mode", 0);


# 不需要再次做一致性检查
# run_lec();


# 执行ECO
fix_design(); 
report_eco();


# 确认eco后的等价性,如果等价,逻辑ECO就基本结束了
run_lec();


# 写出eco网表和脚本
write_verilog("eco.gv");
write_soce2("eco.tcl");

 

运行gof_lec.pl的脚本,分析不等价的点是否合理:

 

gof -run gof_eco.pl

 

前面大部分的设置与一致性检查的脚本是相同的,只是把最后run_lec()换成fix_design()。在fix_design的时候,GOF ECO会先自动做一次LEC,分析出不等价的点,然后对不等价的点做eco修改。

在ECO结束后,通过report_eco来确认改动大小,可以看到哪些模块增加了多少cell、删除了多少cell、改动多少根连线。我们需要根据ECO report来判断本次ECO的改动是否后端能够实现。

再通过run_lec()确认一下修改之后是否完全等价,以防止遇到一些特殊情况,GOF ECO没有能完全修复。当然,也需要用业界认可的LEC工具,如formality或者conformal,来确认最终的ECO是否正确。如果不等价,可以用GOF电路图的方式来进一步分析和解决。

最后,写出ECO网表和脚本。

五、PostMask网表ECO

当流片回来测试后发现有问题时,就需要进行PostMask ECO。这时只能利用提前放置Spare Cells来改金属层。与PreMask的流程区别如下:

 

# read_library
# read_design
# run_lec
# fix_design
my $postmask = 1;
if($postmask){


    # Postmask时读入def文件
    read_def("topmod.def");


    # 设置sparecell列表
    get_spare_cells("spr_1/spr_gate*");


    # 设置约束
    set_constraints("-num", "and<3,or<3");


    # 映射到sparecell
    map_spare_cells();


    # 查看ECO报告
    report_eco();
}


# 写出eco网表和脚本
write_verilog("eco.gv");
write_soce2("eco.tcl");

 

在做postmask常常遇到附近资源不够或者连线比较拥挤,这时可以调整set_constraints()的设置,多尝试几种方案。

六、后端工具里工作

后端工具里的操作和流程不属于这份入门教程的范围,但我们有一些有用的建议:

在PreMask ECO流程里,后端工具尽量可以让插入新的Cell,这样ECO时所有类型的stdcell都可以用,可以简化网表修改,也有利用于时序和DRC收敛。

在PostMask ECO时,应该尽可能地前后端工程师多沟通,一起确定最终的ECO方案。

在遇到资源紧张时,应当与客户、产品经理、项目经理等人员多沟通,给ECO条目排一排优先级,优先解决更重要的问题。并适当地放弃一些复杂的、困难的ECO。






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分