天天看點

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警告