今天在調試過程中發現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
