我正在尝试将输入从inout端口分配给另一个用作输出的inout端口。通常的做法是,我必须将输入端口设置为High-Z:
inout pin5;inout pin20;assign pin20 = 1’bz;…
像这样连接两个IO引脚并不常见。如果它只是用于模拟,您可以使用Verilog原语连接引脚 tran 。
tran
module linked_io ( inout io_A, io_B, input i, c ); tran link(io_A, io_B); assign io_A = c ? i : 1'bz; endmodule
tran 通常不被合成器识别。一些供应商有一个功能相当的自定义宏 tran 特别适用于自己的工具集。如果存在这样的宏,您需要检查用户手册或直接询问供应商。
另一种方法是使用下面的示例选择性地将端口别名到同一网络。这是在Verilog-2001中添加的,其中的例子是IEEE1364-2001 12.3.3 港口申报 (SystemVerilog中的相同示例 IEEE1800-2012 23.2.2.1 非ANSI样式的端口声明 )。
module linked_io ( .io_A(io), .io_B(io), i, c ); inout io; input i, c; assign io = c ? i : 1'bz; endmodule
这是我使用非ANSI风格的唯一条件; ANSI风格更简单,更清洁。但是,我发现此端口别名功能的支持有限。这是一个有点模糊的功能,需求很少,因此供应商实施与高需求功能的优先级较低。也就是说,它可能适用于您的模拟器,合成器等。
代码中没有缓冲区。但是你展示的图片对我来说就像以下一样。 'test'模块获得2个引脚并分配'z'。如果你把它们挂起来,就会保持这个值。在下面的示例中,'top'模块模拟引脚上的活动并为其指定'val'。现在'pin2'将遵循'val'模式(如果启用)或保持'z'。该 val 实际上是你一直在讨论的缓冲区。
val
module top(); reg val, en; wire pin1, pin2; // do something with val and en test t(pin1, pin2); assign pin2 = en ? 1'bz : val; endmodule // top module test(inout pin1, pin2); assign pin1 = 1'bz; assign pin2 = pin1; endmodule // test