2012-04-21 2 views
0

내가 어떤의 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; 

이 내가이

-- 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; 

을 사용 나는 그것을 syntesis 수 있고, UART를 작동하지만, 왜 그들에게 모든 (현재 11 개의 UART)을 생성하기 위해 하나의 UART이다 경고 받았어?

IMHO rxCounter는 각 단일 값을 사용해야하지만 두 번째 비트가 각각 "no load"이라는 경고를 생성하는 이유는 무엇입니까?

나는이 그물이 사용되지 않고 제거 될 것이라는 것을 의미하는 어딘가에서 읽었다.
0에서 2^n-1까지 계산하려면 n 비트 이상 필요합니다.

+0

코드를 시뮬레이트 해 보셨습니까? – sonicwave

+0

@sonicwave - 아니요,하지만 syntesis가있을 수 있으며 예상대로 작동합니다. – jeb

답변

2

이 경고는 아무도 그물을 "듣고"있다는 것을 의미합니다.

합성 과정에서 제거 될 신호가 있으면 괜찮습니다. 경고는 오류가 아닙니다! 당신은 그 (것)들을 인식하고있을 필요가있다.

부분 코드에서 어떤 일이 일어나는지 평가할 수 없습니다.

  • rxCounter_cry이라는 신호가 있습니까?
  • ClockDivider의 데이터 유형은 무엇입니까?
  • dividerCounterBits의 값은 무엇입니까?
  • 다른 프로세스는 어떻게됩니까? 관련이없는 경우 해당 프로세스없이 합성을 실행하십시오. 이 관련성이있는 경우 인 경우이를 확인해야합니다. 그들을 제거, 그렇지 않으면

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

    이 이상 2500있다 :

+0

감사합니다. 일부 코드 조각을 추가했습니다. 'Clockdivider'는'std_logic_vector (15 downto 0)에 있고'dividerCounterBits'는 16입니다. 그리고'rxCounter_cry'는 존재하지 않습니다. 전체 프로젝트에 * _cry가 없습니다 – jeb

+0

_ 경고는 오류가 아니지만 사실입니다. 220 여기에 경고가 표시되며 관련 _other_ 경고가 표시되지 않습니다. 그리고 저는 C- 세계에서 출발하여 언제나 _Warning을 자유롭게하려고 노력하고 있습니다. 코드 – jeb

+0

나는 그 비트가 디자인의 실제 결과에 영향을 미치지 않는다고 생각합니다. 귀하의 발췌문에서'rxClockEn'이 실제로 어디서나 사용된다는 것은 확실하지 않습니다. 또한, 제 경험으로 볼 때 하드웨어 디자인 도구는 수많은 경고를 발생시킵니다. 노블 목표이지만, 제로 경고를 위해 노력하는 것이 현실적이지 않을 수 있습니다. 나는 이것을위한 좋은 해결책이 없다. – Philippe

2

격자 ngdbuild 내 메이크에서 그렙을 통해 내가 파이프 ngdbuild 출력 정확히 이러한 메시지를 제거하려면이하고있는 작업에 특히 스팸입니다 실제 문제에 집중하는 데 도움이됩니다.

두 번째 최악의 툴체인 스패머는 edif2ngd이며 명시 적 처리가없는 Verilog 매개 변수에 대해 불만을 토로합니다. 이 사람은 (이 중 300)는 2 개 개의 라인 메시지입니다 그래서 나는 그것을 제거 :

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

그냥 때때로 가산기 물건을 구현하는 것을주의해야합니다. 최상위 비트는 해당 가산기의 캐리 출력을 사용하지 않고 최하위 비트는 부호 입력을 사용하지 않습니다.그래서 당신은 같은 경고를 얻을 :

경고 - 합성 : 논리적 순 'clock_chain/dcmachine/count_171_add_4_1/S0'더로드 경고가 없습니다 - 합성 : 논리적 순 'clock_chain/dcmachine// CO는 count_171_add_4_19'더로드가 없습니다

아무 문제가 없습니다. 비트 19가 가장 높기 때문에 아무 곳에서나 수행 할 수 없으며 비트 1이 가장 낮기 때문에 아무 곳에서나 부호 비트를 얻지 못합니다. 그러나 가장 높은 값과 낮은 값 중 하나의 비트에서이 경고를 받으면 일반적으로 무언가 잘못되었음을 의미하지만 오류가 아니라는 것을 의미하므로 테스트 할 때 "작동"하지만 오류는 발생하지 않는 무언가를 작성합니다 케이스. 오류 사례로 시뮬레이션하면 일반적으로 바람직하지 않은 결과가 표시됩니다.