VHDL:Vivado 2016.4:多驱动网络上的实施失败

时间:2017-08-04 15:21:03

标签: vhdl synthesis vivado

综合后,Vivado 2016.4抱怨“多驱动网络”。但是,在试图找到错误时,我只是设法进一步证明设计没有问题,所以也许我对问题的理解是不正确的。

情况如下:

  • 考虑两个组成部分:lnx1_buffer; lnx1_datacentre
  • 这两个组件都有一个名为inout的{​​{1}}端口,它们通过这个端口在顶层组件中互连。
  • 两个组件也将两个控制信号作为输入:
    • databus
    • en_db_drive_from_pt

en_alu_int_db_drive按如下方式驱动其lnx1_buffer端口:

databus

buffer_inout.databus <= q when not (en_db_drive_from_pt or en_alu_int_db_drive) = '1' else (others => 'Z'); 按以下方式驾驶lnx1_datacentre

databus

显然,从逻辑上看,两个组件都在驱动总线时从来没有这种情况;控制信号逻辑的datacentre_inout.databus <= db_int when (en_db_drive_from_pt or en_alu_int_db_drive) = '1' else (others => 'Z'); 反转可以解决这个问题。此外,如下所示,合成器生成适当的not缓冲区。

尽管如此,设计还没有完全合成:

TRISTATE

...并且实现完全失败并显示以下消息

[Synth 8-3352] multi-driven net buffer_inout[databus][8] with 1st driver pin 'cpu0/datacentre0/i_61/O' ["/home/maxim/development/vhdl/xprojects/project_intro/project_intro.srcs/sources_1/new/lnx1_datacentre.vhd":9]
[Synth 8-3352] multi-driven net buffer_inout[databus][8] with 2nd driver pin 'cpu0/buf0/i_26/O' ["/home/maxim/development/vhdl/xprojects/project_intro/project_intro.srcs/sources_1/new/lnx1_buffer.vhd":8]
[Synth 8-3352] multi-driven net buffer_inout[databus][0] with 1st driver pin 'cpu0/datacentre0/i_53/O' ["/home/maxim/development/vhdl/xprojects/project_intro/project_intro.srcs/sources_1/new/lnx1_datacentre.vhd":9]
[Synth 8-3352] multi-driven net buffer_inout[databus][0] with 2nd driver pin 'cpu0/buf0/i_18/O' ["/home/maxim/development/vhdl/xprojects/project_intro/project_intro.srcs/sources_1/new/lnx1_buffer.vhd":8]
[Synth 8-3352] multi-driven net buffer_inout[databus][9] with 1st driver pin 'cpu0/datacentre0/i_62/O' ["/home/maxim/development/vhdl/xprojects/project_intro/project_intro.srcs/sources_1/new/lnx1_datacentre.vhd":9]

... [DRC 23-20] Rule violation (MDRV-1) Multiple Driver Nets - Net cpu0/datacentre0/datacentre_inout[databus][0] has multiple drivers: cpu0/buf0/buffer_inout[databus][0]_INST_0/O, cpu0/datacentre0/datacentre_inout[databus][0]_INST_0/O. [DRC 23-20] Rule violation (MDRV-1) Multiple Driver Nets - Net cpu0/datacentre0/datacentre_inout[databus][10] has multiple drivers: cpu0/buf0/buffer_inout[databus][10]_INST_0/O, cpu0/datacentre0/datacentre_inout[databus][10]_INST_0/O. [DRC 23-20] Rule violation (MDRV-1) Multiple Driver Nets - Net cpu0/datacentre0/datacentre_inout[databus][11] has multiple drivers: cpu0/buf0/buffer_inout[databus][11]_INST_0/O, cpu0/datacentre0/datacentre_inout[databus][11]_INST_0/O. [DRC 23-20] Rule violation (MDRV-1) Multiple Driver Nets - Net cpu0/datacentre0/datacentre_inout[databus][12] has multiple drivers: cpu0/buf0/buffer_inout[databus][12]_INST_0/O, cpu0/datacentre0/datacentre_inout[databus][12]_INST_0/O. [DRC 23-20] Rule violation (MDRV-1) Multiple Driver Nets - Net cpu0/datacentre0/datacentre_inout[databus][13] has multiple drivers: cpu0/buf0/buffer_inout[databus][13]_INST_0/O, cpu0/datacentre0/datacentre_inout[databus][13]_INST_0/O. ... 总线的每一位。

我绝对可以保证没有其他可能干预的逻辑。到目前为止,我发布的代码片段确实是与驱动端口相关的唯一信号,并且我检查了控制信号,并向我自己证明它们确实来自同一个源,并且它们没有连接。

我可以推测的另一个原因是由于门的切换时间,两个缓冲器都被启用的时刻很短,因此两个组件暂时驱动。如果是这种情况,我如何引入延迟来防止这种情况发生?

以下是RTL原理图实现的图像(如果它们有用)。控制信号和databus总线以蓝色突出显示。其他一切都应该是无关紧要的,因为它不会立即涉及驱动逻辑。

buffer:注意OR'd信号到达实现反转的多路复用器 enter image description here

数据中心(两个最左边的信号是控制信号): enter image description here

0 个答案:

没有答案