Error: driven via a port connection, is multiply driven

Error: driven via a port connection, is multiply driven

我能够在 modelsim 中构建代码,但是当模拟低于错误时:

  1. addr_x, driven via port connection, is multiply driven (44) Line :49
  2. addr_f, driven via port connection, is multiply driven (46) Line :49
  3. s_ready_x, driven via port connection, is multiply driven (44) Line :49
  4. s_ready_f, driven via port connection, is multiply driven (46) Line :49

我该如何解决这个问题? (系统验证)

没有简单的*解决方法:您必须更改设计。您甚至可能不得不 "back to the drawing board" 并从根本上改变您的设计。

在每个 ctrlpath.. 模块中,您输出一个地址。因此,您可以从不同的输出驱动同一个网络。您必须以某种方式区分哪些是您真正需要的。因此,您需要添加一个多路复用器 'knows' 来选择。

"multiple driven" 错误是 Stack Overflow 和 Electrical engineering 上反复出现的问题。您所做的是将多个输出端口连接在一起。在电气工程中,我们称之为 'shorting outputs together'。术语 shorting 很重要,因为它实际上是短路。这是等效电路:

有些输出会很高,有些会很低。高电平将尝试将输出驱动为高电平,从而打开从 VCC 到输出引脚的电流路径。那些低的将尝试将输出拉低。它们打开一条从输出到地的电流路径。它们一起在您的 VCC 和地之间形成短路。

*不要以为你可以用三态驱动轻松解决这个问题。理论上这似乎是可能的,实际上你真的、真的不想要那个。

这是来自 VCS 编译的消息之一:

错误-[ICSD]驱动程序组合非法 design.sv, 38 结构驱动程序的非法组合。 变量“s_ready_x”由多个结构驱动程序驱动。 该变量声明于 "design.sv", 38: 逻辑s_ready_x; 第一个驱动在“design.sv”, 50: ctrlpatho c( .clk (clk), .reset (重置), .wr_done_f (wr_done_f), .wr_done_x (wr_done_x), .addr_x (addr_x), .addr_f (addr_f), .m_valid_y (m_valid_y), .c ... 第二个驱动在“design.sv”, 45: ctrlpathx x( .clk (clk), .reset (重置), .s_ready_x (s_ready_x), .addr_x (addr_x), .wr_done_x (wr_done_x), .wr_en_x (wr_en_x), .s_valid_x (s_valid_x));

它只是将问题传播到顶层模块,但给出了驱动程序的正确位置。

问题是,ctrlpathfctrlpatho 都使用 output 端口驱动相同的信号。经验法则是:

you cannot drive the same variable with multiple drivers.

System verilog 只是将此要求添加到标准中,并针对特定的 system verilog 块进行检查。

修复它

  1. 你需要检查你的程序,以防你犯了一个错误。

  2. verilog 允许您乘以驱动器 net 类型并为结果定义规则。如果你真的想要多个驱动程序,你需要将这些端口声明为 wires 或类似的并更改代码以反映它。它们可以通过 assign 语句进行多重驱动。