합성 중 래치를 피하는 방법


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.