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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3120|回复: 14

[求助] UVM的scb中比对时pop预期数据遇到恰好往预期数据的q里面push下个预期数据会不会造成干扰?

[复制链接]
发表于 2021-5-12 18:09:50 | 显示全部楼层 |阅读模式

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

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

x
如标题描述,环境平台中scorboard中两个并行块get从refmodel中的预期数据和monitor采到的实际数据,比较疑惑的问题是,expect只new了一次,假如运行push到q的时候,恰好第二个块里面expect从q中pop出来,这样不会混乱么?平台大概两百个用例,跑了很多遍也没有fail过,而且不是平台一起来就所有的rm预期就生成好的,感觉会有这样的可能性存在,但确实没遇到过,有没有大佬来解答一下。scb如下:
new()如下
expect = new();
actual = new();


main_phase()如下
fork
    while (1) begin
        rm2scb_port.get(expect);
        if(expect.cmp_id ==1) begin
            q1.push_back(expect);
        end else if(expect.cmp_id==2) begin
            q2.push_back(expect);
        end else if(expect.cmp_id==3) begin
             q3.push_back(expect);
        end
    end
    while(1) begin
        outmon2scb_port.get(actual);
        compare_result();
    end
join
cpmpare_result()如下:
     if(actual.cmp_id ==1) begin
         expect = q1.pop_front;
         result= actual.compare(expect);
     end
     if().......
     ....以此类推







发表于 2021-5-12 19:45:28 | 显示全部楼层
你跑的应该是没出现你说的那种情况,rm应该不消耗时间,outmon2scb_port get到时候已经push完了
如果出现那种情况,和你理解的一样,我也觉得是有问题的
 楼主| 发表于 2021-5-13 09:04:20 | 显示全部楼层


anpengfei 发表于 2021-5-12 19:45
你跑的应该是没出现你说的那种情况,rm应该不消耗时间,outmon2scb_port get到时候已经push完了
如果出现那 ...


谢回复,我在outmon2scb.get(actual)这里下面加一行打印打印出时间和上面q1,q2,q3的size,发现get到actual的时候,size不等于用例里面发的包预期结果的个数,而且driver里面发包时每发完一个会随机等一段时间发下一个,这样分析来看,是出现了get到actual之后一边在pop出来比较,另一边在往q里面push的情况的。。。。唉。。。
 楼主| 发表于 2021-5-13 09:41:22 | 显示全部楼层


anpengfei 发表于 2021-5-12 19:45
你跑的应该是没出现你说的那种情况,rm应该不消耗时间,outmon2scb_port get到时候已经push完了
如果出现那 ...


谢谢回复,我在mon.get(actual)下面那里加了打印,打印get到一个actual的时候q的size出来,发现size的值是小于我tc里面发包数量预期的数据量的,我的driver里面发包之后会随机一段时间wait,然后才发下一个包,这样分析看来是会撞到一边在push到q,一边在pop出来做比对啊,好奇怪,没有乱过,还是我的分析不成立?
发表于 2021-5-13 11:27:46 | 显示全部楼层
同一仿真时刻会出现push和pop撞到一起。
但是同一cpu时刻只处理一个事情,所以push和pop是有先后的。
 楼主| 发表于 2021-5-13 12:35:26 | 显示全部楼层


li5panlong 发表于 2021-5-13 11:27
同一仿真时刻会出现push和pop撞到一起。
但是同一cpu时刻只处理一个事情,所以push和pop是有先后的。 ...


对啊,那假如撞到一起了,先处理的pop,那就是相当于下面这样子了expect=new()
expect=q1.pop_front()
q1.push_back(expect)
因为expect只new了一次,这个expect名字索引到同一片存储空间,那已经pop出来的可能会被push到q1里面去,也有可能撞到push到q2或者q3,这样就全乱了啊。。。。但是又没有fail用例。。。求解惑
发表于 2021-5-13 14:25:43 | 显示全部楼层


isliuhui 发表于 2021-5-13 12:35
对啊,那假如撞到一起了,先处理的pop,那就是相当于下面这样子了expect=new()
expect=q1.pop_front()
q1 ...


没详细研究过,猜测:
两个while语句里的东西被仿真工具当做线程处理了。
也就是说第一个里面get 和push是个原子操作。
第二个while里面的get和compare也是个原子操作。

然后就跑不出问题了。

对于这种太复杂不想搞明白的问题,我都是额外定一个tmp_expect变量,用来存储pop出来,和act比较。


发表于 2021-5-15 11:44:21 | 显示全部楼层
不会有问题的,一个是push_back,一个是pop_front,咋会有影响呢?放的时候是放到队列尾部,取的时候,是从队列头部取。就算你的队列里面只有一个元素,那也因为RM没有延时,是比dut输出要快的,等dut的输出触发pop_front的时候,RM已经push_back完了,不会有影响的。
发表于 2021-5-15 11:46:51 | 显示全部楼层
问题在于,你的push和pop操作,expect不要用同一个句柄,在各自的task里面申明局部的句柄去操作。
 楼主| 发表于 2021-5-17 18:33:23 | 显示全部楼层


飞翔的马甲 发表于 2021-5-15 11:46
问题在于,你的push和pop操作,expect不要用同一个句柄,在各自的task里面申明局部的句柄去操作。 ...


谢谢回答,我的意见和您一样,在我自己以往的平台都是再用另外的句柄,这个平台接手同事的,他只new了一次,而且这个句柄在两个并行task里面用,所有我觉得会有问题,但回归了很多遍用例,也没有fail,一切都很正常,所以比较奇怪这个问题到底存不存在.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-12-18 22:57 , Processed in 0.027144 second(s), 6 queries , Gzip On, Redis On.

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