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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3804|回复: 17

[求助] reference modle输出数据只有前面一部分

[复制链接]
发表于 2021-11-17 09:46:24 | 显示全部楼层 |阅读模式

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

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

x
1. 我在reference model里面写了一个函数,是将transaction里每两个128bit的数据进行运算,最后得到的结果表示为一个128bit数据(outut_tr.data[i/2]=my_function(input_tr.data[i],input_tr.data[i+1]))。但是reference model的输出数据只有前面一部分,比如说输入有10个数据,输出应该有5个数据,但是只收集到了3个数据,这是为什么呢?(我进行了打印查看,reference modle接收的输入数据是完整的)2. reference modle的输入数据通过blocking_get_port.get拿到,输出通过analysis_port.write()发出去
3.scoreboard接收到的reference modle输出的结果又更少了(scoreboard最后可能只收到了1个数据这样...)

reference_modle的main_phase代码如下:
task my_reference_model::main_phase(uvm_phase phase);
  my_transaction input_tr, output_tr;
  super.main_phase(phase);
  phase.raise_objection(this);
  while(1) begin
    port.get(input_tr);
    output_tr=new("output_tr");
    for(int i = 0;i < 16; i=i+2) begin
       output_tr.data[i/2]=my_function(input_tr.data[i],input_tr.data[i+1]);
       $fdisplay(log_file_01, "%h", output_tr.data[i/2]);
    end
  end
  $fclose(log_file_01);
endtask




 楼主| 发表于 2021-11-17 09:51:08 | 显示全部楼层
不好意思endtask前面有一句phase.drop_objection,写漏了。我现在怀疑是不是for循环的问题,或者main_phase时间不够的问题?但找不出具体是什么原因,不知道该怎么该
发表于 2021-11-17 10:30:23 来自手机 | 显示全部楼层
有些没看明白,1.你可以把fdisplay打印的log贴出来吗?2.fdisplay处是符合预期的?analysis port 对端收到的数据不符合预期?write函数在哪里调的?
 楼主| 发表于 2021-11-17 11:22:42 | 显示全部楼层


eaglezhang01 发表于 2021-11-17 10:30
有些没看明白,1.你可以把fdisplay打印的log贴出来吗?2.fdisplay处是符合预期的?analysis port 对端收到 ...


1.fdisplay 的log打印出来就是128bit的数据进行排列
image.png
2. 已经打印出来的数据都是符合预期的,但是后面少了好多数据。就是应该打印出来3000行,现在只打印了前面的1000行这样
3. write接收transaction放进队列里,然后以同样的方式for循环打印出来
发表于 2021-11-17 11:40:10 来自手机 | 显示全部楼层
fdisplay就不对,是port.get拿到的数据就不够吧,拿到了多少数据加个收到多少笔数据的counter打印出来看下就清楚了,另外是你这个代码不可能时间不够,而且你这个objection间是while语句,根本没法正常结束
发表于 2021-11-17 11:46:42 | 显示全部楼层
这种问题,定位的时候肯定是首先打印出input数据,先确定输入的数据对不对,再看其他的。另外,楼上说的对,你的while是个死循环,这个main_phase是结束不了的。
 楼主| 发表于 2021-11-17 12:15:27 | 显示全部楼层


eaglezhang01 发表于 2021-11-17 11:40
fdisplay就不对,是port.get拿到的数据就不够吧,拿到了多少数据加个收到多少笔数据的counter打印出来看下 ...


我前面问题里已经说啦,我打印看过的拿到的数据是正确的,而且是完整的数据。我在port.get(input_tr)后立马通过$fdisplay打印出来的。我这个是有很多个transaction的,所以我选择了while语句一直接收和处理数据,并把处理结果发送出去。main_phase确实是无法退出,该怎么解决呢?
发表于 2021-11-17 12:38:48 来自手机 | 显示全部楼层
看不出你这个代码有什么问题,也感觉不明白你的问题到底是啥,你说应该是3000,那你这个3000是怎么来的?你用我说的那个加个counter很好debug啊,phase的问题,一般被动接受数据的component不用objection机制,bench
发表于 2021-11-17 12:39:55 来自手机 | 显示全部楼层


eaglezhang01 发表于 2021-11-17 12:38
看不出你这个代码有什么问题,也感觉不明白你的问题到底是啥,你说应该是3000,那你这个3000是怎么来的?你 ...


bench的结束机制在其他地方实现
 楼主| 发表于 2021-11-17 13:06:06 | 显示全部楼层


eaglezhang01 发表于 2021-11-17 12:38
看不出你这个代码有什么问题,也感觉不明白你的问题到底是啥,你说应该是3000,那你这个3000是怎么来的?你 ...


是因为我的输入是6000个,2个128bit最后通过运算结果得到一个128bit,所以最后输出是3000个128bit的数据,但是我现在只得到了前面的1000个128bit的数据,后面的数据都没有
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-11-15 09:57 , Processed in 0.024985 second(s), 8 queries , Gzip On, Redis On.

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