天天看点

vivado综合过程中的multi-driven net警告

今天在调试过程中发现FPGA代码运行与预期不一致,原以为会是时序问题,后来留心看了一下综合后的warning,看到了多重驱动的警告,

Critical Warning : [Synth 8-3352] multi-driven net <signal_name> with 1st driver pin’<pin_name1>’ [xxx.vhd.3]

没想到vivado竟然会在多重驱动的情况下完成综合、布局布线。

解决过程

  • 初步排查代码,没发现什么异样;
  • 通过RTL分析工具,在原理图上观察特定信号的上下游连接情况,发现信号被优化掉了,添加keep属性后依然无法看到该信号的下游连接情况;
  • 无语之下,逐步注释掉代码块,观察综合情况,定位到了问题。

问题分析

一般情况下,多重驱动出现于在多个process块(always块)中对同一信号进行赋值,但在我碰到的问题中,vivado提示我的某个模块的输出(暂假定是A和B)存在多重驱动,该模块单独综合未提示多重驱动警告,在顶层模块中,对A和B仅仅使用并未进行赋值。排查后发现出现下述情况,

test(7 downto 0)  <= A(7 downto 0);
test(15 downto 8) <= B(7 downto 0);

test(15 downto 0) <= (others=>'0');
           

亦即实际上不是信号A和B存在多重驱动,而是被A(和/或)B赋值后的信号出现了多重驱动。由于test信号出现多重驱动,对A和B信号(上游信号)的综合也出现了影响,哪怕它们在其他地方是正确无误的使用,这两个信号也没有得到正确的综合结果,而是被优化掉了。考虑到默认情况下vivado综合时不会因多重驱动而停止运行,可以考虑将其警告提示设置成错误提示。

Xilinx官方AR

vivado综合过程中的multi-driven net警告
vivado综合过程中的multi-driven net警告
vivado综合过程中的multi-driven net警告