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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 471|回复: 3

[求助] 如何动态的调用generate块中的task

[复制链接]
发表于 2023-8-7 14:40:59 | 显示全部楼层 |阅读模式

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

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

x
dut有若干数据port  有现成的data_check module 所以在top中用generate将data_check和dut连起来
这样module路径会变成  
   GEN_DC[?].u_data_check

此时test_case中以下的loop是非法的:

  for(int i=0;i<ND;i++)
    GEN_DC[i].u_data_check.check();

报错是Illegal operand for constant expression

请问有何改进方法


发表于 2023-8-8 18:51:28 | 显示全部楼层
test_case是uvm_test派生的吗?如果是的话,它要比top高一级,这里应该用top.GEN_DC.xxxx,是否这样的?
 楼主| 发表于 2023-8-11 10:07:42 | 显示全部楼层


gaurson 发表于 2023-8-8 18:51
test_case是uvm_test派生的吗?如果是的话,它要比top高一级,这里应该用top.GEN_DC.xxxx,是否这样的? ...


那个路径只是表示一下  只是单纯调用task的问题  用不用uvm没有影响  
编译的时候要求generate块的选择不能是变量  比如我如果把那个循环改成这种东西实际是可行的:




  1. for(int i;i<ND;i++)
  2.   case(i)
  3.     1:GEN_DC[1].u_data_check.check();
  4.     2:GEN_DC[2].u_data_check.check();
  5.     3:GEN_DC[3].u_data_check.check();
  6.      ...
  7.      ...
  8.    endcase</div>


复制代码



 楼主| 发表于 2023-8-11 11:32:03 | 显示全部楼层
目前的方法是把module中的task用class包起来




  1. package DC_pkg;
  2.   virtual class DC_tasks;
  3.     pure virtual task check();
  4.   endclass
  5. endpackage

  6. module data_check();

  7.   class dc_tasks extends DC_pkg::DC_tasks;
  8.     task check;
  9.         ... ... ...
  10.     endtask
  11.   endclass
  12.   
  13.   dc_tasks  tasks = new();
  14. endmodule



复制代码
然后在外面一层用generate倒一手再用




  1. DC_pkg::DC_tasks dc_tasks[ND];
  2. for(genvar i = 0;i<ND;i++) begin : GEN_DC
  3.   data_check u_data_check();
  4.   dc_tasks[i] = GEN_DC[i].u_data_check.tasks;
  5. end



复制代码
之后这么用




  1. for(int i = 0 ; i < ND; i++)
  2.   dc_tasks[i].check();


复制代码



您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-4-28 20:42 , Processed in 0.020770 second(s), 7 queries , Gzip On, Redis On.

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