std::randomize 的陷阱

本文转账自:

验证笔记 012:std::randomize,没那么简单 (qq.com)

在近期的一个testcase调试中,遇到一个std::randomize随机结果不符合预期的现象。

在testcase中设计一个结构体队列,然后使用std::randomize对结构体中的某个参数进行随机赋值,randomize的使用是std::randomize(s_item_list[i].AA) with {...}, code抽象如下:

std::randomize 的陷阱_第1张图片

使用VCS编译仿真后得到结果如下:

std::randomize 的陷阱_第2张图片

从结果可以看到,虽然约束了结构体里参数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队列变量,进行测试。设计的测试代码如下:

std::randomize 的陷阱_第3张图片

仿真的结果如下:

std::randomize 的陷阱_第4张图片

总结规律,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;

std::randomize 的陷阱_第5张图片

XRUN给出了原因说明:The argument to scope randomize must be a simple identifier of integral.

所以在std::randomize的使用时,需要主要传入的参数需要是普通型变量,避免队列中元素的索引。

你可能感兴趣的:(那些年碰到和看到的坑,uvm,random)