내 컴파일러는 조합 루프 ( always @(*)
, Verilog)의 유추 래치에 대해 불평 합니다. 또한 유추 된 걸쇠를 피하는 것이 바람직하다고 들었습니다.
유추 래치에서 정확히 무엇이 잘못 되었습니까? 그것들은 확실히 조합 루프를 작성하기 쉽게 만듭니다.
내 컴파일러는 조합 루프 ( always @(*)
, Verilog)의 유추 래치에 대해 불평 합니다. 또한 유추 된 걸쇠를 피하는 것이 바람직하다고 들었습니다.
유추 래치에서 정확히 무엇이 잘못 되었습니까? 그것들은 확실히 조합 루프를 작성하기 쉽게 만듭니다.
답변:
"래치"는 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에서 변수는 always 블록에 값이 지정되지 않은 경우 이전 값을 유지합니다 . 이 현재 값을 저장하려면 래치를 작성해야합니다.
불완전한 if-else 문은 래치를 생성합니다. 경우 - 다른 출력 상태는 가능한 모든 입력 조건에 정의되어 있지 않은 경우 문은 "불완전"으로 간주됩니다. 불완전한 case 문이나 default : item 이없는 case 문도 마찬가지 입니다.
유추 된 래치가 나쁜 이유는 무엇입니까?
추론 된 래치는 논리 설계가 의도 한대로 구현되지 않을 수있는 '경고 표시'역할을 할 수 있습니다. 중요한 if-else 또는 case 문이 디자인에서 누락되었을 수 있습니다.
래치는 타이밍 문제 및 경쟁 조건으로 이어질 수 있습니다. 출력을 입력으로 다시 라우팅하는 조합 피드백으로 이어질 수 있으며 이는 예측할 수 없습니다.
유추 래치를 만들지 않으려면 :
P. Chu의 "Verilog Examples의 FPGA 프로토 타이핑"에서 일부 부분이 해석되었습니다.
래치는 FPGA 또는 CPLD에서 사용하기가 매우 까다로워서 많은 사람들이이를 완전히 피합니다. 그 이유 중 하나는 많은 FPGA에 래치가 내장되어 있지 않기 때문에 로직 게이트로 만들어져 있기 때문에 타이밍 문제가 발생할 수 있다는 것입니다.
또한 래치를 사용할 때 타이밍 지연 및 경쟁 조건을 제어 할 수 없습니다 (기본 요소가없는 경우)
래치 없이는 절대로 할 수 없다면 (예 : 필요한 최대 클럭 주파수를 충족하기 위해 시간을 빌리는) 래치를 사용하지 말고 우연히 래치를 추론하기 위해 코딩 기술을 사용하는 것이 좋습니다.
조합 논리 및 피드백을 사용하여 구성된 순차 논리 설계는 일반적으로 물리적 게이트를 사용할 때 합리적으로 보일 것으로 가정합니다. 즉, 실제로 입력이 변경된 후 언젠가는 입력의 변경에 응답하여 게이트의 출력이 변경되지 않습니다. 실제 게이트를 사용할 때 가정이 유지되지 않는 경우가 있습니다 (예 : 고속 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 컴파일러는 물리적으로 양의 지연 (제로 지연 피드백 루프는 실제 세계에는 존재할 수 없음)을 갖는 물리적 신호 노드를 추가해야하지만, 보장 할 수는 없습니다. 이러한 노드는 회로가 원하는대로 작동하도록하는 데 필요한 곳에 추가됩니다. 또한 디자인을 약간 변경해도 컴파일러가 실제 환경에서 작동하는 임의의 배치에서 실패하는 다른 임의의 배치로 변경되지 않을 것이라는 보장조차 없습니다.
디자인에서 래치를 잡는 방법에 대한 자세한 내용은이 링크에서 간단히 설명합니다.