众所周知,emir收敛可以基于vector 和vectorless 两种基础的方式进行,vector局限性很强,依赖后仿特殊场景仿真生成的VCD,fsdb等波形文件。波形文件作为内部逻辑的数字行为的体现,通常会选择一些典型的场景产生,就cpu设计而言,尽可能完整的提取dryston,max power等场景,这样可以尽可能准确的模拟芯片真实工作状态,但是完整场景波形文件过大的问题也会随之而来,后续仿真及debug都会变得异常艰难,为了避免上述的问题,其实也有很多的方式去处理波形文件,比如说裁剪,partion等等.... vectorless 则相对更加复杂,主要根据算法来覆盖vector向量所不能cover的场景,跟它息息相关的变量就是大家耳熟能详的toggle rate或者active,那么工具是如何处理这些变量呢? 以 voltus propagation dynamic irdrop 为例: 一般我们通过标记input port,macro,clock gating,seq,logic的toggle rate去模拟芯片的工作。他们具体代表什么含义?对应的工具行为又是什么? input :通俗易懂,就是给design的input ports 标定toggle rate,然后按照电路连接逐级传递,这样简单的传递,会导致clock path和seq这些关键逻辑的active过低,所以就衍生出了clock gating和seq。 clock gating:强行将clock gating的output pin的toggle 设为2,确保clock path上面的active足够悲观。 seq:与clock gating同理 macro:动态仿真阶段,design中20%的macro会被选中toggle;静态模式下就是给所有macro的output pin 设置active。 但是对于macro的设置,一般不会这样做,而是通过指定特定的trigger mode,比如让所有的macro 按照TSMC_WRITE_HIGH mode 在每个周期都toggle来模拟最悲观的情况。 还有一种比较特殊的情况,那就是loop: 上述就是基于active设置去做全局propagation,那么工具是如何根据toggle rate完成dynamic irdrop的分析呢? 为了使电流分布均匀,并最大限度地减少选择的局限性,首先将design按照规模大小合理切割成若干个区域,每个区域都包含input,flop等逻辑,其次按照时钟或者内部设计的复杂程度将这些逻辑做一个编号或者排序,继而所有的区域在给定的仿真区间内同时进行迭代计算,模拟出最悲观的结果并导出结果,那么工具是如何在单独区域内进行迭代?以seq为例: 假设某个切割后的区域内部包含1000个 flops, 前两个周期将会选择排序靠前的10%的reg,第一个周期内按照一半flop 同时rise,一半flop同时fall,第二个周期内相同的flop用相反的行为进行仿真(rise 变fall,fall变rise)。以此类推,在20个周期的仿真时间,就可以覆盖到全部flop,但是仿真时间过长会导致工具分析的时间急剧增加,所以根据实际的情况可以调节仿真的时间,具体方式如下: 拓展一下,如何去检查仿真过程中是否覆盖到关键时钟的flop呢?通过报告情况合理的修改参数,迭代到尽可能多的覆盖到关键clock的flop也不失为一个好方法。 同理,input和macro同flop一样。 |
|