Verilog:如何将一个输入分配给另一个输入?

Verilog: How to assign the an inout to another inout?

我正在尝试将来自 inout 端口的输入分配给用作输出的另一个 inout 端口。作为惯例,我必须将输入端口设置为高阻:

inout pin5;
inout pin20;
assign pin20 = 1'bz;
assign pin5 = pin20;

这导致 pin5pin20 都被路由到高阻抗。我知道为什么它在逻辑上会发生,但除了将 pin20 变成 input?

之外,我该如何绕过它

这是我的映射器输出的原理图。

您的代码中没有缓冲区。但是您显示的图片对我来说如下所示。 'test' 模块获得 2 个引脚并分配 'z's。如果你让它们挂起,它们将保持在这个值。在下面的示例中,'top' 模块模拟引脚上的 activity 并将 'val' 分配给它。现在 'pin2' 将遵循 'val' 的模式(如果启用)或保持在 'z'。 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

像这样连接两个 IO 引脚并不常见。如果只是为了模拟,您可以将引脚与 Verilog 原语 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 Port declarations 中有一个示例(SystemVerilog 的 IEEE1800-2012 § 23.2.2.1 Non 中的示例相同-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 样式更简单、更清晰。但是,我发现此端口别名功能的支持有限。这是一个有点模糊的特性,需求很少,因此与高需求特性相比,供应商实现它的优先级较低。也就是说,它可能适用于您的模拟器、合成器等。