在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜帖子
查看: 529|回复: 13

[求助] 随机一个数组,只要有两个0出现,在第三个0出现前必须有个1

[复制链接]
发表于 2025-7-16 17:35:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
如何写约束实现如下,随机一个数组,数组的值的范围是[0:5],只要有两个0出现,在第三个0出现前必须有个1,谢谢!

目前只能写出 foreach(array[i]) {if(i > 2) (array[i] | array[i-1] | array[i-2]) != 0;}   但是数组中运行的值不仅仅有0和1,还有其他值,所以这条约束就不大适用了。
发表于 2025-7-16 17:46:05 | 显示全部楼层
这种东西,AI不是更擅长么:class my_array;   rand bit [2:0] arr[];   int length;    function new(int len);     length = len;     arr = new[length];   endfunction    constraint value_range {     foreach(arr[i]) arr[i] inside {[0:5]};   }    // 不加复杂约束,后处理   function bit check_constraint();     int zero_idx[$];     foreach(arr[i]) if (arr[i] == 0) zero_idx.push_back(i);     for (int k = 2; k < zero_idx.size(); k++) begin       bit found = 0;       for (int j = zero_idx[k-1]+1; j < zero_idx[k]; j++)         if (arr[j] == 1) found = 1;       if (!found) return 0;     end     return 1;   endfunction    function void post_randomize();     while (!check_constraint()) void'(randomize());   endfunction endclass
回复 支持 反对

使用道具 举报

发表于 2025-7-16 18:30:53 | 显示全部楼层
deepseek 问出你的问题吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-7-16 19:37:27 | 显示全部楼层


   
Xunuoo 发表于 2025-7-16 17:46
这种东西,AI不是更擅长么:class my_array;   rand bit [2:0] arr[];   int length;    function new(int  ...


谢谢。问了AI了,也是这个结果,但是不大符合需求
回复 支持 反对

使用道具 举报

发表于 2025-7-17 08:58:26 | 显示全部楼层
我建议通过多次随机,然后挑选符合要求的数据出来。也就是ai给的方式。这种实现比较简单
回复 支持 反对

使用道具 举报

发表于 2025-7-17 15:10:15 | 显示全部楼层
再一条约束把值圈死,应该就可以 foreach(xxx[i]) {xxx[i] inside {[0:1]};
回复 支持 反对

使用道具 举报

发表于 2025-7-17 20:05:52 | 显示全部楼层
我提供个思路:你先正常随机,然后遍历这个array,找到第三个0,然后把这个0 replace成1 。然后counter置0 ,循环这个操作,直到array的尾巴
回复 支持 反对

使用道具 举报

发表于 2025-7-18 16:06:46 | 显示全部楼层
先随机出来,在根据规则进行后处理是一个好的思路
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-7-18 17:18:20 | 显示全部楼层


   
daviehj 发表于 2025-7-17 15:10
再一条约束把值圈死,应该就可以 foreach(xxx) {xxx inside {[0:1]};


这个应该可以,我试一下,谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-7-18 17:20:58 | 显示全部楼层


   
akqkq 发表于 2025-7-17 20:05
我提供个思路:你先正常随机,然后遍历这个array,找到第三个0,然后把这个0 replace成1 。然后counter置0  ...


谢谢,有这样考虑过。但是transaction中其实还有其他变量数组,当array中的值为0或者1,或者2时,同时约束其他值的随机,好像不能单独的修改这个值。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-8-9 17:43 , Processed in 0.018421 second(s), 3 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表