综合后,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
总线以蓝色突出显示。其他一切都应该是无关紧要的,因为它不会立即涉及驱动逻辑。