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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1391|回复: 6

[求助] 求助:main_pahse 到 post_main_phase 之后,数据被改变了???

[复制链接]
发表于 2024-9-2 16:14:36 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Wade_ 于 2024-9-2 16:13 编辑

    目前,我在scoreboard的main_phase中收集monitor的数据和model的数据,将其放到队列中。然后在scoreboard的post_main_phase中将这两个队列进行顺序比对。但是main_phase到post_main_phase后,期望队列中的数据就被改变了,但是实际队列中的数据是正常的。下面是关键代码:



     27 task my_scoreboard::main_phase(uvm_phase phase);
     28     my_transaction  get_expect;
     29     my_transaction  get_actual;
     30
     31     int i=0, j=0;
     32
     33     super.main_phase(phase);
     34
     35     fork
     36         while (1) begin
     37             exp_port.get(get_expect);
     38             expect_queue.push_back(get_expect);
     39             `uvm_info("my_scoreboard:main_phase", "get one expect trans is:", UVM_LOW);
     40             expect_queue.print;
     41             i=i+1;
     42         end
     43
     44         while(1) begin
     45             act_port.get(get_actual);
     46             actual_queue.push_back(get_actual);
     47             `uvm_info("my_scoreboard:main_phase", "get one actual trans is:", UVM_LOW);
     48             actual_queue[j].print;
     49             j=j+1;
     50         end
     51
     52     join
     53
     54 endtask

     55

     56 task  my_scoreboard::post_main_phase(uvm_phase phase);
     57     my_transaction actual_trans_tmp;
     58     my_transaction expect_trans_tmp;
     59     bit result;
     60
     61     `uvm_info("my_scoreboard:post_main_phase", "actual_queue trans: ", UVM_LOW);
     62     foreach(actual_queue) begin
     63         actual_queue.print();
     64     end
     65
     66     `uvm_info("my_scoreboard:post_main_phase", "expect_queue trans: ", UVM_LOW);
     67     foreach(expect_queue) begin
     68         expect_queue.print();
     69     end

      ............
     107 endtask


下面是输出的report,此时我设置的sequence数量为2。
main_phase中两个队列接收到的第一个数据包:

UVM_INFO */verif/UVM/env/my_scoreboard.sv(47) @ 302500.000 ns: uvm_test_top.env.scb [my_scoreboard:main_phase] get one actual trans is:
----------------------------------------------
Name               Type            Size  Value
----------------------------------------------
uvm_sequence_item  my_transaction  -     @931
  ins_id           integral        5     'h12
  addr              integral        4     'he  
  data_in          integral        7     'h21
  data_out         integral        7     'h0
----------------------------------------------
UVM_INFO */verif/UVM/env/my_scoreboard.sv(39) @ 302500.000 ns: uvm_test_top.env.scb [my_scoreboard:main_phase] get one expect trans is:
----------------------------------------------
Name               Type            Size  Value
----------------------------------------------
uvm_sequence_item  my_transaction  -     @927
  ins_id           integral        5     'h12
  addr              integral        4     'he  
  data_in          integral        7     'h21
  data_out         integral        7     'h0
----------------------------------------------

main_phase中两个队列接收到的第二个数据包:

UVM_INFO */verif/UVM/env/my_scoreboard.sv(47) @ 522500.000 ns: uvm_test_top.env.scb [my_scoreboard:main_phase] get one actual trans is:
----------------------------------------------
Name               Type            Size  Value
----------------------------------------------
uvm_sequence_item  my_transaction  -     @944
  ins_id           integral        5     'h12
  addr              integral        4     'h6  
  data_in          integral        7     'h2f
  data_out         integral        7     'h0
----------------------------------------------
UVM_INFO */verif/UVM/env/my_scoreboard.sv(39) @ 522500.000 ns: uvm_test_top.env.scb [my_scoreboard:main_phase] get one expect trans is:
----------------------------------------------
Name               Type            Size  Value
----------------------------------------------
uvm_sequence_item  my_transaction  -     @927
  ins_id           integral        5     'h12
  addr              integral        4     'h6  
  data_in          integral        7     'h2f
  data_out         integral        7     'h0
----------------------------------------------

可以看到,两个队列前后两次打印出来的数据是不相同的。这两组数据是我所期望的。
当环境运行到post_main_phase时,产生了如下的log。
post_main_phase中两个队列接收到的数据包

UVM_INFO */verif/UVM/env/my_scoreboard.sv(61) @ 537600.000 ns: uvm_test_top.env.scb [my_scoreboard:post_main_phase] actual_queue trans:
----------------------------------------------
Name               Type            Size  Value
----------------------------------------------
uvm_sequence_item  my_transaction  -     @931
  ins_id           integral        5     'h12
  addr              integral        4     'he  
  data_in          integral        7     'h21
  data_out         integral        7     'h0  
----------------------------------------------
----------------------------------------------
Name               Type            Size  Value
----------------------------------------------
uvm_sequence_item  my_transaction  -     @944
  ins_id           integral        5     'h12
  addr              integral        4     'h6  
  data_in          integral        7     'h2f
  data_out         integral        7     'h0
----------------------------------------------
UVM_INFO */verif/UVM/env/my_scoreboard.sv(66) @ 537600.000 ns: uvm_test_top.env.scb [my_scoreboard:post_main_phase] expect_queue trans:
----------------------------------------------
Name               Type            Size  Value
----------------------------------------------
uvm_sequence_item  my_transaction  -     @927
  ins_id           integral        5     'h12
  addr              integral        4     'h6  
  data_in          integral        7     'h2f
  data_out         integral        7     'h0
----------------------------------------------
----------------------------------------------
Name               Type            Size  Value
----------------------------------------------
uvm_sequence_item  my_transaction  -     @927
  ins_id           integral        5     'h12
  addr              integral        4     'h6  
  data_in          integral        7     'h2f
  data_out         integral        7     'h0  
----------------------------------------------


可以看到,在post_main_phase开始时,actual_queue  中的两个数据包和main_phase是一样的,前后是不同的数据。但是expect_queue 队列中的两个数据包是一样的,且都是main_phase中的第二个数据包。
我试过将sequence的数量增加,发现expect_queue中的数据包永远都是最后一次的数据
我的疑问是,相同的定义和处理,为什么actual_queue  和expect_queue  在跨phase时,会出现不一样的情况?








发表于 2024-9-2 17:53:17 | 显示全部楼层
按理说跨phase对数据应该没有影响,建议增加打印信息。例如将你40,48行的打印换成打印当前队列中所有的元素(foreach(expect_queue[k]) expect_queue[k].print()),在53行也打印exp_queue和act_queue所有元素;另外还有没有其他操作了这两个队列的代码?
此外我觉得scoreboard的比对放在run_phase中,每收到一组就比对一组是不是更合适?避免main_phase之外transaction过来,没有比对
 楼主| 发表于 2024-9-4 14:01:37 | 显示全部楼层


tcz226 发表于 2024-9-2 17:53
按理说跨phase对数据应该没有影响,建议增加打印信息。例如将你40,48行的打印换成打印当前队列中所有的元素 ...


谢谢你的解答。 根据你的思路,我修改了一下代码,但仍是出现了问题。
1。根据你的建议,我更换了main_phase时打印队列的方式,发现expec_queue队列第一次打印是一个正确的数据包A,第二次打印得到的两个数据包就变成了B、B,这个后续我再追查一下这条数据通路;
2。我对两个队列都增加了 local 和 protected属性,确保外部不会对这两个队列做处理,但问题仍然存在。
3。我尝试在run_phase比对数据,但是工程会卡死,具体代码如下:




  1. 113 task  my_scoreboard::run_phase(uvm_phase phase);
  2.     114     my_transaction actual_trans_tmp;
  3.     115     my_transaction expect_trans_tmp;
  4.     116
  5.     117     `uvm_info("my_scoreboard::run_phase", "", UVM_LOW);
  6.     118         
  7.     119     while(1) begin
  8.     120     `uvm_info("my_scoreboard::run_phase", $sformatf("expect_queue.size = %0d", this.expect_queue.size), UVM_LOW);
  9.     121     if((expect_queue.size() > 0)  && (actual_queue.size() > 0) ) begin
  10.     122
  11.     123         actual_trans_tmp = actual_queue.pop_front();
  12.     124         expect_trans_tmp = expect_queue.pop_front();
  13.     125     
  14.     126         `uvm_info("my_scoreboard:run_phase", "actual_queue trans: ", UVM_LOW);
  15.     127         actual_trans_tmp.print;
  16.     128        `uvm_info("my_scoreboard:run_phase", "expect_queue trans: ", UVM_LOW);
  17.     129        expect_trans_tmp.print;
  18.     130         end
  19.     131     end
  20.     132
  21.     133 endtask



复制代码
运行时,程序卡死在120行,其他main_phase没法进入了。由于刚接触UVM没多久,这个行为我不太理解,run_phase不是应该和其他12个小的phase并行启动的吗?为什么加入run_phase之后没法运行main_phase了。 (我已经注释了post_main_phase)
发表于 2024-9-4 14:12:18 | 显示全部楼层


Wade_ 发表于 2024-9-4 14:01
谢谢你的解答。 根据你的思路,我修改了一下代码,但仍是出现了问题。
1。根据你的建议,我更换了main_ph ...


卡死是这个循环的问题。当运行到120行,expect_queue与actual_queue均没有内容时,121-131行不会执行,然后立即开始下一次循环,再运行120行。这个叫零延时循环
发表于 2024-9-4 14:20:18 | 显示全部楼层
本帖最后由 tcz226 于 2024-9-4 14:21 编辑

其实我的意思是这么写run_phase:
方法1
fork
    while (1) begin
                exp_port.get(get_expect);
                expect_queue.push_back(get_expect);
    end
    while(1) begin
                act_port.get(get_actual);
                actual_queue.push_back(get_actual);
        end
        while(1) begin
                wait((expect_queue.size()!=0)&&(actual_queue.size()!=0));
                //比较expect_queue.pop_front与actual_queue.pop_front
        end
join
方法2
while(1) begin
    exp_port.get(get_expect);
    act_port.get(get_actual);
    //比较get_expect与get_actual
end
 楼主| 发表于 2024-9-4 14:52:22 | 显示全部楼层


tcz226 发表于 2024-9-4 14:20
其实我的意思是这么写run_phase:
方法1
fork


按照你的建议,修改了run_phase,问题已经解决了,数据一个个读出来是没问题。 非常感谢你的解答。
发表于 2024-9-16 09:09:00 | 显示全部楼层
本帖最后由 飞翔的马甲 于 2024-9-16 09:11 编辑

参考这两个帖子:
https://bbs.eetop.cn/thread-862746-1-1.html
https://bbs.eetop.cn/thread-975928-1-1.html

大概率就是这个坑。

问题不是出在你的scoreboard里面,而是你的RM里面(往scoreboard的expect队列里put数据的地方),句柄没有重新new,导致你队里里面的“多个“句柄实际上指向的是同一个对象,后面的数据把前面的数据给改了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-18 17:49 , Processed in 0.019192 second(s), 6 queries , Gzip On, Redis On.

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