합성 중 래치를 피하는 방법


9

VHDL을 사용하여 조합 논리 블록을 설계하고 싶지만 때로는 합성 결과에 의도하지 않은 래치가 포함되어 있습니다.

신시사이저가 래치를 유추하지 않도록하려면 어떤 코딩 지침을 따라야합니까?

예 : 작은 코드 세그먼트에서 if-else 문을 사용해야합니까?


내가 요청한 것을 얻을 수 있다면 알려주십시오.

나는 당신이 당신의 모범에서 무엇을 의미하는지 확신하지 못했습니다. 리워드가 원래 의도와 일치하는지 확인하십시오.
— W5VO

@fatai는 이미 meta.stackexchange.com에서 사용 가능한 계정을 삭제하는 구체적인 방법이 있다고 언급했습니다. 마지막으로 표시된 질문에 연결했습니다. 현장의 중재자는이 힘을 가지고 있지 않습니다. 개발자 팀에 문의해야합니다.
— Kortuk

답변:


13

래치를 피하려면 가능한 모든 코드 분기에 모든 출력을 할당해야합니다.

예를 들어

if a = '1' then
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

첫 번째 조건에서 b (1)의 값이 지정되지 않았기 때문에 래치를 생성하므로 컴파일러는 b (1)의 이전 값을 유지하기로 결정했습니다. 래치를 생성하지 않는 이것을 작성하는 한 가지 방법은 다음과 같습니다.

if a = '1' then
   b <= prev_b;
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

...

if rising_edge (clk)
    prev_b <= b;
end if;

여기서 b는 이전 값을 유지해야하며 b (0)을 새 값으로 덮어 써야합니다.

또 다른 방법은 @TomiJ의 답변과 같이 ba 기본값을 제공하는 것입니다.

래치를 받고있는 코드를 게시하면 구체적인 이유를 찾는 데 도움이 될 수 있습니다.


나는 b <= b여전히 신호 상태를 보존해야하기 때문에 당신의 접근 방식이 래치를 피할 것이라고 생각하지 않습니다 .
— Tomi Junnila

당신이 옳을지도 모른다. 나는 클럭킹 로직에 너무 익숙하다. 편집하겠습니다.
— fbo

6

조합 논리에 대해 프로세스를 사용하는 경우 (이 이유 때문에 프로세스를 반대하는 것이 좋습니다) 프로세스를 통한 모든 경로가 프로세스가 구동하는 모든 신호에 무언가를 할당하는지 확인하십시오. 프로세스가 실행 된 "마지막 시간"의 출력에 의존하는 출력은 없습니다.

그렇지 않으면 다음에 프로세스가 예약 될 때 마지막에 새로운 값을 얻지 못한 신호 값을 유지해야하기 때문에 래치를 유추합니다.

순전히 조합 논리를 연속 할당으로 유지하고 클럭 논리에 프로세스를 사용하는 것을 선호합니다. 그러면 래치가 발생하지 않습니다.


5

래치를 피하기위한 4 가지 규칙 :

  • 쓴 신호를 읽지 마십시오.
  • 올바른 감도 목록을 작성하십시오 (읽는 모든 신호는 감도 목록에 있어야합니다)
  • 쓰기 할 모든 신호가 모든 경로에 할당되어 있는지 확인하십시오. (예 : if-else 문의 각 분기에서)
  • 변수를 사용하는 프로세스의 경우 변수를 읽기 전에 모든 변수가 기본값으로 초기화되어 있는지 확인하십시오 (다른 변수 또는 signal에서).

또한 여러 조합 프로세스가있는 경우 루프를 작성하지 않아야합니다.

@TomiJ의 답변 스타일과 같은 여러 코딩 스타일이 이러한 규칙을 준수하는 데 도움이 될 수 있습니다. @Martin Thompson이 지적했듯이 조합 논리를 함께 피하는 것이 좋습니다. 대신 클럭킹 된 프로세스에 모든 것을 넣습니다.


+1 멋진 규칙 세트. 합성과 시뮬레이션 사이의 일관된 결과를 보장하기 위해 규칙 # 2 (민감도 목록에 대한)가 실제로 중요하지만 래치의 추론에 대해서는 실제로 차이를 만들지 않는다는 데 동의하십니까?
— rick

@rick AFAIK에서, 합성 도구가 불완전한 감도 목록으로 무엇을하는지 보장 할 수 는 없습니다 . VHDL 합성 (1076.6-1999)에 대한 IEEE 표준은 다음과 같이 명시하고 있습니다. "프로세스 민감도 목록에는 프로세스 설명 내에서 읽은 모든 신호가 포함되어야합니다. 불완전한 감도 목록이있는 프로세스는 지원되지 않습니다." 즉, 특정 합성 도구 (아마도 모두?) 가 불완전한 감도 목록을 허용 하지만 단순히 감도 목록을 모두 무시 한다는 것을 알고 있습니다. 더 엄격한 IEEE 표준 대신 그 동작에 의존한다면, 귀하의 진술이 정확할 것입니다.
— Philippe

고마워, 내 말은 내 모델이 해당 표준을 준수하지 않을 것입니다. 지금까지 본 모든 합성 도구가 감도 목록을 무시하기 때문에 호기심이 생겼지 만 래치를 유추 할 수 있다는 소문을 들었습니다.
— rick

3

@fbo와 @Martin Thompson이 지적했듯이, 프로세스에 의해 구동되는 모든 신호에 프로세스의 모든 브랜치에 어떤 값이 할당되어 있는지 확인해야하며 그 값은 출력의 이전 상태에 의존해서는 안됩니다 과정의.

이를 확인하는 가장 쉬운 방법은 프로세스 시작시 각 출력에 기본값을 할당하는 것입니다 (예 : fbo의 예를 공동 선택).

COMBO: process(a)
begin
    b <= (others => '0'); -- Assign default value to b
    if a = '1' then
        b(0) <= '1';
    else
        b(1 downto 0) <= "00";
    end if;
end process COMBO;

1
이것은 내가 자주 사용하는 좋은 방법입니다. 때로는 래치 경고가 비트를 할당하지 않은 것을 알려주는 반면이 방법으로 버그를 찾기가 어려울 수 있습니다. 예를 들어, 넓은 신호의 모든 비트를 개별적으로 할당하고 실수로 잘못 계산 한 경우.
— fbo

2
조합 과정에서만. 클럭킹 프로세스에서는 플립 플롭을 유추합니다.
— Martin Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.