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

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1505|回复: 7

[求助] 小白求助,为什么下面这段代码中变量的随机化会失败?

[复制链接]
发表于 2020-1-5 12:51:37 | 显示全部楼层 |阅读模式

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

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

x

在驱动器类的成员变量声明了一个事务类trans并在new中例化,然后在驱动器的start方法中又声明了一个事务类pkt,用浅拷贝把trans复制给pkt,运行后发现randomize方法是通过了,但是随机化的结果全是同一个值,这是怎么回事?




  1. class generator;
  2.         transaction trans; //声明成员trans
  3.         mailbox gen2drv;
  4.         int repeat_times;
  5.         event ended;
  6.        
  7.         function new(mailbox gen2drv);
  8.                 this.gen2drv=gen2drv;
  9.                 trans=new(); //构造函数中对成员trans进行例化
  10.         endfunction
  11.        
  12.         task start();
  13.                 transaction pkt; //在task方法中声明局部变量pkt
  14.                 $display("generator starts");
  15.                 repeat(repeat_times) begin
  16.                         pkt = new trans; //将trans浅拷贝给pkt
  17.                         if(!pkt.randomize()); //对pkt随机化
  18.                                 $fatal("generator's randomize faild");
  19.                         pkt.display("[gen]"); //打印pkt信息
  20.                         gen2drv.put(pkt);
  21.                 end
  22.                 ->ended;
  23.                 $display("generator ends");
  24.         endtask

  25. endclass


复制代码
控制台信息:
啊.png
 楼主| 发表于 2020-1-5 13:00:30 | 显示全部楼层
本帖最后由 leine 于 2020-1-5 13:16 编辑

改了下代码发现现在的情况是这样:
——如果我是直接pkt = trans,或者像一楼一样,进行浅拷贝pkt=new trans,控制台的信息是随机化成功,但是随机化得到的值是固定的
——如果我在事务类实现了深拷贝方法copy(),然后pkt=trans.copy(),随机化成功,随机化的值是正常的
请问这是怎么回事啊???

 楼主| 发表于 2020-1-5 13:04:43 | 显示全部楼层
再补充一下就是事务类里面没有写过约束,只声明了a、b、c三个信号。我看书里面说随机化失败一般是约束矛盾,但是我约束都没写过。。。
 楼主| 发表于 2020-1-5 13:51:52 | 显示全部楼层
wocao,这是编译器的问题?我又写了一小段代码检测一下:




  1. module top;
  2.         class packet;
  3.                 rand bit[3:0] a; //在类里面声明两个成员a、b
  4.                 rand bit[2:0] b;
  5.                 function void show();
  6.                         $display("a=%d;b=%d",a,b);
  7.                 endfunction
  8.         endclass
  9.        
  10.         initial begin
  11.                 packet num1,num2; //声明两个变量
  12.                 num1=new(); //在repeat循环外声明例化一个变量
  13.                 repeat(4) begin
  14.                         num2=new num1; //在repeat内浅拷贝另一个变量,随机化并打印
  15.                         num2.randomize();
  16.                         num2.show();
  17.                 end
  18.         end

  19. endmodule



复制代码
下面是我自己电脑用questasim10.6c运行仿真之后的结果,随机化是成功的但是随机值是固定的: q.png
下面是用在线的EDA playground选择vcs的编译环境运行的结果,随机化是成功的随机值也是随机的:
2.png

这是什么鬼啊。。。。???





发表于 2020-1-5 20:01:53 来自手机 | 显示全部楼层
我记得new好像要放在循环体内部,不然每次都随机同样的值
 楼主| 发表于 2020-1-5 20:18:04 | 显示全部楼层


阿莹的三石 发表于 2020-1-5 20:01
我记得new好像要放在循环体内部,不然每次都随机同样的值


上一楼我写了一小段代码试了下,发现放在循环体外部的话,用questasim仿真随机化的结果就是定值,而用在线的vcs仿真随机化的结果和期望的一样。。
发表于 2020-1-9 08:30:34 | 显示全部楼层
vcs和modelsim的随机机制不一样,modelsim的默认是randseed不变,所以你跑出来都一样,vcs的randseed不加的话每次都不一样,可能你跑两次vcs出来的值都不一样
 楼主| 发表于 2020-1-11 20:59:29 | 显示全部楼层


过客3944 发表于 2020-1-9 08:30
vcs和modelsim的随机机制不一样,modelsim的默认是randseed不变,所以你跑出来都一样,vcs的randseed不加的 ...


这样的话跑仿真岂不是很容易遇到坑。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-3-29 13:12 , Processed in 0.026687 second(s), 8 queries , Gzip On, Redis On.

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