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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

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

[求助] 请问如何在system verilog 的class里面实现带高阻态的双向I/O???

[复制链接]
发表于 2013-5-29 14:18:10 | 显示全部楼层 |阅读模式

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

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

x
我在一个类里面有个总线,所以必须是双向的I/O:inout DATA;
当内部没有数据的时候,需要输出高组态:

DATA = D ? 1'bz : D;  //D为内部的寄存器变量

如果我在类里面,有个 virtual interface: 里面包含了DATA这个端口,由于inout的port必须声明
为wire,不能是logic,或者reg。这样就没办法在task里面实现上面的语句了,比如:

task do();
    forever
       @D
            DATA = D ? 1'bz : D;  //DATA 必须为reg,或者logic,但是inout必须为wire,矛盾!!!
endtask

有没有什么别的好办法可以实现上面的赋值语句呢????
谢谢啊~
 楼主| 发表于 2013-5-29 14:28:42 | 显示全部楼层
也就是说,有一段类似于组合逻辑的东西要加到inout port 上,在class里面怎么实现呢?
或者在别地方怎么实现?
发表于 2013-5-29 14:38:10 | 显示全部楼层
在interface中就把双向的信号映射成无双向的信号,其他的task中就能用modport B映射完的这些名字
wire a1;
wire d1;

logic a1_out;
logic d1_in;
logic d1_out;
logic d1_ctr;

assign d1=(d1_ctr)? 1'bz : d1_out;
assign d1_in = d1;
assign a1 = a1_out;

modport A(output a1,inout d1);
modport B(output a1_out,input d1_in,output d1_out,output d1_ctr);
 楼主| 发表于 2013-5-29 15:01:58 | 显示全部楼层
回复 3# afrapei


   在interface里面用assign,会不会不太好呢?
发表于 2013-5-29 15:25:23 | 显示全部楼层
怕黏合逻辑?如果非要坚持这个好习惯的话,你可以将代码拆分了,assign不在interface中实现,只写modportA,modportB然后在其他class中assign,《systemverilog for design》有你要的答案,论坛上有下载。
 楼主| 发表于 2013-5-29 15:38:34 | 显示全部楼层
回复 5# afrapei


   class 可以用assign?
 楼主| 发表于 2013-5-29 15:53:37 | 显示全部楼层
回复 5# afrapei


  其实我是在搭建testbench,不是design。所以希望找到符合一般testbench的做法。因为感觉这个问题应该是比较常见的(双向IO+high-z)。感觉如果做连个modport好像
反而有点不太方便(如果端口很多的话)。
不知道这是不是通用的解决方法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-28 16:26 , Processed in 0.038303 second(s), 10 queries , Gzip On, Redis On.

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