本文转账自:
验证笔记 012:std::randomize,没那么简单 (qq.com)
在近期的一个testcase调试中,遇到一个std::randomize随机结果不符合预期的现象。
在testcase中设计一个结构体队列,然后使用std::randomize对结构体中的某个参数进行随机赋值,randomize的使用是std::randomize(s_item_list[i].AA) with {...}, code抽象如下:
使用VCS编译仿真后得到结果如下:
从结果可以看到,虽然约束了结构体里参数AA的范围是大于等于1,小于3,但仍出现了随机结果为0的情况。这显然不符合预期。
思绪良久,没看出问题所在。只能打开SV手册来查阅,针对std::randmozie的说明可参考SV语法手册的18.12小节。从中还是发现了一些可疑之处:
The scope randomize function, std::randomize(), enables users to randomize data in the current scope without the need to define a class or instantiate a class object.
...
The std::randomize() with form of the scope randomize function allows users to specify random constraints to be applied to the local scope variables.
看起来像是和scope有关系,因此又设计了class内普通变量,结构体变量,结构体队列变量,class变量,class队列变量,进行测试。设计的测试代码如下:
仿真的结果如下:
总结规律,randomize(VAR),
当VAR是结构体里的变量(s_item.AA)、class里的变量(c_item.AA)、普通变量(int,bit)时,randomize行为正常;
当VAR是结构体队列中某个元素的变量(s_item_list[i].AA)、class队列中某个元素的变量(c_item_list[i].AA),randomize随机行为不符合预期。
随机结果不符合预期,EDA工具却没有给出warning或者error。为了确认其原因,就换了XRUN工具,看看是否能够复现该问题。
切换XRUN工具后,直接在编译阶段fail;
XRUN给出了原因说明:The argument to scope randomize must be a simple identifier of integral.
所以在std::randomize的使用时,需要主要传入的参数需要是普通型变量,避免队列中元素的索引。