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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4325|回复: 9

[求助] 程序进入死循环,从看门狗退出,怎么寻找代码问题

[复制链接]
发表于 2017-12-16 21:07:05 | 显示全部楼层 |阅读模式

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

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

x
QQ图片20171216210720.png




  1. task ReceiverBase::get_payload();
  2.   if (TRACE_ON) $display("[TRACE]%t %s:%m", $realtime, this.name);
  3.   this.pkt2cmp_payload.delete();
  4.   fork
  5.     begin: wd_timer_fork
  6.     fork: frameo_wd_timer
  7.       @(negedge this.rtr_io.cb.frameo_n[da]);
  8.       begin
  9.         repeat(1000) @(rtr_io.cb);
  10.         $display("\n%m\n[ERROR]%t Frame signal timed out!\n", $realtime);
  11.         $finish;
  12.       end
  13.     join_any: frameo_wd_timer
  14.     disable fork;
  15.     end: wd_timer_fork
  16.   join
  17.   forever begin
  18. ...
  19. ...
  20. ...
  21. ...


复制代码


根据仿真结果显示,找到了提示的router_test_top.t.\ReceiverBase::get_load .wd_timer_fork.frameo_wd_timer
正是代码中看门狗的那里 ,
说明程序进入了死循环,退出了,那下一步怎么去寻找代码问题那?(DUT没有问题!)
发表于 2017-12-17 19:50:39 | 显示全部楼层
为什么就贴出这点代码?是觉得问题出在这点代码里么?现在TB报了error,那是满足了哪个条件才会报这个error?这个条件表达式里有哪些信号?这些信号又是由谁驱动的?一点点trace呗
 楼主| 发表于 2017-12-17 22:22:21 | 显示全部楼层
回复 2# nativeda


   理解你说的找代码问题的思想了。我贴出这段代码是因为,仿真报告中显示从这里退出仿真的。这里是一个看门狗程序,为了防止死循环,这种情况应该怎么找代码问题阿?
发表于 2017-12-18 08:55:04 | 显示全部楼层
回复 3# 乐在其中296


   你怎么确定问题是”死循环", 不是例如数据丢失等其他问题的? 你真理解前面说的debug思路,就把那些问题的答案给出来呗,不然大家怎么往下trace
发表于 2017-12-19 00:17:27 | 显示全部楼层
最近也在做这个LAB,碰到过同样的问题,将我的Debug过程简单说下,仅供参考:1.TRACE_ON=1,dump 波形,re_run
2.分析log,WDT触发条件为1000 cycle frameo_n无触发。查看波形,发现16个输出口中确实有reset后1000cycle都没用到的。分析输入波形,发现输入16个端口只用到了一个端口,再看log,发现,16个gen模块只调用其中一个。最后找到原因,16个gen模块共用一个mail_box,该mail_box例化是,忘记设置深度,无限容量,所以,当第一个gen产生Packets,由于无阻塞效果,直接在第一个gen模块,就产生了2000个Packet。修改,将mail_box深度设为1,re_run,simulation pass。
3.复盘:lab设置此WDT目的,是演示如何在checker中,加人预防超时机制。这个机制本身有其意义,其中引导的对mail_box深度的认识也是值得深究的。但严格来说,DUT本身,进行这个check,是要商榷的。输入输出端口的遍历,应该由function coverage进行check,超时机制的检查,应该引入输入的目标地址,该输出端口期望有输出时,才应该进行超时检查的,而整体无输出的检查,应该用线与逻辑,而非现在的遍历逻辑。而实际上,修改方式并没有消灭这种某个端口一直没输出的极端情况的,只是修改后,16个gen同时进行random,极大的降低了1000个cycle内,某个端口一直不触发的情况而已。
如上是当时的debug过程,希望能提供帮助。下面就是两个吐槽了:
1.提供尽可能多的信息,是求助,也是真正日常工作中的基本要求,神人,也无法由你提供的那一段代码加那几句log,得到root cause,事实上,虽然我上面写了那么多,我还是不能确认,你的bug就是这个的。
2.IC民工,不管设计还是验证,请勿使用“RTL没问题“,“DUT没问题”这类嘲讽描述,打脸很痛的。尚在ENV调试阶段,未经充分验证,你怎么确认的DUT没问题,就因为是S公司提供的LAB吗?
闲的无聊,第一个实质性回复,姑妄言之,姑妄听之。
 楼主| 发表于 2017-12-21 16:11:11 | 显示全部楼层
回复 5# my7219

       首先我觉得你对技术之外的吐槽比较中肯,以后注意吧。确实是不能说DUT没有问题,我在S公司的lab中也找到过一些小错误。
   技术上面,我的问题和你的这个是一样的,通过你说的办法去做,是有效的。但是对你说的第3点并不是很理解,尤其是对“引导的对mail_box深度的认识”这句,能不能再解释下。
 楼主| 发表于 2017-12-22 22:18:39 | 显示全部楼层
回复 5# my7219


   我今天又看了遍 程序,gen模块只有一个吧,一个gen,16个driver,16个receiver,1个scoreboard。
gen模块中定义了16个信箱,这16个信箱送到driver。   我都有点混乱了,如果可以,能麻烦讲一下这个testbench的运行过程吗

gen模块的构造函数:




  1. function Generator::new(string name);
  2.   if (TRACE_ON) $display("[TRACE]%t %s:%m", $realtime, name);
  3.   this.name = name;
  4.   this.pkt2send = new();
  5.   this.out_box = new[16];
  6.   foreach(this.out_box[i])
  7.     this.out_box[i] = new();
  8. endfunction: new


复制代码



test模块的:




  1. initial begin
  2. sem = new[16];
  3.         drvr = new[16];
  4.         rcvr = new[16];
  5.         gen = new("gen");
  6.         sb = new("sb");

  7.         foreach (sem[i])
  8.           sem[i] = new(1);
  9.         foreach (drvr[i])
  10.           drvr[i] = new($sformatf("drvr[%0d]",i), i, sem, gen.out_box[i], sb.driver_mbox, rtr_io);
  11.         foreach (rcvr[i])
  12.           rcvr[i] = new($sformatf("rcvr[%0d]",i), i, sb.receiver_mbox, rtr_io);
  13. reset();
  14. gen.start();
  15.         sb.start();
  16.         foreach (drvr[i]) drvr[i].start();
  17.         foreach (rcvr[i]) rcvr[i].start();
  18.         wait(sb.DONE.triggered);

  19.   end


复制代码
发表于 2017-12-23 23:21:43 | 显示全部楼层
回复 7# 乐在其中296


  首先,抱歉,我之前的回答有误,关于mail_box深度设置而造成的gen行为不一样,应该是对的。无限容量的mail_box,达不到阻塞取值的效果。但gen并没有共用mail_box。  其次,打开TRACE_ON,看log,能清晰看到从module new到data send到data check全过程的。
  最后,我有一定实际验证经验,但SV也是初学者,不然不会去做这个lab的,所以,观点仅供参考。
发表于 2017-12-26 18:03:09 | 显示全部楼层
thank you
发表于 2017-12-26 18:10:17 | 显示全部楼层
thank you
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-7 00:11 , Processed in 0.031582 second(s), 7 queries , Gzip On, Redis On.

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