Verilog系列:【31】连input端口都输出信号了
在使用Verilog或者SystemVerilog进行数字设计时,如果设计者在设计模块的内部将数据赋值给该模块与外界交互的输入端口(input),那么仿真时将不会产生任何warning或者error,因为此时该input端口被视为inout端口。
在Verilog标准(IEEE Std 1362-200112.3.8 Connecting dissimilar ports)中,描述:当驱动一个值到一个相反方向的端口时(例如,写input,读output等),并且该端口两端传递数据使用了net类型,则仿真时会出现端口方向强制转换为inout,这主要是因为net类型允许被多驱动,并且部分仿真器可能会对于这种转换不产生任何信息,从而极易导致仿真结果异常。
这种类型的转换在某些情况下也比较接近实际,因为实际电路实现的时候port是不存在的,所有的信号都是通过net连接传输,所以这种转换方式允许仿真工具自动将input/output转换为output/input类型。当时如果使用不当也会出现一些问题,如下代码所示:
在这个例子中,dat_out(output)被复制给了dat_in(input),从而可能导致仿真结果在后续电路的传输中出现问题,但是仿真工具在仿真时对此将会默不作声,悄悄地将端口类型转换为inout,导致实际数据传输方向与期望数据传输方向相反,如下图所示:
而仅从单个模块的仿真结果也很难发现问题,仿真波形如下:
【解决方法】
为了避免类似情况出现,在进行设计时可将端口类型声明为(var类型,其中有reg、logic、uwire等),此时当仿真工具进行仿真时出现上述情况时,仿真工具将会报告错误。其实在Verilog-2005中可以讲input显示声明为uwire,该类型只允许一个驱动出现在net上,即只允许一个方向的驱动。
建议在设计中将所有module的input和output端口都定义为logic类型,除非端口为inout类型(此时的端口允许多个方向的驱动)。