Verilog:了解双向信号上的多个驱动程序

Verilog: Understanding multiple driver on bidirectional signal

我正在调试一些 Verilog 代码,但我在理解具有多个驱动程序的双向信号时遇到了一些困难:

verilog 代码如下所示:

inout a;

assign a = b ? c : 1'bz
       a=Stx b=St1  c=St0
assign (weak0, weak1) a = d ? 1'bz : (e ? 1'b0 : (f ? 1'b1 : 1'bz));
       a=Stx  d=St0 e=St0 f=St0

信号c是需要传输到a(输出板)的实际数据。当我 运行 使用商业模拟器进行模拟时,我得到了上面注释的值。我不明白为什么 a 在整个模拟过程中最终都是 X。 b 正在切换,c 也在切换。 d/e/f 始终为 0。第二条语句使用弱 pull-up/pull-down 但通过设置它 d/e/f=0,它应该驱动 Z。所以另一个语句应该 win 出来?

使用上面的代码,您实际上是在创建一个双向缓冲区,它是一个从 IO pad 到内部信号的输入缓冲区,以及一个从内部信号到 IO pad 的输出缓冲区,由 启用。 b信号是一侧的使能,d信号是另一侧的使能。

请记住,双向信号或总线上仍必须有某种仲裁,这种仲裁可以理解正在发生的双向事务,因为双方不应同时启用其输出缓冲区。