天天看點

【CPLD Verilog】WARNING - IO buffer missing for top level port

在編寫的一個監控風扇闆的TACH信号的程式中

module FanTachMonitor (
 input sys_clk
,input auxgood
,input [31:0] fan_count_num // fan_count_num * 20ns = fan_time
,input fan_tach
,output reg [15:0] fan_rps 
);
           

綜合之後報了一組warning

WARNING - IO buffer missing for top level port i_CPLD_FAN1_TACH0...logic will be discarded.

WARNING - IO buffer missing for top level port i_CPLD_FAN1_TACH1...logic will be discarded.

WARNING - IO buffer missing for top level port i_CPLD_FAN2_TACH0...logic will be discarded.

WARNING - IO buffer missing for top level port i_CPLD_FAN2_TACH1...logic will be discarded.

WARNING - IO buffer missing for top level port i_CPLD_FAN3_TACH0...logic will be discarded.

WARNING - IO buffer missing for top level port i_CPLD_FAN3_TACH1...logic will be discarded

從網上搜了一下這個warning,發現了一個案例是說這個warning是綜合器在綜合的時候将部分net優化掉了。通過RTL發現相關的net根本沒有連到任何子產品,實際上整個FanTachMonitor都沒有被綜合!

【CPLD Verilog】WARNING - IO buffer missing for top level port

相應的檢查FanTachMonitor的輸出端口,發現本應輸出給RAM子產品的信号,在RAM中隻是接了一個0的常數寄存器。

【CPLD Verilog】WARNING - IO buffer missing for top level port

回到程式中,檢查發現在頂層子產品存在這樣的一組語句:

wire [15:0] w_CPLD_FAN1_RPS0=16'b0; //mean round per second
wire [15:0] w_CPLD_FAN1_RPS1=16'b0;
wire [15:0] w_CPLD_FAN2_RPS0=16'b0;
wire [15:0] w_CPLD_FAN2_RPS1=16'b0;
wire [15:0] w_CPLD_FAN3_RPS0=16'b0;
wire [15:0] w_CPLD_FAN3_RPS1=16'b0;
           

猜測是否是這裡将wire型的變量的“賦初始值”的動作,導緻綜合器在綜合的時候認為這裡的wire型變量和常數寄存器相連,進而綜合器在優化時認為,FanTachMonitor這個子產品無法輸出任何東西(輸出的wire鎖死為常數),是以将整個FanTachMonitor給優化掉了。

将上面的代碼中的指派動作去掉後,RTL正确生成的該部分的電路,并且warning也消除了。

總結:

(1)wire型變量别亂賦初始值;

(2)綜合器有時候會優化掉一些子產品,但是這種情況會被認為是warning,而不是error,有可能出錯。

繼續閱讀