Предупреждение "нет нагрузки", но я не понимаю, почему

Я получил эти предупреждения от Lattice Diamond для каждого экземпляра любого UART (в настоящее время 11)

WARNING - ngdbuild: logical net 'UartGenerator_0_Uart_i/Uart/rxCounter_cry_14' has no load
WARNING - ngdbuild: logical net 'UartGenerator_0_Uart_i/Uart/rxCounter_cry_0_COUT1_9_14' has no load
WARNING - ngdbuild: logical net 'UartGenerator_0_Uart_i/Uart/rxCounter_cry_12' has no load
WARNING - ngdbuild: logical net 'UartGenerator_0_Uart_i/Uart/rxCounter_cry_10' has no load
WARNING - ngdbuild: logical net 'UartGenerator_0_Uart_i/Uart/rxCounter_cry_8' has no load
WARNING - ngdbuild: logical net 'UartGenerator_0_Uart_i/Uart/rxCounter_cry_6' has no load
WARNING - ngdbuild: logical net 'UartGenerator_0_Uart_i/Uart/rxCounter_cry_4' has no load
WARNING - ngdbuild: logical net 'UartGenerator_0_Uart_i/Uart/rxCounter_cry_2' has no load
WARNING - ngdbuild: logical net 'UartGenerator_0_Uart_i/Uart/rxCounter_cry_0' has no load

VHDL-код есть

entity UART is 
    generic (
        dividerCounterBits: integer := 16
    );
    port (
        Clk         : in  std_logic;                        -- Clock signal
        Reset       : in  std_logic;                        -- Reset input
        ClockDivider: in  std_logic_vector(15 downto 0);

        ParityMode  : in std_logic_vector(1 downto 0);      -- b00=No, b01=Even, b10=Odd, b11=UserBit
    [...]


architecture Behaviour of UART is
    constant oversampleExponent : integer := 4;

    subtype TxCounterType is integer range 0 to (2**(dividerCounterBits+oversampleExponent))-1;
    subtype RxCounterType is integer range 0 to (2**dividerCounterBits)-1;
    signal rxCounter: RxCounterType;
    signal txCounter: TxCounterType;
    signal rxClockEn: std_logic; -- clock enable signal for receiver
    signal txClockEn: std_logic; -- clock enable signal for transmitter
begin
    rxClockdivider:process (Clk, Reset)
    begin
        if Reset='1' then
        rxCounter <= 0;
        rxClockEn <= '0';
    elsif Rising_Edge(Clk) then
        -- RX counter (oversampled)
        if rxCounter = 0 then
            rxClockEn <= '1';
            rxCounter <= to_integer(unsigned(ClockDivider));
        else
            rxClockEn <= '0';
            rxCounter <= rxCounter - 1;
        end if;
    end if;
    end process;

    txClockDivider: process (Clk, Reset)
    [...]

    rx: entity work.RxUnit
    generic map (oversampleFactor=>2**oversampleExponent)
    port map (Clk=>Clk, Reset=>Reset, ClockEnable=>rxClockEn, ParityMode=>ParityMode,
            ReadA=>ReadA, DataO=>DataO, RxD=>RxD, RxAv=>RxAv, ParityBit=>ParityBit,
            debugout=>debugout
             );

end Behaviour;

Это один Uart, чтобы создать их всех (в настоящее время 11 UART), я использую это

-- UARTs

    UartGenerator: For i IN 0 to uarts-1 generate
    begin
        Uart_i : entity work.UartBusInterface 
            port map (Clk=>r_qclk, Reset=>r_reset, 
                cs=>uartChipSelect(i), nWriteStrobe=>wr_strobe, nReadStrobe=>rd_strobe,
                address=>AdrBus(1 downto 0), Databus=>DataBus,
                TxD=>TxD_PAD_O(i), RxD=>RxD_PAD_I(i),
                txInterrupt=>TxIRQ(i), rxInterrupt=>RxIRQ(i), debugout=>rxdebug(i));

        uartChipSelect(i) <= '1' when to_integer(unsigned(adrbus(5 downto 2)))=i+4 and r_cs0='0' else '0';
    end generate;

Я могу сделать это, и уарты работают, но почему я получил предупреждение?

ИМХО, rxCounter должен использовать каждое возможное значение, но почему каждый второй бит создает предупреждение "нет нагрузки"?

Я где-то читал, что это означает, что эти сети не используются и будут удалены.
Но чтобы считать от 0 до 2^n-1, мне нужно не менее n-бит.

3 ответа

Решение

Это предупреждение означает, что никто не "слушает" эти сети.

Это нормально, чтобы иметь сигналы, которые будут удалены в синтезе. Предупреждения не являются ошибками! Вам просто нужно знать о них.

Мы не можем оценить, что происходит по вашему частичному коду.

  • Есть ли сигнал с именем rxCounter_cry?
  • Что такое тип данных ClockDivider?
  • Какова стоимость dividerCounterBits?
  • Что происходит в другом процессе? Если это не имеет значения, пожалуйста, попробуйте запустить ваш синтез без этого процесса. Если это актуально, мы должны это увидеть.

Решетчатый ngdbuild особенно спам для выполняемой работы, я передаю вывод ngdbuild через grep в моем make-файле, чтобы удалить именно эти сообщения:

ngdbuild ... | grep -v "ngdbuild: logical net '.*' has no load"

В противном случае их более 2500, их устранение помогает сосредоточиться на реальных проблемах.

Второй наихудший спамер - edif2ngd жалуясь на параметры Verilog, для которых нет явной обработки. Это двухстрочное сообщение (более 300), поэтому я удаляю его:

edif2ngd ... | sed '/Unsupported property/{N;d;}'

Просто знайте, что иногда это реализует вещи с сумматорами. Бит самого высокого порядка не будет использовать вывод переноса этого сумматора, а бит самого низкого порядка не будет использовать вход знака. Таким образом, вы получаете предупреждение, как:

ПРЕДУПРЕЖДЕНИЕ - синтез: логическая сеть 'clock_chain/dcmachine/count_171_add_4_1/S0' не загружена ПРЕДУПРЕЖДЕНИЕ - синтез: логическая сеть 'clock_chain/dcmachine/count_171_add_4_19/CO' не загружена

Нет проблем, бит 19 - самый высокий, поэтому он никуда не переносится, а бит 1 - самый низкий, поэтому он нигде не получает знаковый бит. Однако, если вы получаете это предупреждение на любом из битов между старшим и младшим, это обычно означает, что что-то не так, но не ошибка, поэтому он создаст что-то, что "работает" при тестировании, но не в ошибке дело. Если вы смоделируете это с ошибками, это обычно будет показывать нежелательные результаты.

Другие вопросы по тегам