模拟器不关心端口方向。仿真工具总是使模块层次结构变得平坦,重要的是它们可以将两个端口信号连接在一起。它们不检查数据流是否实际沿指定方向流动。遗憾的是,标准所要求的内容以及工具中实现的内容并不总是匹配。
有时,用户将拥有在一个工具中“工作”但在另一个工具中没有更强错误检查的代码。用户发现更容易让他们的工具供应商删除错误检查,而不是必须返回并修复他们的代码。一些大多数模拟器已删除任何检查以强制执行端口方向。
关于不声明在输出端口中使用的变量数据类型的规则大部分保持不变,但许多工具允许常量连接到输入端口。
有区别 output 和 inout 端口:
output
inout
你不能读写 inout 同时端口,因此保持 'Z 阅读
'Z
inout 港口可以 的 决不 强> 属于类型 reg 。它必须是 wire 类型。
reg
wire
应该有一个信号决定给定的端口是否为 input 要么 output 。
input
在这个模块中,你必须有一个 w_r 信号功能如下:
w_r
// w_r = 1 => output port // w_r = 0 => input port input w_r; inout cnt; reg write_cnt; reg read_cnt; // wire read_cnt; assign cnt = w_r ? write_cnt : 1'bz; // driving logic for cnt // inside some always block read_cnt <= cnt; write_cnt <= some_data;
自从 inout 信号是有线的,它必须由连续的赋值语句驱动。
参考这部分:
那么inout和输出端口可以在Verilog中互换使用吗?
答案是,它是 的 不鼓励 强> 使用它们 互换 。由于对于输出端口,您可以使用 reg 单独打字。
从综合的角度来看, inout 港口可以有 的 三国司机或多路人 强> 如下所示:(请注意,对于我不确定的综合工具,此结果可能会有所不同。):
有关更多信息,请参阅 双向端口分配 和 双向I / O引脚 论坛问题。
在Verilog中,端口方向基本上是建议性的,并且在SystemVerilog中没有改变。这是一个历史问题,与Verilog XL(第一个Verilog模拟器)端口崩溃的方式有关;基本上,一切都是进不过的。当'95 LRM被写入时,这个现有的行为基本上被记录下来。在1364-2005中,这出现在12.3.8中
声明为输入(输出)但用作输出(输入)或输出的端口可能会被强制转换为输入。如果不 强迫进入,必须发出警告。
在实践中,一切都最终成为一个 inout ,你可能会或可能不会收到警告。所以,你可以在模拟器中做很多事情,但是linter或者合成器应该为你拾取任何逻辑连接错误(如果它没有,它就没用了)。以下各节还有其他具体的非指导性规则 - input 和 inout 港口必须是 net 类型,等等。
net