请问如何在system verilog 的class里面实现带高阻态的双向I/O?
时间:10-02
整理:3721RD
点击:
我在一个类里面有个总线,所以必须是双向的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
有没有什么别的好办法可以实现上面的赋值语句呢?
谢谢啊~
当内部没有数据的时候,需要输出高组态:
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
有没有什么别的好办法可以实现上面的赋值语句呢?
谢谢啊~
也就是说,有一段类似于组合逻辑的东西要加到inout port 上,在class里面怎么实现呢?
或者在别地方怎么实现?
在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);
在interface里面用assign,会不会不太好呢?
怕黏合逻辑?如果非要坚持这个好习惯的话,你可以将代码拆分了,assign不在interface中实现,只写modportA,modportB然后在其他class中assign,《systemverilog for design》有你要的答案,论坛上有下载。
class 可以用assign?
其实我是在搭建testbench,不是design。所以希望找到符合一般testbench的做法。因为感觉这个问题应该是比较常见的(双向IO+high-z)。感觉如果做连个modport好像
反而有点不太方便(如果端口很多的话)。
不知道这是不是通用的解决方法。