SimXact

门级仿真的不定态解决方案

SimXact 门级不定态自动修复解决方案

Simxact门级不定态自动修复解决方案SimXact致力于解决在门级验证的时候,存在于设计仿真的不定态的问题。它分析设计逻辑和进行仿真跟踪,在仿真过程中,实时纠正仿真器不定态悲观(X-pessimism)处理方式造成的fales-x,并产生行为级的X-pessimism问题的解决方案,利于其他仿真或者回归测试使用。针对于真实的不定态(real-x)的问题,Simxact可以记录其传播路径,为后续调试不定态提供便利。  SimXact使用形式验证的方法,在仿真过程中,分析设计的结构和当前仿真结果,可以自动生成用于修复门级仿真不定态悲观问题的行为代码。它追踪仿真的结果,寻找一个导致假的不定态的电路,然后生成一个有条件的强制赋值或者释放代码,以替换不定态信号为正确常量值。该特性允许门级仿真产生正确的结果,并且保证不会掩盖设计真正的问题,因为此常量值是由SimXact的形式引擎验证获得的。

SimXact的主要功能和特点:

随着数字设计规模的不断扩大,设计的复杂度也迅速提升,从而造成设计验证的难度也呈几何级增长。尤其是在门级进行验证的话,会面临许多的挑战。 不定态的分析和修复是是门级仿真最常见的问题,处理不定态的问题非常耗费时间、资源和人力的。通常会有大量的不定态存在于门级的仿真中,分析和修复这些不定态的问题是个巨大的挑战。不定态(Xs)可能存在于未初始化的寄存器或多电压域设计中的模块被关闭,或者来自第三方的IP,甚至于标准单元库中的真值表有问题。由于在门级仿真的时候,仿真器对不定态的处理都采用比较谨慎和悲观的处理,所以在进行逻辑仿真的时候,不定态的状况不能正确地被处理,从而产生大量的所谓的false x,又导致仿真无法进行甚至掩藏设计中真实的不定态问题。传统的方式是针对于未初始化的寄存器赋予一个特定的值0或者1,或者是他们的随机组合。这样的方式存在一个很大的风险,他有可能讲真的不定态的问题给掩盖掉,从而造成芯片的失效。    SimXact主要功能是致力于解决这个门级仿真的不定态问题。通常右图的逻辑电路,reg1的值是x,表示它可能是1,也可能是0.但是无论这个值是0或者1, g6的输出都是0.但是在门级仿真的时候,仿真器处理不定态的方式比较悲观,所以他会在g6的输出值设定为x,从而造成仿真结果的不正确。

iphone white
Image
Simxact的做法是仿真的时候,当检测到g6的输出值为x的时候,它会利用形式验证技术去捕捉产生x的相应的扇入(fan-in)电路,从而判断这个x是一个false  X还是real-x。如果是real-x则记录x的传播路径,方便用户发现x的原因。如果是false-x,则在仿真的时候设置正确的0/1常量值,并且可以产生对应的verilog代码。  
always @(g1.o or reg1.q or g2.o)   
 if (g1.o === 1’b1 && reg1.q === 1’bx &&             g2.o === 1’b1)      
 force g6.o= 1’b0;    
else       release g6.o;      
Simxact的修复代码没有放在reg1这个地方,因为在reg1里的X是一个real x。如果reg1输出到其他逻辑,“修复”reg1可能会掩盖其他X错误。         Simxact通过这种做法,从而保证门级仿真的仿真精度和不会由于false x造成仿真中断,也不会遗漏设计中真正的x的bug。生成的代码可以用于后续的项目仿真或者回归测试。         对于real-x,在门级进行调试是一件非常痛苦的事情,常常会因为一个x的问题,调试几周甚至更长的时间。Simxact可以记录real-x的传播路径,与第三方调试工具verid结合,协助工程师缩短追踪时间到几个小时,大大节省调试时间。

Simxact也可以对real-x问题在仿真的时候,进行自动的常量值设置,这样的好处在于让仿真继续跑下去。这个功能生成一个比所有寄存器都设置初始值小得多的寄存器列表,这降低了随机赋值掩盖真实问题的风险。小的赋值列表也会使调试不定态的问题更容易:只需要对列表里面的寄存器进行检查。      在0-delay的门级仿真通常碰到的另外一个问题是竞争冒险的问题。当时钟和数据发生变化在同一时间,就可能会出现竞争(racing conditions)的情况。在RTL模拟中,非阻塞赋值可以用来解决这个问题。在门级仿真,时序单元通常是通过SUDPs来建模的,所以这个问题可能出现。这个问题被时钟门控(clock gaters)进一步恶化了。时钟门控会改变下游时钟钟事件发生的顺序。在混合级别的模拟中也会出现竞争冒险的状况。从rtl/行为级别的模型到门级的网表,或者反之亦然。因为RTL / behavior级的模型通常有0-延迟。      传统做法是手工修改标准库里面的SUDPS的参数,增加延时,来避免竞争冒险的问题。传统的做法在于人工的修改会出现问题,需要多次的反复才能获得正确的修改结果。另外,由于修改了标准单元库的参数,所以需要维护多个不同版本的单元库用于不同的设计流程,因而容易造成管理标准单元库的版本过多,不容易维护。      Simxact可以分析netlist来区分时钟路径和数据路径来产生一个假的SDF(Pseudo-SDF)文件。时钟路径上的时序单元应该有0或一个小的延迟,而数据路径上的时序单元应该会有更大的延迟。这样的话,时钟和数据就不会同时更改,并且匹配RTL行为。将SDF反标回网表就可以轻松实现门级0-delay的仿真和混合层次的仿真。Simxact也可以在真实的SDF文件反标的仿真中,进行不定态的修复和其他功能的使用。

Simxact的主要功能: 
  • 在门级仿真过程中,自动修复组合逻辑的false-x带来的仿真问题,并产生相应的剔除false-x的源代码。
  • 在门级仿真过程中,自动修复时钟门控(Clock Gater )电路逻辑的false-x带来的仿真问题,并产生相应的剔除false-x的源代码
  • 在门级仿真过程中,自动修复时序逻辑(sequential false Xs)的false-x带来的仿真问题, 生成BLIF格式文件用于追踪。
  • 在门级仿真过程中,自动设置real-x的常量值,是仿真继续运行,并产生一个需要赋值常量的寄存器清单。
  • 在门级仿真过程中,可以记录real-x的传播路径。当仿真停止时候,可以分析real-x的传播路径,快速发现X的源头,提高调试效率。
  • 分析门级网表,产生Pseudo-SDF来用于解决门级0-delay的竞争冒险问题。
  • 可以用于Power-Aware 的设计中,由于某个模块关闭造成的不定态的问题。 可以用于0-delay和带真实SDF的门级仿真。 可以监控仿真和和报告设计中常见的不定态问题。
  • 可以追踪毛刺(glitches)导致的不定态问题。
  • 可以分析网表,生成未寄存器,锁存器、SUDP或者所有时序单元的deposit文件,用于仿真的时候未复位的时序单元赋值。
  • 可以设置被测试模块的端口(port)常量值,阻止从其他模块或者IP传递过来的不定态。
  • 可以读入仿真结果(fsdb),作为参考结果,快速地进行不定态的分析,修复和追踪 RTL代码存在的delay line,可以快速转换到0-delay门级仿真的SDF。
  • 支持多线程和多机器的并行计算方式。
 Simxact支持主流的仿真器,包含cadence、Synopsys和Mentor的仿真工具,通过PLI的方式与仿真器连接,进行门级不定态的分析、修复。Simxact也可以与第三方调试工具verdi相结合,可以在verdi的调试界面里面显示Simxact的运行结果,便于工程师进行不定态原因的分析。Simxact还可以对门级仿真可能存在的问题做检查,如有图所示:
在0-delay的仿真中,DFF2不会锁住DFF1的新值,因为两个时钟都发生在同一时刻。 但是在真正的硬件和反标了sdf的仿真中,DFF2将会锁定DFF1传递过来的值。这可能导致0-delay仿真失败。给定一个由用户提供的逻辑级别P,Simxact检查到M-N>P的寄存器配对存在的时候,将其报告为潜在的问题。     Simxact执行静态结构分析,以识别没有驱动或有多个的net信号。这个分析不同于仿真器发出的编译警告。Simxact实际报告的是那些扇出逻辑有包含寄存器或者行为模块的未驱动的net信号,从而忽视掉那些未用到的没有驱动的net信号。另外,Simxact识别的未驱动的寄存器管脚,包括异步输入、同步数据输入和时钟类型。这对于调试非常有用。     Simxact提供的小工具可以检查和监测多达16种情况,来协助工程师在仿真的时候发现可能存在的问题。
 
Image
Simxact的使用流程:        

 在运行SimXACT之前,可以执行预设置分析,以确保运行SimXACT的正确配置。如果在0-delay的仿真中存在竞争冒险,可以让SimXACT生成一个pseudo SDF用于消除竞争冒险。  SimXACT流程如下:  

1.使用SimXACT的自动监控器和自动修复功能运行门级仿真。产生用于修复不定态的源代码。  

2.检查仿真结果,检查是否还有不1定态的问题导致仿真失败。 

 3.如果仿真结果没问题,那么产生的源代码可以用于后面同样设计的门级仿真项目。  

4.如果仿真结果有问题,分析是否有real-x造成仿真失败。 

 5.对不同的测试用例重复1-3步骤,合并所产生的修复源代码

Simxact的案例分享:   
 某公司网络芯片: 设计包含2090058 寄存器和锁存器 所有的未初始化的寄存器全部设置为数值0,仿真通过 需要设置445854 个寄存器 所有的未初始化的寄存器不做处理,仿真失败 利用SimXACT去跑仿真, 仿真失败。 运行时间: 2个小时 产生大约33000修复代码 Simxact仿真失败,进行问题的分析,发现设计的bug Real-X的问题被掩盖,由于在RTL级别仿真器处理X的方式比较宽松。
 客户RTL 代码:
 if ((pa1_detect_var[I] | exclude_byte_d2) & pa1_detect_var[I+8] | exclude_byte_d2...) 
search_result[I] <= 1'b1; 
 else    search_resultI] <= 1'b0; 
因为pa1_detect_var is X, search_result 应该也是 X 然而, 在RTL级的仿真, search_result会被赋值0 进一步分析可以得知,当这个X赋予一个特定值, search_result信号值实际能够变成“1”。 从上面那里可以看出,当使用传统方式将所有未初始化的寄存器赋予一个特定的值,会将设计中的bug掩盖掉。而使用Simxact,可以将这个问题很容易的挖掘出来,并提供快速的方法去找到这个问题的源头。
Top