Error: driven via a port connection, is multiply driven
Error: driven via a port connection, is multiply driven
我能够在 modelsim 中构建代码,但是当模拟低于错误时:
addr_x, driven via port connection, is multiply driven (44) Line :49
addr_f, driven via port connection, is multiply driven (46) Line :49
s_ready_x, driven via port connection, is multiply driven (44) Line :49
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));
它只是将问题传播到顶层模块,但给出了驱动程序的正确位置。
问题是,ctrlpathf
和 ctrlpatho
都使用 output
端口驱动相同的信号。经验法则是:
you cannot drive the same variable with multiple drivers.
System verilog 只是将此要求添加到标准中,并针对特定的 system verilog 块进行检查。
修复它
你需要检查你的程序,以防你犯了一个错误。
verilog 允许您乘以驱动器 net
类型并为结果定义规则。如果你真的想要多个驱动程序,你需要将这些端口声明为 wires
或类似的并更改代码以反映它。它们可以通过 assign
语句进行多重驱动。
我能够在 modelsim 中构建代码,但是当模拟低于错误时:
addr_x, driven via port connection, is multiply driven (44) Line :49
addr_f, driven via port connection, is multiply driven (46) Line :49
s_ready_x, driven via port connection, is multiply driven (44) Line :49
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));
它只是将问题传播到顶层模块,但给出了驱动程序的正确位置。
问题是,ctrlpathf
和 ctrlpatho
都使用 output
端口驱动相同的信号。经验法则是:
you cannot drive the same variable with multiple drivers.
System verilog 只是将此要求添加到标准中,并针对特定的 system verilog 块进行检查。
修复它
你需要检查你的程序,以防你犯了一个错误。
verilog 允许您乘以驱动器
net
类型并为结果定义规则。如果你真的想要多个驱动程序,你需要将这些端口声明为wires
或类似的并更改代码以反映它。它们可以通过assign
语句进行多重驱动。