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信号是另一侧的使能。
请记住,双向信号或总线上仍必须有某种仲裁,这种仲裁可以理解正在发生的双向事务,因为双方不应同时启用其输出缓冲区。
我正在调试一些 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信号是另一侧的使能。
请记住,双向信号或总线上仍必须有某种仲裁,这种仲裁可以理解正在发生的双向事务,因为双方不应同时启用其输出缓冲区。