std::randomize随机结果不符合预期?

电子说

1.3w人已加入

描述

在近期的一个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 currentscope 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 randomconstraints 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的使用时,需要主要传入的参数需要是普通型变量,避免队列中元素的索引。







审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分