최신 디지털 로직 장치는 일반적으로 "동기식 설계 실습"으로 설계됩니다 (전역 동기 에지 트리거 레지스터 전송 설계 스타일 (RTL) : 모든 순차 회로는 글로벌 클록 신호 CLK에 연결된 에지 트리거 레지스터로 나뉩니다. 순수한 조합 논리.
이러한 디자인 스타일을 통해 사람들은 타이밍에 관계없이 디지털 로직 시스템을 빠르게 설계 할 수 있습니다. 내부 상태가 안정 될 때까지 한 클럭 에지에서 다음 클럭 에지까지 충분한 시간이있는 한 시스템은 "정상 작동"합니다.
이 디자인 스타일을 사용하면 "이 시스템의 최대 클럭 속도는 얼마입니까?"를 제외하고 클럭 스큐 및 기타 타이밍 관련 문제 는 관련이 없습니다.
시계 왜곡이란 정확히 무엇입니까?
예를 들면 다음과 같습니다.
...
R1 - register 1 R3
+-+
->| |------>( combinational ) +-+
...->| |------>( logic )->| |--...
->|^|------>( )->|^|
+-+ ( ) +-+
| +--->( ) |
CLK | +->( ) CLK
| |
R2: | |
+-+ | |
...->| |->+ |
->|^|->--+
+-+
|
CLK
실제 하드웨어에서 "CLK"신호 는 모든 레지스터에서 정확히 동시에 스위칭되지 않습니다 . 스큐 클록 Tskew 상류 클럭 하류 클럭의 상대적 지연 (인 )
Tskew (소스, 대상) = destination_time-source_time
여기서 source_time은 업스트림 소스 레지스터 (이 경우 R1 또는 R2)에서 활성 클록 에지의 시간이고 destination_time은 일부 다운 스트림 대상 레지스터 (이 경우 R3)에서 "동일한"활성 클록 에지의 시간입니다. .
- 음의 클럭 왜곡 : R3의 CLK 가 R1의 클럭 전에 전환됩니다 .
- 양의 클럭 스큐 : R3의 CLK 는 R1의 클럭 이후 에 전환됩니다 .
시계 왜곡의 영향은 무엇입니까?
(아마도 여기서 타이밍 다이어그램이 더 명확해질 것입니다)
최악의 경우에도 제대로 작동하려면 R3의 설정 시간 또는 유지 시간 동안 R3의 입력이 변경되어서는 안됩니다. 더 나쁜 것은, 제대로 작동하려면 다음과 같은 것을 디자인해야합니다.
Tskew (R1, R3) <Tco-Th.
Tclk_min = Tco + Tcalc + Tsu-Tskew (R1, R3).
어디:
- Tcalc는 시스템 어디에서나 조합 논리 블록의 최대 최악의 정착 시간입니다. (때때로 중요 경로에있는 조합 논리 블록을 다시 디자인하거나, 부품을 업스트림 또는 다운 스트림으로 밀거나, 다른 파이프 라인 단계를 삽입 할 수 있으므로, 새로운 디자인은 Tcalc가 더 작아서 클럭 속도를 높일 수 있습니다) .
- Tclk_min은 하나의 활성 클럭 에지에서 다음 활성 클럭 에지까지의 최소 시간입니다. 위의 방정식에서 계산합니다.
- Tsu는 레지스터 설정 시간입니다. 레지스터 제조업체는이 요구 사항을 항상 충족시키기에 충분히 느린 클럭을 사용해야합니다.
- Th는 레지스터 유지 시간입니다. 레지스터 제조업체는 항상이 요구 사항을 충족 할만큼 클록 왜곡을 제어해야합니다.
- Tco는 클록-출력 지연 (전파 시간)입니다. 각 활성 클록 에지 이후, R1 및 R2는 새로운 값으로 전환하기 전에 짧은 시간 Tco 동안 이전 값을 조합 논리로 계속 구동합니다. 이는 하드웨어에 의해 설정되며 제조업체가 보장하지만 Tsu 및 Th 및 제조업체가 정상 작동에 대해 지정한 기타 요구 사항을 충족하는 한에만 가능합니다.
너무 긍정적 인 왜곡은 완화되지 않은 재앙입니다. 포지티브 스큐가 너무 많으면 (일부 데이터 조합으로) "몰래 경로"가 발생하여 R3 대신 클럭 N + 1에서 "올바른 데이터"를 래칭 (클래스 N에서 R1 및 R2에 미리 래치 된 데이터의 결정적 기능) 즉, N + 1 클럭에서 R1 및 R2에 래치 된 새로운 데이터는 누출 될 수 있고 조합 논리를 혼란 시키며 "동일한"클럭 에지 N + 1에서 R3에 잘못된 데이터가 래치 될 수 있습니다.
클럭 속도를 늦춤으로써 음의 스큐 양을 "고정"할 수 있습니다. R1의 입력이 R1 및 R2가 클럭 에지 N에서 새로운 데이터를 래치 한 후, 나중에 R3을 정산하기 위해 더 느린 클럭 속도로 시스템을 실행해야한다는 점에서 "나쁜"것입니다. "다음"클럭 에지 N + 1에서 결과를 래치합니다.
많은 시스템 이 스큐를 0으로 줄이기 위해 클록 분배 네트워크 를 사용합니다. 반 직관적으로 클럭 생성기에서 각 레지스터의 CLK 입력까지의 경로 인 클럭 경로를 따라 지연을 추가함으로써 클럭 에지 파면이 한 레지스터의 CLK 입력에서 물리적으로 이동하는 겉보기 속도를 높일 수 있습니다 다음 레지스터의 CLK 입력은 빛의 속도보다 빠릅니다.
알테라 문서는 언급
"클록 스큐에 기여하므로 클록 경로에서 조합 논리를 사용하지 마십시오."
이것은 많은 사람들이 글로벌 CLK 신호 이외의 것을 발생시켜 일부 레지스터의 로컬 CLK 입력을 유도하는 방식으로 FPGA에 컴파일되는 HDL을 작성한다는 사실을 의미합니다. (이는 특정 조건이 충족 될 때만 새로운 값이 레지스터에로드되도록 "클럭 게이팅"로직이거나 N 클럭 중 1 개만 통과시키는 "클록 분배기"로직 등일 수 있습니다. 로컬 CLK는 일반적으로 글로벌 CLK에서 파생됩니다. 글로벌 CLK가 틱한 다음 로컬 CLK가 변경되지 않거나 신호가 해당 "다른 것"을 통해 전파되는 글로벌 CLK 이후 짧은 지연) 로컬 CLK가 한 번 변경됩니다.
그 "다른 것"이 다운 스트림 레지스터 (R3)의 CLK를 구동 할 때, 스큐를 더 긍정적으로 만듭니다. 이 "다른 것"이 업스트림 레지스터 (R1 또는 R2)의 CLK를 구동 할 때 왜곡을 더 부정적으로 만듭니다. 때때로, 업스트림 레지스터의 CLK를 구동하는 것과 다운 스트림 레지스터의 CLK를 구동하는 것은 실질적으로 동일한 지연을 가지므로, 이들 사이의 스큐는 실질적으로 0이됩니다.
일부 ASIC 내부의 클록 분배 네트워크는 일부 레지스터에서 소량의 포지티브 클록 스큐 로 의도적으로 설계 되어있어 조합 로직 업스트림에 약간의 시간이 더 걸리므로 전체 시스템을 더 빠른 클록 속도로 실행할 수 있습니다. 이를 "클록 스큐 최적화"또는 "클록 스큐 스케줄링"이라고하며 " 타이밍 " 과 관련이 있습니다.
나는 여전히 set_clock_uncertainty
명령에 미스터리되어있다 -왜 "수동으로"왜곡을 지정하고 싶을까?
(*) 한 가지 예외 :
비동기 시스템 .