유추 래치가 나쁜 이유는 무엇입니까?


22

내 컴파일러는 조합 루프 ( always @(*), Verilog)의 유추 래치에 대해 불평 합니다. 또한 유추 된 걸쇠를 피하는 것이 바람직하다고 들었습니다.

유추 래치에서 정확히 무엇이 잘못 되었습니까? 그것들은 확실히 조합 루프를 작성하기 쉽게 만듭니다.


현재하고있는 일의 HDL 예를 포함시키는 것이 좋을 것입니다.
shuckc

이 질문이 최근 몇 번 언급 된 것으로 나타났습니다. 전문가가 아닌 사람이라면 Oli Glaser와는 별도로 모든 답변은 부정확하거나 도움이되지 않는 조합입니다.
EML

유추 한 걸쇠를 피하는 것이 적고, 무엇을하고 있는지 정확히 알지 않는 한 일반적으로 투명한 걸쇠를 피하는 것이 좋습니다 (투명한 걸쇠를 포함하지 않고 완벽하게 안전합니다).
Peter Green

답변:


20

"래치"는 FF가 클록 에지에 응답하여 출력을 변경한다는 점에서 "플립 플롭"과 다릅니다. 래치는 클럭 이외의 것에 응답하여 출력을 변경할 수 있습니다. 예를 들어 SR-Latch에는 세트 및 리셋 입력이 있으며 둘 중 하나가 활성화되어 있으면 출력이 변경 될 수 있습니다. SR-FF는 클럭 에지가있을 때만 세트 또는 리셋에 응답합니다.

FPGA에서는 로직이 완전히 동기화되기를 원합니다. FF와 같은 모든 저장 요소가 모두 단일 클록 소스에서 클록됨을 의미합니다. 해당 클럭에 비동기적인 것은 매우 신중하게 처리해야하며 그렇지 않으면 타이밍 오류가 발생합니다.

래치는 기본적으로 비동기 저장 요소입니다. 클럭 입력이 없으므로 어떤 클럭과도 동기화 할 수 없습니다. 비동기식 리셋 및 리셋 입력을 가진 FF가 있으며, 이는 일반적인 래치와 같은주의를 기울여 처리해야합니다.

래치가 발생할 수있는 모든 타이밍 문제에 들어가는 것은 여기에서 다룰 수있는 것 이상의 방법이지만 한 가지 예를 들어 보겠습니다.

SR-Latch가 있고 8 비트 카운터가 특정 값에 도달 할 때마다 설정하려고한다고 가정합니다. Verilog 코드가 무엇인지 잘 모르겠지만 VHDL에서 코드는 다음과 같습니다. set = "= 100 'when count ="11010010 "else'0 '; 이 설정 신호는 SR-Latch의 설정 입력으로 이동합니다.

생성되는 논리는 순전히 조합입니다. and-gate, or-gate 및 인버터 (또는 LUT)의 혼합. 그러나 그 조합 논리를 통한 신호 경로가 항상 완벽하지는 않으며 "설정된"신호에 결함이있을 수 있습니다. 특정 게이트 그룹을 통과하는 신호 경로는 다른 그룹보다 오래 걸릴 수 있으며, 출력이 최종 상태로 내려 오기 전에 잠시 동안 설정된 출력이 활성화됩니다.

이 출력 결함으로 인해 SR-Latch가 설정되어 있지 않아도 SR-Latch가 설정 될 수 있습니다. SR-Latch에서 SR-FF로 전환하고 카운터와 동일한 클럭을 클럭 오프하면 SR-FF는 상태를 변경하기 전에 하나의 전체 클럭 사이클을 기다립니다. 본질적으로 그것은 설정된 신호가 안정 될 때까지 기다렸다가 그것을 봅니다.

설정 신호에 대한 조합 논리를 통한 경로가 다른 지연으로 인해 다르게 라우팅되면 글리치 동작도 변경됩니다. 논리는 제대로 작동하지만 완전히 관련이없는 것을 변경했기 때문에이 논리는 다르게 라우팅되어 버그가 발생합니다. 온도와 전압도 신호 타이밍을 변경하여 글리치 동작을 변경할 수 있습니다.

타이밍에 불확실한 이유는 로직의 래치를 피해야하는 이유입니다. FF는 사용하기 훨씬 안전합니다. 이것이 실수로 래치를 만드는 것이 쉽고 어쨌든 원하지 않기 때문에 컴파일러가 래치에 대해 경고하는 이유입니다.

물론 때로는 래치가 필요합니다. 절대적으로 필요한 경우에만 매우 드물게 사용해야하며 결함이 없도록 논리를 올바르게 설계해야합니다.


Verilog 또는 다른 언어로 래치를 명시 적으로 지정하고 래치를 공급하는 조합 지연의 조합으로 올바르게 작동하도록 회로를 설계하는 경우 (결합 될 신호를 생성하는 것이 무엇이든 의미) 래치는 0 지연 로직 경로와 최대 지연 로직 경로의 최악의 경우에도 래치에 대한 타이밍 요구 사항이 여전히 충족되는 방식으로 수행됩니다. 여기서 래치 자체는 음이 아닌 지연을 갖습니다. 만약 그렇다면 ...
supercat

... 음이 아닌 지연이 필요한 노드를 지정하지 않고 조합 로직과 피드백을 사용합니다. 동기식 로직은 비동기식보다 설계하기가 쉽지만 많은 장치가 완전히 죽지 않고 전력을 절약하기 위해 절전 모드에서 클록을 종료해야합니다. 완전히 동기식이지만 "핀이 높은 경우 실행"및 "핀이 낮은 경우 실행"에 대한 몇 가지 논리 출력과 각 핀과 관련된 장치를 갖는 것이 흥미로울 수 있습니다. 모든 핀은 하나가 필요함을 나타냅니다.
supercat

이러한 기능은 디바이스가 휴면 상태 일 때 도착한 입력이 입력을 처리하고 인식 할 수있을만큼 오랫동안 내부 발진기 및 회로의 전원을 공급할 수 있기 때문에 비동기 로직에 대한 많은 필요성을 완화 할 수있다. 이러한 기능은 단일 "wake-up"핀을 사용하는 것보다 훨씬 다재다능하지만 single-wakeup 디자인은 표준으로 보입니다. 앞에서 설명한 것과 같은 멀티 웨이크 업 방식이 과도한 실리콘을 소비합니까? 실리콘 요구 사항은 온칩과 비교할 때 매우 적을 것이라고 생각합니다.
supercat

13

유추 된 래치는 무엇입니까?
조합 논리의 경우 회로의 출력은 입력의 기능이며 메모리 또는 내부 상태 (래치)를 포함해서는 안됩니다.

Verilog에서 변수는 always 블록에 값이 지정되지 않은 경우 이전 값을 유지합니다 . 이 현재 값을 저장하려면 래치를 작성해야합니다.

불완전한 if-else 문은 래치를 생성합니다. 경우 - 다른 출력 상태는 가능한 모든 입력 조건에 정의되어 있지 않은 경우 문은 "불완전"으로 간주됩니다. 불완전한 case 문이나 default : item 이없는 case 문도 마찬가지 입니다.

유추 된 래치가 나쁜 이유는 무엇입니까?
추론 된 래치는 논리 설계가 의도 한대로 구현되지 않을 수있는 '경고 표시'역할을 할 수 있습니다. 중요한 if-else 또는 case 문이 디자인에서 누락되었을 수 있습니다.

래치는 타이밍 문제 및 경쟁 조건으로 이어질 수 있습니다. 출력을 입력으로 다시 라우팅하는 조합 피드백으로 이어질 수 있으며 이는 예측할 수 없습니다.

유추 래치를 만들지 않으려면 :

  • if 또는 case 문의 모든 분기 포함
  • 모든 분기의 모든 출력 신호에 값을 할당
  • 절차 시작시 기본 할당을 사용하면 모든 신호가 할당됩니다.

P. Chu의 "Verilog Examples의 FPGA 프로토 타이핑"에서 일부 부분이 해석되었습니다.


2
"Verilog 예제에 의한 FPGA 프로토 타이핑"은 실제 합성 Verilog를 배우기에 좋은 책입니다. 기본 조합 항목에서 기본 순차에 이르기까지 좋은 예제 디자인이 있으며 UART, VGA, 소프트 코어 프로세서 (Picoblaze) 및 심지어 탁구 게임과 같은 유용한 디자인으로 이어집니다. 또한 기본적인 테스트 벤치 및 시뮬레이션에 대해서도 다룹니다. @Randomblue, 아직받지 못했다면 사본을 가져와야합니다. 나는 그가 VHDL 버전도했다고 생각합니다.
Oli Glaser

8

래치는 FPGA 또는 CPLD에서 사용하기가 매우 까다로워서 많은 사람들이이를 완전히 피합니다. 그 이유 중 하나는 많은 FPGA에 래치가 내장되어 있지 않기 때문에 로직 게이트로 만들어져 있기 때문에 타이밍 문제가 발생할 수 있다는 것입니다.
또한 래치를 사용할 때 타이밍 지연 및 경쟁 조건을 제어 할 수 없습니다 (기본 요소가없는 경우)

래치 없이는 절대로 할 수 없다면 (예 : 필요한 최대 클럭 주파수를 충족하기 위해 시간을 빌리는) 래치를 사용하지 말고 우연히 래치를 추론하기 위해 코딩 기술을 사용하는 것이 좋습니다.


6

조합 논리 및 피드백을 사용하여 구성된 순차 논리 설계는 일반적으로 물리적 게이트를 사용할 때 합리적으로 보일 것으로 가정합니다. 즉, 실제로 입력이 변경된 후 언젠가는 입력의 변경에 응답하여 게이트의 출력이 변경되지 않습니다. 실제 게이트를 사용할 때 가정이 유지되지 않는 경우가 있습니다 (예 : 고속 NOR 게이트 및 고속 인버터가 VSS에서 VDD로 느리게 상승하는 신호에 의해 구동되거나 NOR 동안 인버터가 1.2V로 전환되는 경우) 게이트는 1.7V까지 스위칭되지 않으며 NOR 게이트는 느리게 상승하는 신호가 높아지기 전에 인버터의 출력이 낮아지는 것을 볼 수 있지만 이러한 문제는 일반적으로 느리게 변할 때마다 버퍼를 추가하여 해결할 수 있습니다 신호가 둘 이상의 대상으로 라우팅됩니다. 운수 나쁘게,

문제는 명시 적으로 달리 지시되지 않는 한, FPGA 컴파일러는 조합 회로를 동일한 정상 상태 동작을 갖지만 완전히 다른 타이밍을 가질 수있는 완전히 다른 회로로 임의로 조합 회로를 대체 할 수 있다는 것이다. 예를 들어, 복잡한 조합 함수 F가 U에서 Z까지 6 개의 입력을받는다고 가정합니다. F는 회로 P에 직접 공급되고 (F NAND Z)는 회로 Q에 공급됩니다. 컴파일러는 Q에 입력 된 값은 Z가 높으면 F이고, Z가 높다고 가정하는 것을 제외하고는 F와 같은 함수 F '를 계산할 수 있고; 그러면 Q에 (F NAND Z)가 아닌 (F 'NAND Z)가 공급 될 수 있습니다. P의 가장 효율적인 실현은 5 개의 게이트 지연을 가질 것이지만, Q의 가장 효율적인 실현은 2 개만 가질 것이다. 그러므로,

회로에 조합 피드백 루프가있는 경우 FPGA 컴파일러는 물리적으로 양의 지연 (제로 지연 피드백 루프는 실제 세계에는 존재할 수 없음)을 갖는 물리적 신호 노드를 추가해야하지만, 보장 할 수는 없습니다. 이러한 노드는 회로가 원하는대로 작동하도록하는 데 필요한 곳에 추가됩니다. 또한 디자인을 약간 변경해도 컴파일러가 실제 환경에서 작동하는 임의의 배치에서 실패하는 다른 임의의 배치로 변경되지 않을 것이라는 보장조차 없습니다.


0

디자인에서 래치를 잡는 방법에 대한 자세한 내용은이 링크에서 간단히 설명합니다.

https://www.doulos.com/knowhow/fpga/latches/


1
EE.SE에 오신 것을 환영합니다! 링크에서 관련 세부 정보를 포함하여 답변을 향상시킬 수 있습니다. 이렇게하면 원본 페이지가 사라져도 대답의 품질이 향상됩니다.
David
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.