ET创芯网论坛(EETOP)

找回密码

  登录   注册  

搜索
汽车电子资料大全(下载奖励300信元)
查看: 2203|回复: 11

[求助] 关于sv中ref的使用问题

[复制链接]
发表于 2016-1-28 12:31:37 | 显示全部楼层 |阅读模式

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

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

x
大家好:
     在这里遇到了一个问题,望懂得朋友能帮帮忙。
     我用sv编写了对应设计的model进行验证,在sv的model中,我需要将taskA中的值传递到taskB中,于是我将所需传递的信号在taskA中定义为ref类型。
     当开始仿真时,出现了问题,例如:当taskA中的signal被置为1时,会引起taskB的对应操作,但在taskB中不会对signal进行赋值操作。但是之后即使在taskA中出现会置signal为0的条件时,signal也不会再置为0,而是保持1.这样的model就不正确。
   
     对于ref的const使用,我如果将taskA中的ref改为const ref,则会报 invalid use of const。
     我的task是在类中编写的。

     由于第一次用sv写model,很多都不理解,不知道上面的描述是否清晰。望赐教!
发表于 2016-1-28 13:17:34 | 显示全部楼层
你是想在taska中调用taskb 然后把taska中的某个参数传入taskb吗?如果是这样的话,在调用taskb时把传入的参数定义成ref就行了
回复 支持 反对

使用道具 举报

发表于 2016-1-30 07:40:42 | 显示全部楼层
这种情况,可以使用全局变量。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-31 12:47:44 | 显示全部楼层
谢谢您的回复
    我的需求是 taskA中的参数一旦发生变化,即刻传递到taskB中。编写的方式为:
  
  class abcd();
     bit a ;
    .....
    extern task run();
    extern task A(ref a);
    extern task B();
endclass  
  
task  abcd::run();
   forever
     begin
        @(negedge itfc.clk);
        fork
           task A(a);
           task B();
        join_none
     end
endtask

task abcd:: A(ref bit a);
.....
endtask

task abcd:: B();
....
endtask

大致是这么个构架,不知道这样是否正确。
现在的情况是:
1、当task A中的a发生变化后,会一直维持,不再改变,即使其控制条件发生变化,a也不再变化。
2、在task B中不会对a造成改变,只用于当作条件判断。
3、这里需求是实现数据的流水,因此会在每一个时钟周期发送一个激励,流水执行。
4、当在task A内部不将a定义为ref,则a的值会正常变化。

描述的可能不清楚,如果有碰到类似问题的朋友,请求赐教。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-31 12:53:51 | 显示全部楼层
回复 3# zw84611

谢谢您的回复
    我的需求是 taskA中的参数一旦发生变化,即刻传递到taskB中。编写的方式为:
  
  class abcd();
     bit a ;
    .....
    extern task run();
    extern task A(ref a);
    extern task B();
endclass  
  
task  abcd::run();
   forever
     begin
        @(negedge itfc.clk);
        fork
           task A(a);
           task B();
        join_none
     end
endtask

task abcd:: A(ref bit a);
.....
endtask

task abcd:: B();
....
endtask

大致是这么个构架,不知道这样是否正确。
现在的情况是:
1、当task A中的a发生变化后,会一直维持,不再改变,即使其控制条件发生变化,a也不再变化。
2、在task B中不会对a造成改变,只用于当作条件判断。
3、这里需求是实现数据的流水,因此会在每一个时钟周期发送一个激励,流水执行。
4、当在task A内部不将a定义为ref,则a的值会正常变化。

描述的可能不清楚,如果有碰到类似问题的朋友,请求赐教。
回复 支持 反对

使用道具 举报

发表于 2016-2-25 22:17:27 | 显示全部楼层
目前这种写法,taskA和taskB每拍都会被调用一次,如果task中又有延迟,会比较乱,会出现这次taskA还没执行完,下次的taskA又开始执行的情况,出现多驱动。
回复 支持 反对

使用道具 举报

发表于 2018-12-14 14:36:15 | 显示全部楼层
感觉一直不会用ref这种东西,糊里糊涂
回复 支持 反对

使用道具 举报

发表于 2019-1-26 16:15:42 | 显示全部楼层
回复 6# zw84611


   学习了
回复 支持 反对

使用道具 举报

发表于 2019-9-17 09:34:30 | 显示全部楼层
一脸茫然的进来,一脸茫然的出去
回复 支持 反对

使用道具 举报

发表于 2019-9-17 09:45:11 | 显示全部楼层
本帖最后由 精武英雄 于 2019-9-17 09:48 编辑

这里的意思是想每个时钟周期都在task A中对 class中的a变量进行赋值,然后task B中会监视class 的a变量。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

关于我们|联系我们|ET创芯网 ( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2019-10-24 13:06 , Processed in 0.073985 second(s), 13 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表