随机约束和覆盖组同步方法
技术领域
本发明涉及芯片检测技术领域,特别涉及一种随机约束和覆盖组同步方法。
背景技术
在芯片验证工作中,我们往往需要对RTL(Register Transfer Level,寄存器传输级)设计的配置对象或者施加的输入激励进行随机,然后运行相应的测试用例以期望通过随机发现一些RTL设计中潜在的问题。而这里的随机,并不是完全的随机,需要约束限制其随机的值在合法的区间范围,以使得RTL设计模块工作在正常的状态或者得到有效合法的输入激励,否则我们可能会得到无效的配置或激励,那么运行测试用例则失去了测试验证该RTL设计的意义。(这里的有效合法值,指的是符合RTL设计规则的区间值,这里的正常的工作状态,指的是符合RTL设计规则的工作模式状态)。
如图1所示,可以看到,图中我们对配置对象config和输入激励sequence进行随机,以配置DUT在随机的工作状态,以及施加给DUT一个随机的激励来仿真测试。虽然在对复杂的芯片的验证过程中,通过随机约束的方法能够帮助我们避免手动编写测试用例,从而帮助我们提高验证效率,但是如果不运行仿真来查看仿真日志文件的话,我们很难清楚的知道该随机出来的配置对象或输入激励里的数据成员最终是什么值,因此我们通常需要编写覆盖率收集组件中的覆盖组(covergroup)来确保随机出来的对象的数据成员的值落在我们想要观测的区间范围值,从而帮助我们跟踪对DUT验证的完整性或者说验证的进度。而随机约束和覆盖率收集组件两者都代表着对目标对象随机求解后的合法区间范围值进行的建模,主要区别如下:
随机约束:从正面进行建模,即通过随机约束程序块(constraint)指明随机求解过程需要满足的一些约束条件,以使得最终的随机值处在目标区间范围值,这最终决定了我们想要仿真的配置对象或输入激励。
覆盖率收集组件:从反面进行建模,即通过指明需要忽略的覆盖仓(ignore_bins)来排除需要覆盖收集的数值,相当于从反面指明了最终我们想要关心的随机区间范围值,这最终决定了我们想要观测的配置对象或输入激励。
因此,两者需要进行关联同步,否则很可能由于错误的随机约束或覆盖率收集组件的观测不够,而引发对DUT的验证不够充分,最终导致对目标芯片的验证不充分而流片失败。
现有的用来实现上面两者的关联同步的方案如图2所示。
下面看个具体的例子,代码如图5所示;
上述代码派生于uvm_sequence_item,通常作为仿真输入激励,里面有数据成员A和B,都是bit类型,位宽为4。另外包含如下三个随机约束:
A_larger_than_B:成员A的随机值需要大于成员B的随机值;
sum_of_A_B_is_odd:成员A和B的随机值之和必须是奇数;
if_A_is_3_then_B_is_2:如果成员A的随机值为3,那么成员B的随机值应该为2。
然后我们来看覆盖率收集组件部分,代码如图6所示,该覆盖率收集组件可以通过使用订阅者模式派生于uvm_subscriber组件来实现,也可以通过TLM通信端口连接来实现,这里为了方便,使用订阅者模式来实现。
覆盖组中包含两个覆盖点A和B,以及一个交叉覆盖点,我们在交叉覆盖点中定义了三个方法用于产生需要在交叉覆盖点中忽略的覆盖仓来排除需要覆盖收集的数值,然后在下方的ignore_bins中调用相应的方法即可完成之前提到的从反面指明最终我们想要关心的随机区间范围值。
其中需要使用到SystemVerilog为交叉覆盖组提供的CrossQueueType数据类型。这里做简单说明代码如图7所示。
根据图7所示可以看到,主要有两种类型:
CrossValType:一种将交叉覆盖点涉及到的成员变量组合成为结构体的新的数据类型。
CrossQueueType:利用上述类型声明的队列。这里我们使用相关方法时使用的返回值即该队列数据类型,用来写入在交叉覆盖点中忽略的覆盖仓。
(1)现有方案中的随机约束和覆盖率收集组件中存在大量重复描述的运算表达式部分,即存在较多重复代码,只是对于随机约束部分代码来说,其是从正面进行建模,对于覆盖率收集组件部分代码来说,其是从反面进行建模,但是基本上都将原先的等式重新进行了编写,代码冗余,开发效率低。
(2)如果我们要对随机约束或者覆盖率收集组件的两者之一进行修改的话,那么就需要同时修改两个地方,很容易遗漏导致出错,因此很难保证两者之间同步的及时性和一致性,即代码的可维护性比较差。
发明内容
根据本发明实施例,提供了一种随机约束和覆盖组同步方法,包含如下步骤:
S1:创建gen_ignore_bins方法,在gen_ignore_bins方法中声明并构造目标的随机对象;
S2:遍历覆盖组的交叉覆盖点的组合,获得遍历的值;
S3:将遍历的值指定赋给待检查的随机对象的数据成员;
S4:将预设的参数传递到随机方法中,以将随机约束求解方法当作随机约束的检测器来使用;
S5:调用检测器检查随机对象中数据成员的值是否符合随机约束所约束的合法区间范围值,从而做出相应操作;
S6:重复执行上述步骤S2、步骤S3、步骤S4和步骤S5,直至遍历完所有覆盖组的交叉覆盖点的组合。
进一步,若数据成员的值符合随机约束所约束的合法区间范围值,检查数据将返回1,不做任何操作。
进一步,若数据成员的值不符合随机约束所约束的合法区间范围值,检查数据将返回0,将数据成员写入相应的覆盖组的交叉队列类型。
进一步,当将预设的参数传递到随机方法中时,待检查的所述随机对象不会产生目标随机值。
根据本发明实施例的随机约束和覆盖组同步方法,将参数传递到随机方法来将原先的随机产生器当作检测器来使用,从而创新性的应用实现了随机约束和覆盖组之间的关联同步。简化后的覆盖组中获取ignore_bins的接口方法缩减为一个,且不再需要编写此前类似随机约束的约束表达式,从而大大简化了代码,提升了验证开发效率。
要理解的是,前面的一般描述和下面的详细描述两者都是示例性的,并 且意图在于提供要求保护的技术的进一步说明。
附图说明
图1为基于UVM的典型验证平台架构中的随机约束示例原理图。
图2现有技术的随机约束和覆盖组关联的原理图。
图3本发明实施例的随机约束和覆盖组同步方法的原理图。
图4本发明实施例的随机约束和覆盖组同步方法的流程图。
图5现有技术的的代码图。
图6现有技术的的代码图。
图7现有技术的的代码图。
具体实施方式
以下将结合附图,详细描述本发明的优选实施例,对本发明做进一步阐述。
首先,将结合图3~4描述根据本发明实施例的随机约束和覆盖组同步方法,用于芯片验证使用,其应用场景很广。
如图3~4所示,本发明实施例的随机约束和覆盖组同步方法,具有如下步骤:
在S1中,如图4所示,创建gen_ignore_bins方法,在gen_ignore_bins方法中声明并构造目标的随机对象。
在S2中,如图4所示,遍历覆盖组的交叉覆盖点的组合,获得遍历的值。
在S3中,如图4所示,将遍历的值指定赋给待检查的随机对象的数据成员。
在S4中,如图4所示,将预设的参数传递到随机方法中,以将随机约束求解方法当作随机约束的检测器来使用。在本实施例中,当将预设的参数传递到随机方法中时,待检查的随机对象不会产生目标随机值。
在S5中,如图4所示,调用检测器检查随机对象中数据成员的值是否符合随机约束所约束的合法区间范围值,从而做出相应操作。在本实施例中,若数据成员的值符合随机约束所约束的合法区间范围值,检查数据将返回1,不做任何操作,若数据成员的值不符合随机约束所约束的合法区间范围值,检查数据将返回0,将数据成员写入相应的覆盖组的交叉队列类型。
在S6中,如图4所示,重复执行上述步骤S2、步骤S3、步骤S4和步骤S5,直至遍历完所有覆盖组的交叉覆盖点的组合。
以上,参照图3~4描述了根据本发明实施例的随机约束和覆盖组同步方法,将参数传递到随机方法来将原先的随机产生器当作检测器来使用,从而创新性的应用实现了随机约束和覆盖组之间的关联同步。 简化后的覆盖组中获取ignore_bins的接口方法缩减为一个,且不再需要编写此前类似随机约束的约束表达式,从而大大简化了代码,提升了验证开发效率。
需要说明的是,在本说明书中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包含……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
尽管本发明的内容已经通过上述优选实施例作了详细介绍,但应当认识到上述的描述不应被认为是对本发明的限制。在本领域技术人员阅读了上述内容后,对于本发明的多种修改和替代都将是显而易见的。因此,本发明的保护范围应由所附的权利要求来限定。