当我们做后仿时我们究竟在仿些什么(一)

        数字芯片设计流程中有一个步骤叫门级网表仿真。所谓门级(gate level),是和RTL(register transfer level)相对应的。所谓网表(netlist),就是一堆基础单元(比如standard cell、比如sram cell)之间的连线(net)的列表,是和电路图形相对应的。门级网表通常可以指综合之后得到的网表(没有时钟树),也可以指布局布线之后的网表(带有时钟树)

        需要明确的是,门级网表中只是连接关系的列表,并不包含基础单元本身。基础单元的行为,是通过各自的仿真模型(model)来体现的,它通常是独立于门级网表存在的

        相对于RTL仿真,门级仿真占用的计算资源虽然很多,但是在静态时序检查(STA)工具普遍应用之前,带时序的动态门级仿真几乎可以说是唯一的timing sign-off手段了。

        那么在STA工具已经成熟的现在,门级仿真还有存在的必要吗?为什么有些公司的设计流程中还包括门级仿真这个必需的步骤呢?

可能存在以下几个原因:

  • 检查时序约束(SDC)的完备性——防止约束的遗漏

  • 检查异步电路的时序——STA工具无能为力

  • 检查网表的完备性——防止综合、布局布线过程中的意外

  • 为后续流程如功耗(Power)分析、压降(IR Drop)分析提供波形——更准确

  • 测试向量的仿真——只有门级网表才包含扫描链

        门级仿真可能分为两种,一种是带时序反标(back-annotation)的门级仿真(布局布线之后的仿真,也叫后仿);一种是不带时序反标的门级仿真(零延时仿真,综合的网表就可以做,因为在布局布线之前,所以也叫前仿)。

        后仿用的时序信息通常包括延迟信息、时序检查时间,一般都用标准的SDF(standard delay format)格式的文件提供。在SDF中有两种类型的延迟信息。一种是连线的延迟信息;另一种是单元的延迟信息。连线的延迟信息不多说,单元的延迟通常是根据单元时序库(timing library)中定义的timing arc,从电路图形中间接提取计算出来的,而这些timing arc,要和仿真模型中(specify block)定义的io path要一一对应,在反标过程中才能标注成功。

        那为什么叫反标呢?因为通常设计电路都是根据事先定义好的设计规格,而设计规格中就包含了时序的规格(例如SDC)。所以当电路设计好了,时序信息也确定了,把这些时序信息标注到电路的网表中,实际上是一个回溯的过程,所以叫反向标注。SDF实际上也可以提供类似SDC一样的前向标注的时序信息,指导电路的设计实现。另一方面,基础单元的仿真模型中默认也是有时序信息的,通常是单位时间或者零时间。所以用电路的真实时序信息标注的过程,其实是一个覆盖默认时序信息的过程,所以也叫反标。

        覆盖这个概念特别重要。因为只有原来有,才谈得上覆盖。很多SDF标注的错误和警告,追根溯源都是和覆盖有关的。

        SDF文件通常是STA工具(读入网表、时序库、RC参数)产生的,这里也要特别注意SDF的版本,目前常用的是2.1和3.0两个版本。后仿的时候注意SDF的版本和仿真模型的版本要保持一致。这两个版本比较明显的一个区别就是removal的检查,2.1版本不支持这个timing check,而是用hold替代实现。

        某个corner的SDF中,通常会有一组或两组或三组时序值,max、typical、min(MTM)。在仿真器读入SDF的时候,要指定使用哪一组。避免出现指定的组的时序信息不存在的情况。

        STA产生SDF的过程中,可以把异步接口部分的时序检查禁止掉(通过放松检查时间),比如2-DFF的同步逻辑中的第一级DFF的setup和hold检查。从这里也可以看出代码风格的重要性,代码风格好,STA工具可以很轻松的把这些寄存器逻辑用某种模式匹配出来。代码风格不好的话,只能通过有问题的后仿的多次迭代,把这些地方分批找出来,效率可想而知。

        通过对网表的分析和抓取,还可以生成在仿真过程调用的初始化寄存器值的脚本,避免X态不必要的传递。

        后仿开始前,一定要把详细的SDF反标报告打印出来仔细检查。需要把错误全部解决掉,警告视情况要解决大部分。带时序的后仿,一定要注意仿真器是否关闭了notimingcheck和nospecify的选项。如果有nospecify,那么SDF中的时序信息就反标不到仿真模型中(仿真模型的时序类型定义在specify block中);如果有notimingcheck,那么后仿过程中就不检查时序违例,后仿就失去了最大的意义。

        后仿通常都很慢,如何加快后仿的速度呢?编译器通常都会提供编译时、运行时优化程度的选择(例如vcs的debug系列选项)。优化程度高,仿真速度就快,交互性就差。更可怕的是,优化程度高的时候,编译器会采用一些激进的优化策略,会对时序调度产生一些看似微小实则可能决定成败的影响。如果在综合网表上跑零延时的ATPG仿真,碰到了莫名其妙的错误(尤其是用S家的MAX Testbench),那么试试加上+debug_pp,降低一点点优化程度,仿真结果会有意想不到的改善。

        带时序的后仿开始阶段,建议都dump一些波形出来,看看波形上的延时和SDF中的延时信息是否保持一致,这有助于对反标过程的理解和后仿整体进度的把握。

你可能感兴趣的:(FPGA,fpga开发)