Error: (vsim-3053) D:/adder/adder_controltb.v(60): Illegal output or inout port connection (port 'P0_i').
最终解决与下面几个链接虽然无关,但看了之后还是得到了启发。
http://xjhit.spaces.eepw.com.cn/articles/article/item/73905
双向总线的端口的写法等等。
芯片外部引脚很多都使用inout类型的,为的是节省管腿。一般信号线用做总线等双向数据传输的时候就要用到INOUT类型了。就是一个端口同时做输入和输出。 inout在具体实现上一般用三态门来实现。三态门的第三个状态就是高阻'Z'。当inout端口不输出时,将三态门置高阻。这样信号就不会因为两端同时输出而出错了,更详细的内容可以搜索一下三态门tri-state的资料.
3 else,in RTL 对双向口,我们可以将其理解为2个分量:一个输入分量,一个输出分量。另外还需要一个控制信号控制输出分量何时输出。此时,我们就可以很容易地对双向端口建模。 例子: inout inout_pin; wire inout_pin; wire input_of_inout; assign input_of_inout = inout_pin; assign inout_pin = out_en ? output_of_inout : 高阻;//问题,如果out_en为假的话,inout_pin为高 //阻,那input_of_inout呢? //如果out_en为真,那么input_of_inout岂不 //是也等于inout_pin?怎么体现是输入呢? endmodule 可见,此时input_of_inout和output_of_inout就可以当作普通信号使用了。
4.仿真(o(∩_∩)o...哈哈,这才是我想要看的) 在仿真的时候,需要注意双向口的处理。如果是直接与另外一个模块的双向口连接,那么只要保证一个模块在输出的时候,另外一个模块没有输出(处于高阻态)就可以了。 很多初学者在写testbench进行仿真和验证的时候,被inout双向口难住了。仿真器老是提示错误不能进行。下面是我个人对inout端口写testbench仿真的一些总结,并举例进行说明。在这里先要说明一下inout口在testbench中要定义为wire型变量。 先假设有一源代码为: module xx(data_inout , ........); inout data_inout; ........................ assign data_inout=(! link)?datareg:1'bz; endmodule 方法一:使用相反控制信号inout口,等于两个模块之间用inout双向口互连。这种方法要注意assign 语句只能放在initial和always块内。 module test(); wire data_inout; reg data_reg; reg link; initial begin .......... end assign data_inout=link?data_reg:1'bz; endmodule 方法二:使用force和release语句,但这种方法不能准确反映双向端口的信号变化,但这种方法可以反在块内。 module test(); wire data_inout; reg data_reg; reg link; #xx; //延时 force data_inout=1'bx; //强制作为输入端口 ............... #xx; release data_inout; //释放输入端口 endmodule
仿真 很多读者反映仿真双向端口的时候遇到困难,这里介绍一下双向端口的仿真方法。一个典型的双向端口如图1所示。 |