시스템 개요
도 1은 컴퓨터 시스템(10)의 일 실시예를 도시한다. 다른 실시예들이 또한 가능하며 고려된다. 도 1의 실시예에서, 컴퓨터 시스템(10)은 몇 개의 처리 노드들(12A, 12B, 12C 및 12D)을 포함한다. 각 처리 노드는 각 처리 노드들(12A-12D) 내에 포함된 메모리 제어기(16A-16D)를 통해 각각의 메모리들(14A-14D)에 결합된다. 또한, 처리 노드들(12A-12D)은 처리 노드들(12A-12D) 간의 통신에 이용되는 인터페이스 로직을 포함한다. 예를 들어, 처리 노드(12A)는 처리 노드(12B)와 통신하기 위한 인터페이스 로직(18A), 처리 노드(12C)와 통신하기 위한 인터페이스 로직(18B) 및 또 다른 처리 노드(미도시)와 통신하기 위한 제 3 인터페이스 로직(18C)을 포함한다. 유사하게, 처리 노드(12B)는 인터페이스 로직들(18D, 18E 및 18F)을 포함하고; 처리 노드(12C)는 인터페이스 로직들(18G, 18H 및 18I)를 포함하며; 그리고 처리 노드(12D)는 인터페이스 로직들(18J, 18K 및 18L)을 포함한다. 처리 노드(12D)는 인터페이스 로직(18L)을 통해 I/O 브리지(20)와 통신하도록 결합된다. 다른 처리 노드들도 동일한 방식으로 다른 I/O 브리지들과 통신한다.
처리 노드들(12A-12D)은 상호 처리 노드 통신을 위한 패킷 기반 링크를 구현한다. 본 실시예에서, 이러한 링크는 단방향 라인들의 세트들로서 구현된다(예를 들어, 라인들(24A)은 패킷들을 처리 노드(12A)로부터 처리 노드(12B)에 전송하는 데에 이용되며, 라인들(24B)은 패킷들을 처리 노드(12B)로부터 처리 노드(12A)로 전송하는 데에 이용된다). 다른 세트의 라인들(24C-24H)은 도 1에 도시된 바와 같이 다른 노드들 간에 패킷들을 전송하는 데에 이용된다. 링크는 처리 노드들 간의 통신을 위해 캐시 코히런트 방식으로 동작하거나("코히런트 링크"), 또는 처리 노드와 I/O 브리지 간의 통신을 위해 넌코히런트 방식으로 동작할 수 있다("넌코히런트 링크"). 또한, 넌코히런트 링크는 I/O 버스(22)를 대신하기 위한 I/O 장치들 간의 데이지 체인(daisy-chain) 구조로서 이용될 수 있다. 코히런트 링크들을 통한 2개 또는 그 이상의 노드들의 상호 연결은 "코히런트 구조(coherent fabric)"로서 알려져있다. 유사하게, 넌코히런트 링크들을 통한 2개 또는 그 이상의 노드들의 상호 연결은 "넌코히런트 구조"로 일컬어질 수 있다. 주목할 사항으로서, 1개의 처리 노드로부터 다른 처리 노드에 전송될 패킷은 1개 또는 그 이상의 중간 노드들을 통해 전송될 수 있다. 예를 들어, 처리 노드(12A)에 의해 처리 노드(12D)에 전송되는 패킷은 도 1에 도시된 바와 같이 처리 노드(12B) 또는 처리 노드(12C)를 통과할 수 있다. 모든 적절한 라우팅 알고리즘이 이용될 수 있다. 컴퓨터 시스템(10)의 다른 실시예들은 도 1에 도시된 실시예에서 보다 많거나 또는 보다 적은 처리 노드들을 포함할 수 있다.
메모리 제어기 및 인터페이스 로직 외에, 처리 노드들(12A-12D)은 1개 또는 그 이상의 프로세서들을 포함할 수 있다. 일반적으로, 처리 노드는 적어도 하나의 프로세서를 포함하며, 그리고 바람직한 경우 메모리 및 다른 로직과 통신하기 위한 메모리 제어기를 선택적으로 포함할 수 있다.
메모리들(14A-14D)은 모든 적절한 메모리 장치들을 포함할 수 있다.예를 들어, 메모리들(14A-14D)은 1개 또는 그 이상의 RAMBUS DRAM (RDRAM), 동기 DRAM (SDRAM), 정적 RAM 등을 포함할 수 있다. 컴퓨터 시스템(10)의 어드레스 공간은 메모리들(14A-14D) 사이에 분할된다. 각 처리 노드들(12A-12D)은 어떠한 어드레스들이 어떠한 메모리들(14A-14D)에 맵핑되는 지를 결정하고, 이에 따라 처리 노드들(12A-12D)에 특정 어드레스에 대한 메모리 요구가 라우팅되어야 한다는 것을 결정하는 데에 이용되는 메모리 맵을 포함할 수 있다. 일 실시예에서, 컴퓨터 시스템(10) 내의 어드레스에 대한 코히런시 포인트는 어드레스에 대응하는 메모리 저장 바이트들에 결합된 메모리 제어기들(16A-16D)이다. 다시 말해, 메모리 제어기들(16A-16D)은 대응하는 메모리들(14A-14D)에 대한 각 메모리 액세스가 캐시 코히런트 방식으로 확실하게 일어나게 한다. 메모리 제어기들(16A-16D)은 메모리들(14A-14D)로의 인터페이싱을 위한 제어 회로를 포함할 수 있다. 또한, 메모리 제어기들(16A-16D)은 메모리 요구를 큐잉하기 위한 메모리 큐를 포함할 수 있다.
일반적으로, 인터페이스 로직들(18A-18D)은 링크로부터 패킷들을 수신하고 링크를 통해 전송될 패킷들을 버퍼링하는 버퍼들을 포함할 수 있다. 컴퓨터 시스템(10)은 패킷들을 전송하는 데에 모든 적절한 흐름 제어 메커니즘을 이용할 수 있다. 예를 들어, 일 실시예에서, 각 노드는 각 인터페이스 로직이 연결된 링크의 다른 단부에서 수신기 내의 각 타입의 버퍼의 총수를 저장한다. 수신 노드가 패킷을 저장할 빈 버퍼를 갖지 않는 한, 노드는 패킷을 전송하지 않는다. 패킷을 전방으로 라우팅시킴으로써 수신 버퍼가 비게 되면, 수신 인터페이스 로직은 버퍼가 비었음을 나타내는 메세지를 송신 인터페이스 로직에 전송한다. 이러한 메커니즘은 "쿠폰 기반(coupon-based)" 시스템으로 알려져있다.
도 2는 처리 노드들(12A 및 12B)을 도시한 블록도로서, 이들 간의 링크들의 일 실시예를 보다 상세히 도시한다. 다른 실시예들이 또한 가능하며 고려된다. 도 2의 실시예에서, 라인들(24A)은 클록 라인(24AA), 제어 라인(24AB), 및 제어/어드레스/데이터 버스(24AC)를 포함한다. 유사하게, 라인들(24B)은 클록 라인(24BA), 제어 라인(24BB), 및 제어/어드레스 데이터 버스(24BC)를 포함한다.
클록 라인은 제어 라인 및 제어/어드레스/데이터 버스에 대한 샘플 포인트를 나타내는 클록 신호를 전송한다. 일 특정 실시예에서는, 데이터/제어 비트들이 클록 신호의 각 에지(즉, 라이징 에지 및 폴링 에지)로 전송된다. 따라서, 라인당 2개의 데이터 비트들이 클록 주기 마다 전송될 수 있다. 라인당 한 비트를 전송하는 데에 이용되는 시간량은 본원에서 "비트 타임"으로 일컬어진다. 상기 설명된 실시예는 클록 주기당 2개의 비트 타임들을 필요로 한다. 패킷은 2개 또는 그 이상의 비트 타임을 통해 전송될 수 있다. 제어/어드레스/데이터 버스의 폭에 따라 다수의 클록 라인들이 이용될 수 있다. 예를 들어, 2개의 클록 라인들이 32 비트 제어/어드레스/데이터 버스에 이용될 수 있다(제어/어드레스/데이터 버스의 절반은 클록 라인들중 하나에 관련되며, 제어/어드레스/데이터 버스의 나머지 절반은 클록 라인들중 다른 하나에 관련된다).
제어 라인은 제어/어드레스/데이터 버스를 통해 전송되는 데이터가 제어 패킷의 비트 타임인지, 아니면 데이터 패킷의 비트 타임인지를 나타낸다. 제어 라인은 제어 패킷의 비트 타임을 나타내기 위해 표명(assert)되며, 데이터 패킷의 비트 타임을 나타내기 위해 비표명(deassert)된다. 특정한 제어 패킷들은 데이터 패킷이 다음에 온다는 것을 나타낸다. 데이터 패킷은 대응하는 제어 패킷의 바로 다음에 올 수 있다. 일 실시예에서, 다른 제어 패킷들은 데이터 패킷의 전송을 방해할 수 있다. 이러한 방해는 데이터 패킷을 전송하는 동안 다수의 비트 타임들에 대해 제어 라인을 표명하고, 제어 라인이 표명되는 동안 제어 패킷의 비트 타임들을 전송함으로써 수행될 수 있다. 데이터 패킷을 방해하는 제어 패킷들은 데이터 패킷이 뒤따를 것임을 나타내지 않을 수 있다. 또한, 일 실시예에서, 제어 라인은 스톨(stall) 비트 타임들을 나타내기 위해 제어 패킷을 전송하는 동안 비표명될 수 있다. 이후의 제어 라인의 리어서션은 제어 패킷이 계속되고 있음을 나타낼 수 있다.
제어/어드레스/데이터 버스는 데이터/제어 비트들을 전송하기 위한 한 세트의 라인들을 구비한다. 각 처리 노드 또는 I/O 브리지는 설계 선택에 따라 지원되는 수의 라인들중 어떠한 하나를 이용할 수 있다. 다른 실시예들은, 바람직한 경우 다른 크기를 갖는 제어/어드레스/데이터 버스를 지원할 수 있다.
일 실시예에 따르면, 커맨드/어드레스/데이터 버스 라인들 및 클록 라인은 (논리 1이 라인 상에서 저전압으로 표시되고, 논리 0이 고전압으로 표시되는) 반전된 데이터를 전달할 수 있다. 대안적으로, 라인들은 (논리 1이 라인 상에서 고전압으로 표시되고, 논리 0이 저전압을 표시되는) 비 반전 데이터를 전달할 수 있다.
도 3 내지 6은 코히런트 링크의 일 실시예에서 이용되는 예시적인 패킷들을 도시한다. 도 3 내지 5는 제어 패킷들을 도시하고, 도 6은 데이터 패킷을 도시한다. 다른 실시예들은, 바람직한 경우 다른 패킷 정의를 이용할 수 있다. 각 패킷은 "비트 타임" 표제로 열거된 일련의 비트 타임들로서 도시된다. 패킷의 비트 타임들은 리스트된 비트 타임 순서에 따라 전송된다. 도 3 내지 6은 8 비트 제어/어드레스/데이터 버스 구현을 위한 패킷들을 도시한다. 따라서, 각 비트 타임은 7에서 0으로 번호가 매겨진 8 비트들을 포함한다. 도면들에 어떠한 값도 제공되지 않는 비트들은 소정의 패킷에 대해 지정된 것이거나, 또는 패킷 지정 정보를 전송하는 데에 이용될 수 있다. 점선들로 표시된 필드들은 특정한 타입의 모든 패킷들 내에 포함되지 않을 수 있는 임의 필드들을 나타낸다.
일반적으로, 패킷은 2개의 노드들(패킷을 전송하는 시작 노드 및 패킷을 수신하는 목적지 노드) 간의 통신이다. 시작 노드 및 목적지 노드는 패킷이 일부가 되는 트랜잭션의 소스 및 타겟 노드와 다를 수 있으며, 또는 각 노드는 소스 노드 또는 타겟 노드가 될 수 있다. 제어 패킷은 트랜잭션에 대한 제어 정보를 전달하는 패킷이다. 특정한 제어 패킷은 데이터 패킷이 뒤따른다는 것을 지정한다. 데이터 패킷은 트랜잭션에 대응하는 데이터 및 제어 패킷의 지정에 대응하는 데이터를 전달한다.
도 3은 정보 패킷(info packet)(30)을 도시한다. 정보 패킷(30)은 8 비트 링크 상에 4개의 비트 타임을 포함한다. 본 실시예에서, 커맨드 엔코딩은 비트 타임 1 동안 전송되며 6 비트를 포함한다. 도 4 및 5에 도시된 다른 각 제어 패킷은 비트 타임 1 동안 동일한 비트 위치들에서 커맨드 엔코딩을 포함한다. 정보 패킷(30), 메세지들이 메모리 어드레스를 포함하지 않을 때, 처리 노드들 간에 메세지를 전송하는 데에 이용된다. 또한, 정보 패킷들은 쿠폰 기반 흐름 제어 메커니즘을 이용하여 빈 버퍼의 수를 전송하는 데에 이용될 수 있다.
도 4는 커맨드 패킷(32)을 도시한다. 커맨드 패킷(32)은 8 비트 링크 상에 8개의 비트 타임들을 포함한다. 커맨드 엔코딩은 비트 타임 1 동안 전송된다. 소스 유닛 번호 또한 비트 타임 1 동안 전송되며, 소스 노드 번호는 비트 타임 2 동안 전송된다. 노드 번호는 컴퓨터 시스템(10) 내의 처리 노드들(12A-12D)중 하나를 명백히 식별하며, 컴퓨터 시스템(10)을 통해 패킷을 라우팅시키는 데에 이용된다. 유닛 번호는 트랜잭션의 소스가 되거나(소스 유닛 번호), 또는 트랜잭션의 목적지가 되는(목적지 유닛 번호) 노드 내의 유닛을 식별한다. 유닛들은 메모리 제어기들, 캐시들, 프로세서들 등을 포함할 수 있다. 선택적으로, 커맨드 패킷(32)은 비트 타임 2 내에 목적지 노드 번호 및 목적지 유닛(또는, 다른 어떠한 패킷들에 대해서는, 타겟 노드 번호 및 타겟 유닛)을 포함할 수 있다. 목적지 노드 번호가 포함되는 경우, 이는 패킷을 목적지 노드에 라우팅시키는 데에 이용된다. 또한, 많은 커맨드 패킷들은 비트 타임 3 내에, 소스 노드 및 소스 유닛과 함께, 패킷을 그것이 일부가 되는 특정 트랜잭션에 링크시킬 수 있는 소스 태그를 포함할 수 있다. 비트 타임 5 내지 8은 트랜잭젼에 의해 영향을 받는 최상위 비트들을 전송하는 데에 이용된다. 커맨드 패킷(32)은 트랜잭션에 의해 영향을 받는 메모리 어드레스를 전달하는 커맨드들에 대한 트랜잭션을 수행하는 중인 커맨드들을 전송할 뿐 아니라, 트랜잭션(예를 들어, 판독 또는 기록 트랜잭션)을 시작하는 데에 이용될 수 있다. 일반적으로, 커맨드 패킷은 목적지 노드에 의해 수행될 연산을 나타낸다.
패킷(32) 내의 규정되지 않은 일부 필드들은 패킷 지정 정보를 전달하기 위해 많은 커맨드 패킷들 내에서 이용될 수 있다. 또한, 비트 타임 4는 트랜잭션에 의해 영향을 받는 메모리 어드레스의 최하위 비트들을 전송하기 위해 일부 커맨드들에서 이용될 수 있다.
도 5는 응답 패킷(34)을 도시한다. 응답 패킷(34)은 커맨드 엔코딩, 목적지노드 번호 및 목적지 유닛 번호를 포함한다. 목적지 노드 번호는 응답 패킷에 대한 목적지 노드(어떠한 경우들에서는, 트랜잭션의 소스 노드 또는 타겟 노드가 될 수 있는)를 식별한다. 목적지 유닛 번호는 목적지 노드 내의 목적지 유닛을 식별한다. 다양한 타입의 응답 패킷들은 부가적인 정보를 포함할 수 있다. 예를 들어, 판독 응답 패킷은 뒤따르는 데이터 패킷 내에 제공되는 판독 데이터의 양을 나타낼 수 있다. 프로브 응답들은 요구된 캐시 블록의 카피가 (비트 타임 4 내의 임의 공유 비트 "Sh"를 이용하여) 프로브된 노드에 의해 보유되는 지의 여부를 나타낼 수 있다. 일반적으로, 응답 패킷(34)은 트랜잭션에 의해 영향을 받는 메모리 어드레스의 전송을 요구하지 않는 트랜잭션을 전달하는 동안 커맨드들에 대해 이용된다. 또한, 응답 패킷(34)은 트랜잭션을 종료시키기 위해 포지티브 승인 패킷을 전송하는 데에 이용될 수 있다. 커맨드 패킷(32)과 유사하게, 응답 패킷(34)은 (도 5에서 임의 필드들로서 도시된) 많은 타입의 응답들에 대한 소스 노드 번호, 소스 유닛 번호, 및 소스 태그를 포함할 수 있다.
도 6은 데이터 패킷(36)을 도시한다. 데이터 패킷(36)은 도 6의 실시예에서 8 비트 링크 상에 8개의 비트 타임들을 포함한다. 데이터 패킷(36)은 전송되는 데이터의 양에 따라 다른 수의 비트 타임들을 포함할 수 있다. 예를 들어, 일 실시예에서, 캐시 블록은 64 바이트들, 및 이에 따라 8 비트 링크 상에 64개의 비트 타임들을 포함한다. 다른 실시예들은, 바람직한 경우 다른 크기를 갖는 캐시 블록을 규정할 수 있다. 또한, 데이터는 넌 캐시어블 판독 및 기록에 대해 캐시 블록 크기들 이하로 전송될 수 있다. 캐시 블록 크기 이하의 데이터를 전송하는 데이터 패킷들은 보다 적은 비트 타임들을 이용한다. 일 실시예에서, 넌 캐시 블록 크기의 데이터 패킷들은, 데이터 패킷 내에서 어떤 데이터 바이트들이 유효한지를 나타내기 위해 데이터를 전송하기 전에 바이트 인에이블의 몇 개의 비트 타임들을 전송할 수 있다. 또한, 캐시 블록 데이터는 첫 번째 요구 어드레스의 최하위 비트에 의해 어드레스되는 쿼드워드(quadword)에 리턴될 수 있으며, 이후 나머지 쿼드워드들의 인터리브 리턴이 이어진다. 일 실시예에서, 쿼드워드는 8 바이트들을 포함한다.
도 3 내지 6은 8 비트 링크에 대한 패킷들을 도시한다. 16 및 32 비트 링크들에 대한 패킷들은 도 3 내지 6에 도시된 연속적인 비트 타임들을 연결시킴으로써 형성될 수 있다. 예를 들어, 16 비트 링크 상의 패킷의 비트 타임 1은 8 비트 링크 상에서 비트 타임들 1 및 2 동안 전송되는 정보를 포함할 수 있다. 유사하게, 32 비트 링크 상의 패킷의 비트 타임 1은 8 비트 링크 상의 비트 타임들 1 내지 4 동안 전송되는 정보를 포함할 수 있다. 하기의 식 1 및 2는 8 비트 링크로부터의 비트 타임들에 따른, 16 비트 링크의 비트 타임 1 및 32 비트 링크의 비트 타임 1의 형성을 도시한다.
도 7은 컴퓨터 시스템(10) 내의 코히런트 링크의 예시적인 일 실시예에 따라 이용되는 패킷들을 도시한 표(38)이다. 다른 모든 적절한 패킷들 및 커맨드 필드 엔코딩의 세트들을 포함하는 다른 실시예들이 또한 가능하며 고려된다. 표(38)는 각 커맨드에 할당된 커맨트 엔코딩들을 도시한 커맨드 코드 칼럼과, 커맨드를 명명하는 커맨드 칼럼과, 그리고 어떠한 커맨드 패킷들(30-34)(및 지정된 곳에서는 데이터 패킷(36))이 그 커맨드에 대해 이용되는 지를 나타내는 패킷 타입 칼럼을 포함한다.
판독 트랜잭션은 ReadSized, RdBlk, RdBlkS 또는 RdBlkMod 커맨드들중 하나를 이용하여 시작된다. ReadSized 커맨드는 넌 캐시어블 판독들 또는 크기에 있어서 캐시 블록이 아닌 데이터의 판독에 이용된다. 판독될 데이터의 양은 ReadSized 커맨드 패킷으로 엔코드된다. 캐시 블록의 판독에 있어서, RdBlk 커맨드는, (i) 캐시 블록의 기록가능한 카피가 바람직하지 않다면, RdBlkMod 커맨드가 이용될 수 있다; (ii) 캐시 블록의 카피가 바람직하지만 블록을 변형하는 어떠한 의도도 알려져있는 않는 경우에 이용될 수 있는데, 이러한 경우 RdBlkS 커맨드가 이용될 수 있다. RdBlkS 커맨드는 특정한 타입의 코히런시 구성(예를 들어, 디렉토리 기반 코히런시 구성)을 보다 효율적으로 하는 데에 이용될 수 있다. 일반적으로, 적절한 판독 커맨드가 트랜잭션을 시작하는 소스로부터, 캐비 블록에 대응하는 메모리를 소유하는 타겟 노드에 전송된다. 타겟 노드 내의 메모리 제어기는 (트랜잭션들의 소스로의 프로브 응답의 리턴을 나타내는) Probe 커맨드를 시스템 내의 다른 노드에 전송하여, 노드들 내의 캐시 블록의 상태를 변경하고, 캐시 블록의 갱신된 카피를 포함하는 노드가 캐시 블록을 소스 노드로 전송하게 함으로써 코히런시를 유지한다. Probe 커맨드를 수신하는 각 노드는 ProbeResp 응답 패킷을 소스 노드에 전송한다. 프로브 노드가 판독 데이터의 갱신된 카피(즉, 더티 데이터)를 갖는 다면, 그 노드는 RdResponse 응답 패킷 및 더티 데이터를 전송한다. 더티 데이터를 전송하는 노드는 또한, 요구된 판독 데이터의 타겟 노드에 의한 전송을 취소하고자 하는 시도시, MemCancel 응답 패킷을 타겟 노드에 전송한다. 또한, 타겟 노드 내의 메모리 제어기는 데이터 패킷 내의 데이터가 그 뒤를 따르는 RdResponse 응답 패킷을 이용하여 요구된 판독 데이터를 전송한다. 소스 노드가 프로브 노드로부터 RdResponse 응답 패킷을 수신한다면, 그 판독 데이터가 이용된다. 그렇지 않으면, 타겟 노드로부터의 데이터가 이용된다. 일단 각각의 프로브 응답들 및 판독 데이터가 소스 노드에 수신되면, 소스 노드는 타겟 노드에 트랜잭션 종료의 포지티브 승인으로서 SrcDone 응답 패킷을 전송한다.
기록 트랜잭션은 대응하는 데이터 패킷이 그 뒤를 따르는 WrSized 또는 VicBlk 커맨드를 이용하여 시작된다. WrSized 커맨드는 넌 캐시어블 기록들 또는 크기에 있어서 캐시 블록이 아닌 다른 데이터의 기록들에 이용된다. WrSized 커맨드들에 대한 코히런시를 유지하기 위해, 타겟 노드 내의 메모리 제어기는 (트랜잭션의 타겟 노드에 대한 프로브 응답의 리턴을 나타내는) Probe 커맨드들을 시스템 내의 각각의 다른 노드에 전송한다. Probe 커맨드에 응답하여, 각 프로브 노드는 ProbeResp 응답 패킷을 타겟 노드에 전송한다. 프로브 노드가 더티 데이터를 저장하고 있다면, 프로브 노드는 RdResponse 응답 패킷 및 더티 데이터에 응답한다. 이러한 방식으로, WrSized 커맨드에 의해 갱신된 캐시 블록은 WrSized 커맨드에 의해 제공되는 데이터와의 병합을 위해 메모리 제어기로 리턴된다. 각각의 프로브 노드들로부터 프로브 응답들을 수신하게 되면, 메모리 제어기는 TgtDone 응답 패킷을 소스 노드에 전송하여 트랜잭션 종료에 대한 포지티브 승인을 제공한다. 소스 노드는 SrcDone 응답 패킷에 응답한다.
노드에 의해 변형되었으며 노드 내의 캐시 내에 대체되는 빅팀 캐시 블록이 VicBlk 커맨드를 이용하여 메모리에 다시 전송된다. VicBlk 커맨드에 대한 프로브들은 요구되지 않는다. 따라서, 타겟 메모리 제어기가 빅팀 블록 데이터를 메모리로 전달하도록 준비될 때, 타겟 메모리 제어기는 TgtDone 응답 패킷을 빅팀 블록의 소스 노드에 전송한다. 소스 노드는 데이터가 전송되어야 하는 지를 나타내기 위해 SrcDone 응답 패킷에 응답하거나, 또는 (예를 들어, 중간 프로브에 응답하여) 데이터가 VicBlk 커맨드의 전송 및 TgtDone 응답 패킷의 수신 간에서 무효화되었는 지를 나타내기 위해 MemCancel 응답 패킷에 응답한다.
기록이 불가능한 상태(non-writeable)에서 소스 노드에 의해 저장된 캐시 블록에 대한 기록 허가를 얻기 위해, ChangetoDirty 커맨드 패킷이 소스 노드에 의해 전송될 수 있다. ChangetoDirty 커맨드에 의해 시작된 트랜잭션은 타겟 노드가 데이터를 리턴시키지 않는 것을 제외하고는 판독과 유사하게 동작할 수 있다. ValidateBlk 커맨드는 소스 노드가 전체 캐시 블록을 갱신하고자 하는 경우, 소스 노드에 의해 저장되지 않은 캐시 블록에 대한 기록 허가를 얻는 데에 이용될 수 있다. 이러한 트랜잭션에 대해 어떠한 데이터도 소스 노드에 전송되지 않지만, 그렇지 않으면 판독 트랜잭션과 유사하게 동작한다.
Nop info 패킷은, 예를 들어 노드들 간에 빈 버퍼 표시를 전송하는 데에 이용될 수 있는 비연산 패킷이다. Broadcast 커맨드는 노드들 간에 메세지들을 방송하는 데에 이용될 수 있다(예를 들어, Broadcast 커맨드는 인터럽트를 분배하는 데에 이용될 수 있다). 마지막으로, sync info 패킷은, 구조의 동기가 바람직한 경우(예를 들어, 에러 검출, 리셋, 초기화 등)에 대해 이용될 수 있다.
표(38)는 또한 가상 채널 칼럼(Vchan)을 포함한다. 가상 채널 칼럼은 각 패킷이 이동하는(즉, 각 패킷이 속해 있는) 가상 채널을 나타낸다. 본 실시예에서는, 3개의 가상 채널: 커맨드(C), 응답(R) 및 프로브(P)가 규정된다. 이제, 가상 채널에 대해 보다 상세하게 설명한다. info 패킷들은 인접하는 노드들 간의 통신에 이용되며, 이에 따라 본 실시예에서는 가상 채널들에 할당되지 않을 수 있다는 것을 유념하자.
가상 채널
도 8은 가상 채널을 도시한 블록도이다. 도 8에서는, 2개의 가상 채널들(가상 채널들(40A-40B))이 도시된다. 각 처리 노드들(12A-12D)은 가상 채널들(40A-40B)에 결합된다. 도 8은 단지 예시적으로 2개의 가상 채널들을 도시한다. 다른 실시예들은 어떠한 적절한 수의 가상 채널들을 이용할 수 있다. 예를 들어, 컴퓨터 시스템(10)의 실시예는 하기에서 설명되는 도 9에서와 같이 4개의 가상 채널들을 이용할 수 있다.
일반적으로, "가상 채널"은 다양한 처리 노드들 간에 패킷을 전달하는 통신 경로이다. 각 가상 채널은 다른 가상 채널과 리소스 독립적이다. (즉, 1개의 가상 채널 내에서 이동하는 패킷들은 일반적으로 물리적인 전송 측면에서, 다른 가상 채널 내의 패킷들의 존재 또는 부재에 의해 영향을 받지 않는). 패킷들은 패킷 타입에 기초하여 가상 채널에 할당된다. 동일한 가상 채널 내의 패킷들은 서로의 전송에 의해 물리적으로 충돌할 수 있지만(즉, 동일한 가상 채널 내의 패킷들은 리소스 충돌을 경험할 수 있지만), 다른 가상 채널 내의 패킷들의 전송과는 물리적으로 충돌하지 않는다.
특정한 패킷들은 다른 패킷들과 논리적으로 충돌할 수 있다(즉, 프로토콜 이유, 코히런시 이유, 또는 다른 이유로 인해, 한 패킷이 다른 패킷과 논리적으로 충돌할 수 있다). 논리/프로토콜 이유로, 제 2 패킷이 그 목적지 노드에 도달하기 전에 제 1 패킷이 그 목적지에 도달해야 하는 경우, 제 2 패킷이 (충돌 리소스를 점유함으로써) 제 1 패킷의 전송을 물리적으로 차단하는 경우, 컴퓨터 시스템은 데드락될 수 있게 된다. 제 1, 2 패킷들을 개별적인 가상 채널들에 할당함으로써, 그리고 개별적인 가상 채널들 내의 패킷들의 서로의 전송을 차단하지 않도록 컴퓨터 시스템 내에서 전송 매체를 실행시킴으로써, 데드락이 없이 동작한다. 주목할 사항으로서, 다른 가상 채널들로부터의 패킷들은 동일한 물리적인 링크(예를 들어, 도 1의 라인들(24))를 통해 전송된다. 하지만, 수신 버퍼는 전송 이전에 이용가능하기 때문에, 가상 채널들은 이러한 공유 리소스를 이용하는 동안 조차도 서로를 차단하지 않는다.
한 관점에서, 각각의 다른 패킷 타입(예를 들어, 각각의 다른 커맨드 엔코딩)이 그 자신의 가상 채널에 할당될 수 있다. 하지만, 가상 채널들이 물리적으로 충돌하지 않음을 보장하는 하드웨어는 가상 채널의 수에 따라 증가한다. 예를 들어, 일 실시예에서, 각 가상 채널에 개별적인 버퍼들이 할당된다. 이러한 개별적인 버퍼들은 각 가상 채널에 대해 이용되기 때문에, 하나의 가상 채널로부터의 패킷들은 (패킷들이 다른 버퍼들 내에 위치되기 때문에) 다른 가상 채널로부터의 패킷들과 물리적으로 충돌하지 않는다. 하지만, 버퍼의 수는 가상 채널의 수에 비례한다. 따라서, 논리/프로토콜 형태로 충돌하지 않는 다양한 패킷 타입들을 결합시킴으로써 가상 채널들의 수를 줄이는 것이 바람직하다. 이러한 패킷들이 동일한 가상 채널 내에서 이동할 때에 서로 물리적으로 충돌하는 동안, 논리적인 충돌의 부족(lack)에 의해 리소스 충돌이 데드락없이 해결될 수 있다. 유사하게, 개별적인 가상 채널들 내에서 서로 논리적으로 충돌하는 패킷들을 유지하게 되면, 패킷들 간에 어떠한 리소스 충돌도 없게 한다. 따라서, 논리적인 충돌은, 완료된 패킷을 먼저 진행시킴으로써 패킷들 간의 리소스 충돌의 부족을 통해 해결된다.
일 실시예에서, 특정 소스 노드로부터 특정 목적지 노드로, 코히런트 링크 상에서 특정 가상 채널 내에서 이동하는 패킷들은 순서 대로 유지된다. 그러나, 다른 가상 채널들 내에서 이동하는, 특정 소스 노드로부터 특정 목적지 노드로의 패킷들은 순서대로 배열되지 않는다. 유사하게, 특정 소스 노드로부터 다른 목적지 노드로, 또는 다른 소스 노드로부터 동일한 목적지 노드로의 패킷들은 (동일한 가상 채널 내에서 이동한다고 할지라도) 순서대로 배열되지 않는다.
가상 채널들은 코히런트 구조 상에, 그리고 넌코히런트 구조 상에 물리적으로 맵핑된다(도 19 참조). 따라서, 다양한 가상 채널들 내에서 이동하는 패킷들은 단방향 링크들 상에서 물리적으로 전송된다. 패킷들은 소스 및 목적지 간에서 중간 노드들을 통해 이동할 수 있다. 예를 들어, 노드(12A)로부터 노드(12D)로 이동하는 패킷들은 노드들(12B 및 12C)을 통과할 수 있다. 다른 가상 채널들 내에서 이동하는 패킷들은 컴퓨터 시스템(10)을 통해 개별적으로 라우팅될 수 있다. 예를 들어, 노드(12A)로부터 노드(12D)로 제 1 가상 채널 내에서 이동하는 패킷들은 노드(12B)를 통과할 수 있으며, 노드(12A)로부터 노드(12D)로 제 2 가상 채널 내에서 이동하는 패킷들은 노드(12C)를 통과할 수 있다. 각 노드는 다른 가상 채널들 내의 패킷들이 서로 물리적으로 충돌하지 않도록 보장하는 회로를 포함한다. 넌코히런트 구조에서, I/O 노드로부터의 패킷들은 I/O 노드와 호스트 브리지 간에서 각 I/O 노드를 통과할 수 있다(도 19 참조). I/O 노드들은 도 8에 도시된 것과 동일한 방식으로 가상 채널들에 결합될 수 있다.
하기에서 보다 상세하게 설명되는 일 특정 실시예에서, 제어 패킷 버퍼들이 각 가상 채널에 할당되어 그 가상 채널 내에서 이동하는 제어 패킷들을 버퍼링한다. 개별적인 데이터 패킷 버퍼들이 또한, 데이터 패킷들을 전달할 수 있는 각 가상 채널에 할당된다. 제어 패킷 버퍼들(이의 각 엔트리는 비교적 적은 수의 비트 타임들을 포함할 수 있음)과 데이터 패킷 버퍼들(이의 각 엔트리는 캐시 블록을 보유하기 위한 비교적 많은 수의 비트 타임을 포함할 수 있다)을 분리함으로써, 적절한 데이터 저장 공간을 여전히 제공하면서 버퍼 공간을 절약할 수 있다. (모든 데이터 패킷들은 대응하는 제어 패킷을 갖지만, 모든 제어 패킷들이 대응하는 데이터 패킷을 갖는 것은 아니기 때문에), 데이터 패킷 버퍼들 보다 제어 패킷 버퍼들이 보다 많이 구현될 수 있다. 생산량은 버퍼 공간을 비교적 효율적으로 이용하면서 높아진다.
도 9는 컴퓨터 시스템(10)의 일 실시예에 따라 규정된 가상 채널들을 도시하는 표(42)이다. 다른 실시예들이 또한 가능하며 고려된다. 도시된 실시예에서는, 3개의 가상 채널들이 규정된다. 도 7은 코히런트 링크에 대해 이러한 가상 채널들에 속하는 패킷들을 도시하며, 도 20은 넌코히런트 링크에 대해 이러한 가상 채널들에 속하는 패킷들을 도시한다.
커맨드 가상 채널은 커맨드 패킷들 (및 대응하는 데이터 패킷들)에 이용된다. 일반적으로, 커맨드들은 트랜잭션들을 시작하며, 이에 따라 커맨드는 부가적인 커매드 패킷들의 전송을 야기시키지 않는다. 또한, 다양한 커맨드 패킷들은 서로 논리/프로토콜 충돌되지 않는데, 이는 이들이 목적지(트랜잭션의 타겟)에 이를 때 까지, 이들 간에 어떠한 순서도 없기 때문이다. 따라서, 커맨드 패킷들은 하나의 가상 채널에 포함될 수 있다.
커맨드들은 (코히런트 구조내에서 코히런시를 유지하는) 프로브 커맨드 패킷들 및 (데이터를 전송하고 트랜잭션들이 포지티브 승인을 제공하는) 응답 패킷들을 발생시킨다. 따라서, 프로브 패킷들 및 응답 패킷들은 (리소스 충돌 및 논리 충돌이 데드락을 생성하는 것을 막기 위해) 커맨드처럼 동일한 가상 채널 내에 포함되지 않는다. 또한, 프로브 패킷들은 프로브 응답 및 판독 응답 패킷을 발생시키며, 이에 따라 응답 패킷들로부터 개별적인 가상 채널 내에 위치된다.
응답 패킷들은 또한 부가적인 응답 패킷들을 발생시킬 수 있다(예를 들어, SrcDone 및 TgtDone는 서로를 발생되게 할 수 있다). 이에 따라, 응답 패킷들이 이들을 동일한 가상 채널 내에 위치시킴으로써 다른 응답 패킷들 간의 논리적인 충돌을 생성할 수 있게 된다. 하지만, 다수의 응답 가상 채널들을 제공하는 것은 부가적인 가상 채널들을 처리하기 위한 증가된 리소스 필요물(예를 들어, 버퍼들)로 인해 바람직하지 않을 수 있다. 응답 패킷들은 (예를 들어, 커맨드 패킷에 응답하여 발생된 프로브를 통해) 직접 또는 간접적으로, 커맨드 패킷의 결과가 된다. 노드들(12A-12D) (및 하기 도시되는 I/O 노드)는, 커맨드 패킷에 의해 트랜잭션을 시작하기 전에, 트랜잭션 동안 발생될 수 있는 (모든 응답 데이터 패킷들을 포함하는) 응답 패킷을 처리하기 위한 충분한 리소스를 할당하도록 구성된다. 유사하게, 프로브 커맨드 패킷을 발생시키기 전에, 노드는 (응답 패킷이 그 노드로 리턴되는 경우), 프로브 응답 패킷들을 처리하기 위한 충분한 리소스들을 할당하도록 구성된다. 이러한 방식으로, 모든 응답 패킷들은 목적지 노드에 의해 수신된다. 따라서, 응답 패킷들은 1개의 응답 가상 채널 내에 통합될 수 있게 된다. 응답 패킷들 (및 대응하는 데이터 패킷들)은 응답 가상 채널 내에서 이동한다.
마지막으로, 프로브 커맨드 패킷들은 프로브 가상 채널 내에서 이동한다. 프로브들은 메모리 위치의 다양한 캐시 카피들 및 메모리 위치 그 자체 간의 코히런시를 유지하는 데에 이용된다. 메모리 제어기에 의해 처리되는 제 1 커맨드 패킷에 대응하는 코히런시 동작들은 이후의 커맨드 패킷들이 완료되기 전에 완료될 필요가 있을 수 있다. 예를 들어, 메모리 제어기의 큐가 동일한 캐시 블록에 대한 커맨드들로 가득차 있는 경우, 제 1 커맨드가 완료될 때 까지 메모리 제어기에서 어떠한 부가적인 커맨드 패킷들의 처리도 일어나지 않는다. 따라서, 프로브 커맨드 패킷들 (및 응답들)이 개별적인 가상 채널들에 제공되어, 다른 가상 채널들 내의 패킷들과의 리소스 충돌이 프로브 커맨드 패킷들을 막지 못하게 된다.
표(42)는 또한, 가상 채널들이 적용가능한 컴퓨터 시스템(10) 내의 링크들(코히런트 노드들 간의 코히런트 링크들, 및 넌 코히런트 노드들 간의 넌 코히런트 링크들)의 형태를 나타낸다. 넌 코히런트 및 코히런트 링크들은 커맨드 및 응답 가상 채널들을 지원한다. 넌 코히런트 링크들은 (프로브 커맨드 패킷들이 보장하는 데에 이용되는) 코히런시를 지원하며, 이에 따라 프로브 가상 채널은 지원하지 않을 수 있다.
가상 채널들 - 코히런트 구조
도 10은 예시적인 처리 노드(12A)의 일 실시예의 블록도를 도시한다. 다른 처리 노드들(12B-12D)도 유사하게 구성될 수 있다. 다른 실시예들이 또한 가능하며 고려된다. 도 10의 실시예에서, 처리 노드(12A)는 인터페이스 로직들(18A, 18B 및 18C)과 메모리 제어기(16A)를 포함한다. 또한, 처리 노드(12A)는 프로세서 코어(52), 캐시(50), 및 패킷 처리 로직(58)을 포함하며, 그리고 제 2 프로세서 코어(56) 및 제 2 캐시(54)를 선택적으로 포함한다. 인터페이스 로직들(18A-18C)은 패킷 처리 로직(58)에 결합된다. 프로세서 코어들(52 및 56)은 각각 캐시들(50 및 54)에 결합된다. 캐시들(50 및 54)은 패킷 처리 로직(58)에 결합된다. 패킷 처리 로직(58)은 메모리 제어기(16A)에 결합된다.
일반적으로, 패킷 처리 로직(58)은 처리 노드(12A)가 결합된 링크 상에서 수신되는 제어 패킷들에 응답하도록, 캐시들(50 및 54) 그리고/또는 처리 코어들(52 및 56)에 응답하여 제어 패킷들을 발생시키도록, 서비스를 위해 메모리 제어기(16A)에 의해 선택된 트랜잭션들에 반응하여 프로브 커맨드들 및 응답 패킷들을 발생시키도록, 그리고 노드(12A)가 중간 노드가 되는 패킷들을 다른 노드로의 전송을 위해 인터페이스 로직들(18A-18C)중 다른 것으로 라우팅시키도록 구성된다. 인터페이스 로직들(18A, 18B 및 18C)은, 패킷들을 수신한 다음 이 패킷들을 패킷 처리 로직(58)에 의해 이용되는 내부 클록에 대해 동기화시키는 로직을 포함할 수 있다.
패킷 처리 로직(58)은 컴퓨터 시스템(10)에 의해 지원되는 가상 채널들의 리소스 독립을 지원하는 하드웨어를 포함할 수 있다. 예를 들어, 패킷 처리 로직(58)은 각 가상 채널에 대해 개별적인 버퍼들을 제공할 수 있다. 도 11은 예시적인 실시예를 도시한다. 대안적인 실시예들은 인터페이스 로직들(18A-18C) 또는 다른 모든 적절한 위치 내에서 가상 채널들의 리소스 독립을 지원하는 하드웨어를 제공할 수 있다.
캐시들(50 및 54)은 데이터의 캐시 블록들을 저장하도록 구성된 고속의 캐시 메모리들을 포함한다. 캐시들(50 및 54)은 개별적인 프로세서 코어들(52 및 56) 내에 통합될 수 있다. 대안적으로, 캐시들(50 및 54)은 바람직한 경우, 이면 캐시 구성 또는 인라인(in-line) 구성으로 프로세서 코어들(52 및 56)에 결합될 수 있다. 또한, 캐시들(50 및 54)은 캐시들의 계급 조직(hierarchy)으로서 구현될 수 있다. (계급 조직 내의) 프로세서 코어들(52 및 56)에 보다 더 가까이 있는 캐시들은 필요에 따라 프로세서 코어들(52 및 56) 내에 통합될 수 있다.
프로세서 코어들(52 및 56)은 미리 규정된 명령 세트에 따라 명령들을 실행하는 회로를 포함한다. 예를 들어, x86 명령 세트 구조가 선택될 수 있다. 또한, 알파(Alpha), 파워피씨(PowerPC), 또는 다른 모든 명령 세트 구조가 선택될 수 있다. 일반적으로, 프로세서 코어들은 데이터 및 명령들에 대해 캐시들을 액세스한다. 캐시 미스(miss)가 검출된다면, 판독 요구가 발생된 다음, 미싱 캐시 블록이 맵핑된 노드 내의 메모리 제어기로 전송된다.
도 11은 패킷 처리 로직(58)의 일 실시예의 블록도이다. 다른 실시예들이 또한 가능하며 고려된다. 도 11의 실시예에서, 패킷 처리 로직(58)은 제 1 세트의 제어 및 데이터 패킷 버퍼들(60), 제 2 세트의 제어 및 데이터 패킷 버퍼들(62), 제 3 세트의 제어 및 데이터 패킷 버퍼들(64), 제어 로직(66), 데이터 버퍼 풀(68), 및 응답 카운터 풀(70)을 포함한다. 제어 및 데이터 패킷 버퍼들(60)은 커맨드 버퍼(CB)(60A), 응답 버퍼(RB)(60B), 프로브 버퍼(PB)(60C), 커맨드 데이터 버퍼(CDB)(60D) 및 응답 데이터 버퍼(RDB)(60E)를 포함한다. 유사하게, 제어 및 데이터 패킷 버퍼들(62)은 커맨드 버퍼(CB)(62A), 응답 버퍼(RB)(62B), 프로브 버퍼(PB)(62C), 커맨드 데이터 버퍼(CDB)(62D) 및 응답 데이터 버퍼(RDB)(62E)를 포함한다. 제어 및 데이터 패킷 버퍼들(64)은 커맨드 버퍼(CB)(64A), 응답 버퍼(RB)(64B), 프로브 버퍼(PB)(64C), 커맨드 데이터 버퍼(CDB)(64D) 및 응답 데이터 버퍼(RDB)(64E)를 포함한다. 제어 및 데이터 패킷 버퍼들(60)은 (예를 들어 라인들(24B) 상으로) 인터페이스 로직(18A)에 의해 수신된 패킷을 수신하도록 결합된다. 유사하게, 제어 및 데이터 패킷 버퍼들(62)은 인터페이스 로직(18B)에 의해 수신된 패킷을 수신하도록 결합되며, 제어 및 데이터 패킷 버퍼들(64)은 인터페이스 로직(18C)에 의해 수신된 패킷을 수신하도록 결합된다. 제어 및 데이터 패킷 버퍼들(60, 62 및 64)은 제어 로직(66)에 결합된다. 또한, 응답 데이터 버퍼들(60E, 62E 및 64E)은 데이터 버퍼 풀(68)에 결합된다. 데이터 버퍼 풀(68) 및 응답 카운터 풀(70)은 제어 로직(66)에 결합되며, 이는 노드 ID 레지스터(72), 제어 패킷 액티브 레지스터들(74A-74C) 및 데이터 패킷 액티브 레지스터(76A-76C)를 더 포함한다. 제어 로직(66)은 수신 및 전송 인터페이스를 통해 인터페이스들(18A-18C)에 결합되며, 메모리 제어기(16A)와 캐시(50) (및 임의 캐시(54))에 결합된다. 데이터 버퍼 풀(68)은 또한 메모리 제어기(16A)와 캐시(50) 및 (임의 캐시(54))에 결합된다.
각 세트의 제어 및 데이터 패킷 버퍼들은 각 가상 채널들에 다른 버퍼들을 제공한다. 즉, 본 실시예에서, 커맨드 버퍼(60A)는 커맨드 가상 채널에 할당되고, 응답 버퍼(60B)는 응답 가상 채널에 할당되며, 그리고 프로브 버퍼(60E)는 프로브 가상 채널에 할당된다. 이러한 방식으로, 한 가상 채널에서의 제어 패킷들의 수신은 다른 가상 채널에서의 제어 패킷들의 수신에 의해 방해를 받지 않는다. 각 가상 채널로부터의 제어 패킷들은 그 가상 채널에 대응하는 제어 패킷 버퍼에 저장되며, 이에 따라 (다른 제어 패킷 버퍼에 저장된) 다른 가상 채널로부터의 제어 패킷들과 물리적으로 충돌하지 않는다. 버퍼들(62 및 64) 내의 유사하게 명명되는 버퍼들은 상기 설명한 바와 같이 가상 채널들에 할당된다.
유사하게, 데이터 패킷 버퍼들이 데이터 패킷들을 전달하는 각 가상 채널에 제공된다(본 실시예에서 프로브 가상 채널은 데이터 패킷들을 전달하지 않는다). 즉, 본 실시예에서, 커맨드 데이터 버퍼(60D)는 커맨드 가상 채널에 할당되며, 응답 데이터 버퍼(60E)는 응답 가상 채널에 할당된다. 버퍼들(62 및 64) 내의 유사하게 명명된 버퍼들은 상기 설명한 바와 같이 가상 채널들에 할당된다.
본 실시예에서, 인터페이스 로직들(18A-18C)은 수신된 패킷들을 (제어 경로 상에 제공되는) 제어 패킷들과 (데이터 경로 상에 제공되는) 데이터 패킷들로 분할된다. 제어 경로는 제어 패킷 버퍼들에 결합되고(예를 들어, 버퍼들(60A-60C)은 인터페이스 로직(18A)으로부터 제어 경로에 결합된다), 그리고 데이터 경로는 데이터 패킷 버퍼들에 결합된다(예를 들어, 버퍼들(60D-60E)은 인터페이스 로직(18A)으로부터 데이터 경로에 결합된다). 제어 로직(66)은 수신 및 전송 인터페이스를 통해 패킷의 표시를 수신하도록 결합되며, 수신되는 패킷에 대한 버퍼 엔트리를 할당하도록 구성된다. 고려되는 다른 실시예들에서, 수신된 패킷들은 인터페이스 로직에 의해 제어 및 데이터 패킷들로 분할되지 않는다. 이러한 실시예들에서, 제어 로직(66)은 데이터 패킷들의 비트 타임들과 제어 패킷들의 비트 타임들을 구별하는 CTL 신호를 수신할 수 있다.
일반적으로, 제어 로직(66)은 다른 버퍼들 내의 패킷들과 독립적으로 다양한 버퍼들로부터의 패킷들을 처리하도록 구성된다. 따라서, 다른 가상 채널들 내에서 이동하는 패킷들은 서로 물리적으로 충돌하지 않는다.
제어 로직(66)은 버퍼들(60, 62 및 64) 내의 제어 패킷들을 검사하여, 제어 패킷들이 노드(12A)("이 노드(this node)")에 지정되었는지, 아니면 다른 노드로 전송될 것인 지를 결정한다. 노드 ID 레지스터(72)는 이 노드의 노드 ID를 저장하고, 제어 로직(66)은 노드 ID를 이용하여 제어 패킷들이 이 노드에 지정되었는 지를 결정한다. 본 실시예에서, 프로브 가상 채널 내의 패킷들은 방송 패킷들이며, 이에 따라 이 노드, 및 이 노드가 패킷을 전송하게 될 다른 노드에 지정되며, (이에 따라 노드 ID 비교는 이용되지 않는다). 다른 가상 채널들 내의 패킷들은 지시된(directed) 패킷들로서, 목적지 노드 필드가 패킷이 이 노드에 지정되었는지, 아니면 다른 노드로 전송될 것인 지를 식별한다. 제어 로직(66)은, 각 목적지 노드에 대해, 인터페이스 로직들(18A-18C)이 패킷을 전송하는 데에 이용될 것인 지를 표시하는 1개 또는 그 이상의 라우팅 표들을 포함할 수 있다. 제어 로직(66)은, 식별된 인터페이스 로직들(18A-18C)을 통해 전송된 패킷들을 수신하도록 결합된 수신 노드가 제어 패킷에 대응하는 가상 채널에 대해 빈 제어 패킷 버퍼를 가질 때, 제어 패킷을 전송할 수 있다. 또한, 제어 패킷이 데이터 패킷을 지정한다면, 제어 패킷, 및 이후 지정된 데이터 패킷을 전송하기 전에, 제어 패킷에 대응하는 가상 채널에 대한 빈 데이터 패킷 버퍼가 식별된다. 제어 로직(66)은 제어 패킷 (및 지정된 경우, 데이터 패킷)이 전송될 것인 지를 결정하고, 수신 및 전송 인터페이스를 이용하여 패킷을 식별된 인터페이스 로직들(18A-18C)로 전송한 다음, 이후 패킷을 수신 노드로 전송한다. 또한, 제어 로직(66)은 대응하는 타입의 버퍼가 비었음을 주목하며, 이에 따라 이후의 정보 패킷이 패킷이 노드(12A)에 의해 수신되었던 인터페이스들(18A-18C)을 통해 전송되어, 수신 인터페이스 상의 전송 노드에 빈 버퍼를 나타낼 수 있다.
한편, 제어 패킷이 이 노드에 대해 지정된다면, 제어 로직(66)은 패킷의 타입에 기초하여 패킷을 처리한다. 예를 들어, 제어 패킷이 메모리 제어기(16A)에서 목표로 하는 커맨드라면, 제어 로직(66)은 제어 패킷을 메모리 제어기(66)로 전달하자 시도한다. 메모리 제어기(16A)는 처리될 트랜잭션들에 대한 큐들을 이용할 수 있으며, 예를 들어 큐들이 가득찰 경우에는 제어 패킷을 거절할 수 있다. 프로브 패킷들을 처리하기 위해, 제어 로직(66)은 캐시들(50 및 54) (및 프로세서 코어들(52 및 56) 내부의 모든 캐시들)과 통신할 수 있다. 제어 로직(66)은 상태를 갖는 프로브 응답 패킷 (또는 캐시 블록이 노드 내에서 변형된 경우에는, 데이터를 갖는 판독 응답 패킷)을 발생시키고, (이용가능한 수신 노드 버퍼들을 필요로 하는) 프로브 응답 패킷을 전송할 수 있다.
수신된 패킷들을 처리하는 것에 부가하여, 제어 로직(66)은 필(fill) 요구 및 캐시들(50 및 54)로부터의 빅팀 블록에 응답하여 패킷을 발생시킬 뿐 아니라, 프로세서 코어들(52 및 56)로부터 직접적으로 비롯되는 요구(예를 들어, 넌캐시어블 요구, I/O 요구 등)에 응답하여 패킷을 발생시킬 수 있다. 또한, 응답 패킷은 트랜잭션의 전송 또는 완료를 위해 데이터를 제공하는 메모리 제어기에 응답하여 발생될 수 있다. 제어 로직(66)은 처리를 위한 대응 커맨드를 선택하는 메모리 제어기(16A)에 응답하여 프로브 커맨드 패킷을 발생시킬 수 있으며, 그리고 (다른 패킷 전송처럼, 이용가능한 수신 노드 버퍼들을 필요로 하는) 프로브 커맨드 패킷을 방송할 수 있다.
상기 설명한 바와 같이, 노드는 그 노드에 의해 발생된 제어 패킷에 대응하는 응답 패킷들을 처리하기 위한 충분한 리소스들을 제공한다. 본 실시예에서, 제어 로직(66)은 두 경우들에 있어서, 즉 (i) (예를 들어, 캐시들(50 및 54) 또는 프로세서 코어들(52 및 56)로부터의 요구들에 응답하여) 트랜잭션을 시작하는 커맨드 패킷을 발생시킬 때, 그리고 (ii) 메모리 제어기(16A)를 목표로 하는 제어 패킷에 대한 프로브 패킷을 발생시킬 때, 노드로 리턴되는 응답 패킷들이 되는 패킷들을 발생시킬 수 있다. 보다 명확하게 설명하면, 경우 (ii)는 메모리 제어기(16A)를 목표로 하는 크기가 정해진(sized) 기록들에 대해 일어날 수 있다. 어느 경우에 있어서, 제어 로직(66)은 응답 패킷들의 처리를 위해 리소스들을 할당한다.
본 실시예에서, 제어 로직(66)은 응답들을 처리하기 위해 데이터 버퍼 풀(68) 및 응답 카운터 풀(70)로부터의 리소스들을 할당한다. 데이터 버퍼 풀(68)은 데이터의 캐시 블록들을 저장하는 다수의 엔트리들을 포함할 수 있으며, 응답 카운터 풀(70)은 다수의 카운터들을 포함할 수 있다. 데이터 버퍼 풀 엔트리는 트랜잭션에 대응하는 응답 데이터를 저장하도록 할당될 수 있다. 카운터는 수신된 응답들을 카운트하고 (그리고 프로브 응답들 내에 제공될 수 있는 모든 상태 정보를 보유하도록) 할당될 수 있다. 응답 패킷들은 할당된 카운터를 이용하여 (응답들의 기대 수에 이를 때 까지) 카운트될 수 있으며, 응답 패킷에 의해 수신되는 데이터는 할당된 데이터 버퍼 내에 저장될 수 있다. 주목할 사항으로서, 트랜잭션 내에 포함된 기껏해야 2개의 응답 패킷들이 데이터(응답 패킷을 전송하기 전에 MemCancel 응답 패킷이 메모리 제어기에 도달하지 못하는 경우에는 목표 메모리 제어기로부터의 것, 그리고 데이터의 변형된 캐시된 카피를 갖는 프로브 노드로부터의 것)를 전달할 수 있다. 2개의 데이터 패킷들이 수신되는 경우, 프로브 노드로부터의 패킷은 보유되며 메모리 제어기로부터의 패킷은 버려진다.
일단 각각의 기대 응답들이 수신되고 응답 데이터가 수신된다면, 제어 로직(66)은 수행되는 트랜잭션의 타입에 따라, 데이터를 메모리 제어기(16A) 또는 캐시들(50 또는 54)에 전송할 수 있다. 예를 들어, 응답들이 패킷 처리 로직(58)에 의해 발생된 프로브 커맨드에 응답하여 발생된 프로브 응답들이라면, 응답 데이터는 메모리 제어기(16A)에 전송될 수 있다. 또한, 응답들이 판독 트랜잭션에 기인한다면, 데이터는 캐시들(50 또는 54)에 전송될 수 있다.
주목할 사항으로서, 데이터 버퍼 풀(68)은 또한 노드(12A)로부터 전송될 데이터를 저장하는 데에 이용될 수 있다. 예를 들어, 노드(12A)로부터 비롯된 기록 커맨드들에 대한 빅팀 블록 데이터 또는 기록 데이터는 데이터 버퍼 풀(68)에 저장될 수 있다. 또한, 개별적인 버퍼들이 이러한 데이터에 대해 제공될 수 있다. 또한, 다양한 트랜잭션들에 대해 이용될 수 있는 버퍼들의 풀을 제공하는 대신, 필요에 따라 트랜잭션 타입에 의해 개별적인 버퍼들이 제공될 수 있다.
본원에서 이용되는 바와 같이, 버퍼는 이후의 검색을 위해 1개 또는 그 이상의 정보 항목들을 저장하는 데에 이용되는 저장 요소이다. 버퍼는 1개 또는 그 이상의 레지스터, 래치, 플립 플롭, 또는 다른 클록 저장 장치를 포함할 수 있다. 또한, 버퍼는 적절히 배열된 임의 접속 메모리(RMA) 셀들의 세트를 포함할 수 있다. 버퍼는 다수의 엔트리들로 분할되는바, 각 엔트리는 버퍼가 설계된 정보의 한 항목을 저장하도록 설계된다. 엔트리들은 어떠한 적절한 방법으로 할당되고 할당이 해제될 수 있다. 예를 들어, 버퍼는 더 오래된 엔트리들이 삭제될 때 마다 엔트리들이 시프트 다운되는, 시프팅 선입선출(FIFO) 버퍼로서 동작할 수 있다. 또한, 헤드 및 꼬리 포인터들은 버퍼 내의 가장 오래된 그리고 가장 최근의 엔트리들을 표시하는 데에 이용될 수 있으며, 엔트리들은 삭제될 때 까지 버퍼의 특정한 저장 위치에 유지될 수 있다. 본원에서 이용되는 "제어 로직"이란 용어는 입력들에 대해 연산들을 수행하고 설명된 연산들을 이루기 위해 그에 응답하여 출력들을 발생시키는 결합 로직 그리고/또는 상태 머신들의 모든 결합을 말한다.
일 특정 실시예에서, 패킷들은 일련의 비트 타임들로서 인터페이스 로직들(18A-18B)로부터 수신된다. 인터페이스 로직들(18A-18C)은 제어 또는 데이터 비트 타임들이 전송되고 있는 지를 나타내며, 제어 로직(66)은 적절한 버퍼들의 비트 타임들을 저장하게 한다. 제어 로직(66)은 패킷 액티브 레지스터들(74) 및 데이터 패킷 액티브 레지스터들(76)을 이용하여, 현재 수신되고 있는 제어 패킷 또는 데이터 패킷이 어떤 가상 채널에 속하는 지를 식별한다. 제어 패킷 액티브 레지스터(74)가 각 인터페이스 로직들(18A-18C)에 제공된다(예를 들어, 제어 패킷 액티브 레지스터(74A)는 인터페이스(18A)에 대응한다). 유사하게, 데이터 패킷 액티브 레지스터(76)가 각 인터페이스 로직들(18A-18C)에 대해 제공된다(예를 들어, 데이터 패킷 액티브 레지스터(76A)는 인터페이스(18A)에 대응한다). 제어 패킷의 제 1 비트 타임에 응답하여, 제어 로직(66)은 (제 1 비트 타임 내에 있는) 커맨드 필드를 디코드하고, 그 가상 채널에 대해 제어 패킷이 할당되었는 지를 결정한다. 제어 로직(66)은 (제어 패킷이 수신되는 대응하는 인터페이스 로직들(18A-18C)의 세트 내의) 대응하는 제어 패킷 버퍼 내의 버퍼 엔트리를 할당하고, 그 제어 패킷 버퍼를 나타내기 위해 패킷이 수신되는 인터페이스 로직들(18A-18C)에 대응하는 제어 패킷 액티브 레지스터(76)를 세트시킨다. 동일한 인터페이스 로직들(18A-18C)로부터의 이후의 제어 패킷 비트 타임들은 제어 패킷의 각 비트 타임이 수신될 때 까지, 표시된 버퍼 내의 표시된 엔트리 내에 저장된다. 제어 패킷이 데이터 패킷을 지정한다면, 제어 로직(66)은 식별된 가상 채널에 대응하는 데이터 패킷 버퍼 내에 데이터 패킷 버퍼 엔트리를 할당한다. 데이터 패킷 비트 타임들은 데이터의 각 비트가 수신될 때 까지, 표시된 버퍼의 표시된 엔트리에 저장된다. 대안적인 실시예에서, 인터페이스 로직들(18A-18C)은 패킷의 비트 타임들을 모으며, 패킷들을 전체적으로 패킷 처리 로직(58)으로 전송할 수 있다. 이러한 실시예에서, 제어 패킷 액티브 레지스터들(74) 및 데이터 패킷 액티브 레지스터들은 제거될 수 있다. 다른 실시예에서, 인터페이스 로직들(18A-18C)은 패킷 처리 로직(58)으로의 동시 전송을 위해 몇 개의 비트 타임들을 모을 수 있지만, 비트 타임들의 수는 패킷 보다 적을 수 있다. 또 다른 실시예에서, 버퍼들(60, 62 및 64)은 패킷 처리 로직(58) 대신에 각각의 인터페이스 로직들(18A-18C) 내에 위치될 수 있다.
도 11에 도시된 실시예는 각 인터페이스 로직들(18A-18C)에 대한 개별적인 버퍼들의 세트를 제공한다. 대안적인 실시예에서, 버퍼들은 인터페이스 로직들 간에 분할될 수 있는 (각 가상 채널 타입의) 풀로서 제공될 수 있다. 이러한 실시예는 다른 노드(예를 들어, 도 1의 예에서의 인터페이스 로직(18A))에 결합되지 않는 제로 버퍼들을 제공함으로써 버퍼들을 효율적으로 이용할 수 있게 된다. 그렇지 않으면 인터페이스 로직(18C)에 할당되는 버퍼들은 인터페이스 로직들(18A-18B)에 의한 이용을 위해 할당될 수 있다.
도 12는 데이터 버퍼 풀(68) 내에 있을 수 있는 데이터 풀 엔트리(80)의 일 실시예의 블록도를 도시한다. 다른 실시예들이 또한 가능하며 고려된다. 도 12의 실시예에서, 데이터 버퍼 풀 엔트리(80)는 소스 태그 필드(82), 소스 노드 필드(84), 소스 유닛 필드(88) 및 데이터 필드(86)를 포함한다.
제어 로직(66)이 트랜잭션에 대한 응답 데이터 패킷을 저장하기 위해 데이터 버퍼 풀 엔트리(80)를 할당할 때, 제어 로직(66)은 트랜잭션의 소스 노드, 소스 유닛 및 소스 태그를 각각 소스 노드 필드(84), 소스 유닛 필드(88), 및 소스 태그 필드(82)에 저장할 수 있다. 소스 노드, 소스 유닛, 및 소스 태그가 현 트랜잭션을 특이하게 식별하고, 그리고 소스 노드, 소스 유닛, 소스 태그는 현 트랜잭션에 대응하는 응답 패킷들에 의해 전달되기 때문에, 트랜잭션의 응답 패킷들 (및 대응하는 데이터 패킷들)이 식별될 수 있으며, 데이터 패킷들은 할당된 엔트리 내에 저장된다. 다시 말해, 응답 데이터 패킷을 지정하는 응답 패킷이 수신되면, 응답 패킷의 소스 노드, 소스 유닛, 및 소스 태그는 응답 데이터에 대해 이전에 할당된 데이터 버퍼 풀 엔트리(80)를 위치시키기 위해 소스 노드 필드(84), 소스 유닛 필드(88) 및 소스 태그 필드(84)와 비교되며, 데이터는 응답 데이터 버퍼로부터 데이터 버퍼 풀 엔트리(80)의 데이터 필드(86) 내에 카피될 수 있다. 데이터 필드(86)는 데이터의 캐시 블록을 포함할 수 있다.
도 13은 응답 카운터 풀(70) 내에 있을 수 있는 응답 카운터(90)의 일 실시예를 도시한 블록도이다. 다른 실시예들이 또한 가능하며 고려된다. 도 13에 도시된 실시예에서, 응답 카운터(90)는 소스 태그 필드(92), 소스 노드 필드(94), 소스 유닛 필드(95), 응답 카운터 필드(96) 및 검색 상태 필드(98)를 포함한다.
제어 로직(66)이 트랜잭션에 대한 응답 카운트를 저장하기 위해 응답 카운터(90)를 할당하게 되면, 제어 로직(66)은 소스 노드 필드(94), 소스 유닛 필드(95), 및 소스 태그 필드(92) 내에 각각 트랜잭션의 소스 노드, 소스 유닛, 및 소스 태그를 저장할 수 있다. 소스 노드 필드(94), 소스 유닛 필드(95) 및 소스 태그 필드(92)는 데이터 버퍼 풀 엔트리(80)의 대응하는 필드들(84, 88 및 82)과 유사하게 이용될 수 있다.
응답 카운트 필드(96)는 트랜잭션에 대해 할당될 때, 그 트랜잭션에 대해 기대되는 응답들의 수로 시작될 수 있다. 각각의 필드들(94, 95, 및 92)에 저장된 소스 노드, 소스 유닛, 및 소스 태그를 갖는 응답 패킷들이 수신될 때 마다, 응답 카운트는 감소된다. 응답 카운트가 제로에 이르면, 모든 응답들이 수신되고 트랜잭션이 전달될 수 있다. 또한, 카운트는 제로로 시작될 수 있으며, 응답 패킷들은 응답들의 기대수에 이를 때 까지 응답 카운트를 증가시킬 것이다.
수신 상태 필드(98)는 데이터가 수신될 수 있는 상태를 나타내는 데에 이용될 수 있다. 이 상태는 캐시 블록에 대한 액세스 권한 뿐 아니라, 캐시 블록에 대한 코히런시를 유지하는 책임과, 캐시 블록을 수신하는 데에 요구되는 노드(12A)를 나타낸다. 예를 들어, MOESI(Modified, Owned, Exclusive, Shared, 및 Invalid) 코히런시 상태들이 이용될 수 있으며, 수신 상태 필드(98)는 지원되는 상태중 하나로 엔코드될 수 있다. 또한, 다른 모든 적절한 코히런시 상태(예를 들어, MESI 상태들)의 세트가 이용될 수 있다. 수신 상태 필드(98)는 다른 어떠한 노드도 트랜잭션에 의해 전송되는 캐시 블록의 카피를 갖지 않는 경우에 요구되는 상태로 시작될 수 있다. 프로브 응답들이 수신될 때, 응답이 캐시 블록의 카피가 프로브 노드에 의해 유지되고 있음을 나타내거나, 또는 더티 데이터가 제공된다는 것을 나타낸다면, 수신 상태 필드(98)가 그에 따라 갱신될 수 있다. 일 실시예에서는, 캐시 블록의 카피가 프로브 응답을 제공하는 프로브 노드에 의해 유지된다는 것을 나타내기 위해, 공유 비트가 프로브 응답 패킷 내에 포함될 수 있다. 또한, 프로브 노드로부터 판독 응답 패킷을 수신하는 것은 노드가 캐시 블록의 더티 카피를 갖고 있음을 나타낼 수 있다. 판독 응답 패킷은 또한 프로브 노드에 의해 카피가 유지되고 있는 지를 나타내기 위한 공유 비트를 포함할 수 있다.
주목할 사항으로서, 데이터 버퍼 풀(68) 및 응답 카운터 풀(70)은 단지 현 트랜잭션들에 대한 응답을 처리하기 위해 리소스들을 할당하는 하나의 예일 뿐이다. 다른 실시예에서, 현 트랜잭션들의 표가 유지될 수 있다. 이 표는 상기 (또는 제어 로직(66)으로 하여금 모든 응답들이 수신되었음을 결정할 수 있게 하는 등가의 정보)와 유사하게 소스 노드, 소스 유닛, 소스 태그, 데이터, 수신 상태 및 응답 카운트를 포함할 수 있다. 어떠한 적절한 리소스들의 세트가 이용될 수 있다.
도 14는 패킷을 수신하기 위한 패킷 처리 로직(58)의 일 실시예의 동작을 도시한 흐름도이다. 다른 실시예들이 또한 가능하며 고려된다. 도시된 실시예는 패킷들을 일련의 비트 타임들로서 패킷 처리 로직(58) 내에 수신한다. 다른 실시예들은 인터페이스 로직들(18A-18C) 내에 패킷의 비트 타임들을 모을 수 있으며, 패킷 처리 로직(58)에 완전한 패킷들을 제공하는데, 이러한 경우들에 있어서 비트 타임들로 패킷들의 수신을 조정하는 것에 관련된 단계들은 제거될 수 있다. 도 14에 도시된 단계들은 이해의 용이를 위해 특정한 순서로 도시되었지만, 어떠한 적절한 순서라도 이용될 수 있다. 또한, 단계들은 패킷 처리 로직(58) 내의 결합 로직을 이용하여 동시에 수행될 수 있다. 도 14에 도시된 단계들은 동시에, 그리고 각 인터페이스 로직들(18A-18C)에 대해 독립적으로 수행될 수 있는데, 이는 인터페이스 로직으로부터 비트 타임들이 동시에 수신될 수 있기 때문이다.
패킷 처리 로직(58)은 수신된 비트 타임이 데이터 패킷 또는 커맨드 패킷의 일부인 지를 나타내는 신호를 인터페이스 로직으로부터 수신한다. 비트 타임이 데이터 패킷 비트 타임인 경우(결정 블록 100), 이 비트 타임은 그 인터페이스 로직에 대응하는 데이터 패킷 액티브 레지스터에 의해 표시되는 데이터 버퍼 내에 (그리고 데이터 버퍼 내의 엔트리에) 저장된다(단계 102). 데이터 패킷 비트 타임이 데이터 패킷의 마지막 비트 타임인 경우, 제어 로직(66)은 대응하는 데이터 패킷 액티브 레지스터를 무효화한다. 한편, 비트 타임이 제어 패킷 비트 타임인 경우, 패킷 처리 로직(58)은 제어 패킷이 현재 수신되는 중인 지를 (예를 들어, 결정 블록(104)에서, 제어 패킷 액티브 레지스터가 유효한 지를) 결정한다. 제어 패킷이 현재 진행중인 경우, 비트 타임은 제어 패킷 액티브 레지스터에 의해 표시되는 제어 패킷 버퍼 내에 저장된다(단계 106). 제어 패킷 비트 타임이 제어 패킷의 마지막 비트 타임인 경우, 제어 로직(66)은 대응하는 제어 패킷 액티브 레지스터를 무효화할 수 있다.
대안적으로, 제어 패킷은 현재 진행 중이 아닐 수 있다. 이 경우, 패킷 처리 로직(58)은 제어 패킷이 속하는 가상 채널을 식별하기 위해 새롭게 수신된 제어 패킷의 커맨드 필드를 디코드한다(단계 108). 식별된 가상 채널에 대응하는 제어 패킷 버퍼 엔트리가 할당되며, 제어 패킷 비트 타임은 할당된 제어 패킷 버퍼 엔트리 내에 저장된다.
또한, 패킷 처리 로직(58)은 제어 패킷이 이후의 데이터 패킷을 지정하는 지의 여부를 결정한다(결정 블록 110). 데이터 패킷이 지정되는 경우, 패킷 처리 로직(58)은 식별된 가상 채널에 대응하는 데이터 버퍼로부터의 데이터 버퍼 엔트리를 할당하고, 그 데이터 버퍼 (및 엔트리)를 식별하기 위해 데이터 패킷 액티브 레지스터를 갱신한다(단계 112).
도 15는 커맨드 패킷을 처리하기 위한 패킷 처리 로직(58)의 일 실시예의 동작을 도시한 흐름도이다. 다른 실시예들이 또한 가능하며 고려된다. 도 15에 도시된 단계들은 이해의 용이를 위해 특정한 순서로 도시되었지만, 어떠한 적절한 순서라도 이용될 수 있다. 또한, 단계들은 패킷 처리 로직(58) 내의 결합 로직을 이용하여 동시에 수행될 수 있다. 도 15에 도시된 단계들은 동시에, 그리고 각 인터페이스 로직들(18A-18C) 그리고/또는 각 커맨드 패킷 버퍼에 대해 독립적으로 수행될 수 있는데, 이는 다른 인터페이스들 그리고/또는 다른 가상 채널들로부터의 커맨드 패킷들은 물리적으로 독립적이기 때문이다. 대안적으로, 하나의 커맨드 패킷 (또는 인터페이스 로직들(18A-18C) 마다 하나의 커맨드 패킷)이 적절한 공정(fairness) 알고리즘에 따라 처리를 위해 선택될 수 있다. 일반적으로, 처리를 위해 1개의 가상 채널로부터 선택된 패킷들은 가상 채널 내의 패킷들에 대한 정렬 룰(ordering rule)을 따르지만(예를 들어, 동일한 소스로부터 동일한 목적지로의 패킷들이 순서대로 선택된다), 필요한 경우 그리고 정렬 룰이 이러한 선택을 허용하는 경우, 패킷들은 처리를 위해 순서를 벗어나게 선택될 수 있다.
패킷 처리 로직(58)은 커맨드 패킷의 목적이 이 노드인지를 결정한다(결정 단계 126). 예를 들어, 패킷 처리 로직(58)은 커맨드 패킷의 목적지 노드 내에 기록된 목적지 노드와 노드 ID 레지스터(72)의 노드 ID를 비교할 수 있다. 노드들이 일치한다면, 커맨드는 이 노드에 목표를 두게 된다. 커맨드가 이 노드에 목표를 두지 않는 다면, 패킷 처리 로직(58)은 목적지 노드에 응답하여 커맨드 패킷 (및 지정된 경우, 대응하는 데이터 패킷)을 전송할 수 있다(단계 128). 예를 들어, 패킷 처리 로직(58)은 패킷들을 특정한 목적지 노드로 전송하기 위해, 인터페이스 로직들(18A-18C)중 하나를 전송 인터페이스로 식별하는 패킷 라우팅표를 유지할 수 있다. 패킷 처리 로직(58)은 패킷 라우팅표에 의해 지정된 링크에 결합된 수신 노드에서 이용가능한 대응하는 커맨드 버퍼 (및 데이터 패킷이 지정된 경우에는, 데이터 버퍼에) 커매드 패킷을 전송한다. 또한, 커맨드 패킷이 데이터 패킷을 지정한다면, 전송 링크 상의 데이터 패킷이 액티브하지만, 아직 전송되지 않은 경우, 커맨드 패킷의 전송이 정지될 수 있다.
커맨드 패킷이 이 노드를 목표로 한다면, 패킷 처리 로직(58)은 커맨드 패킷 (및 적용가능한 경우, 대응하는 데이터 패킷)을 메모리 제어기(16A)에 전송한다(단계 130). 주목할 사항으로서, 일단 커맨드 패킷이 처리된다면(이 노드에 의해 전송 또는 수신된다면), 커맨드 패킷은 커맨드 버퍼 엔트리로부터 제거되고 (그리고, 적용가능한 경우, 데이터가 커맨드 데이터 버퍼 엔트리로부터 제거된다).
주목할 사항으로서, 프로브 커맨드들이 이후의 데이터 패킷을 지정하지 않고, 이에 따라 데이터 패킷 체크가 무시될 수 있음에도 불구하고, 프로브 커맨드들은 유사한 방식으로 처리될 수 있다. 또한, 프로브들은 내부적으로 (예를 들어, 노드 내에 캐시들을 프로빙함으로써) 처리될 수 있고 전송될 수 있는바, 이는 이들이 방송 패킷들이기 때문이다. 노드는 캐시들을 프로빙한 후 프로브 응답 패킷을 발생시키고 전송할 수 있다.
주목할 사항으로서, 선택된 커맨드 패킷이 대응하는 데이터 패킷을 지정한다면, 다양한 실시예들은, 데이터 패킷이 아직 수신되지 않았음에도 불구하고 커맨드 패킷을 처리할 수 있거나, 또는 데이터의 전송을 단순화하기 위해, 또는 동일한 링크 상으로 전송이 완료되는 데이터 패킷을 지정하는 다른 제어 패킷을 허용하기 위해 데이터 패킷의 도달을 기다릴 수 있다. 커맨드 패킷이 처리될 때 데이터 패킷이 아직 수신되지 않았다면, 데이터 패킷이 수신될 때 데이터 패킷은 상기 설명한 바와 같이 처리될 수 있다.
도 16은 응답 패킷을 처리하기 위한 패킷 처리 로직(58)의 일 실시예의 동작을 도시한 흐름도이다. 다른 실시예들이 또한 가능하며 고려된다. 도 16에 도시된 단계들은 단지 이해의 용이를 위해 특정한 순서로 도시되기는 하였지만, 어떠한 적절한 순서라도 이용될 수 있다. 또한, 단계들은 패킷 처리 로직(58) 내에서 결합 로직을 이용하여 동시에 수행될 수 있다. 도 16에 도시된 단계들은 동시에, 그리고 각 인터페이스 로직들(18A-18C) 그리고/또는 각 응답 패킷 버퍼에 대해 독립적으로 수행될 수 있는데, 이는 다른 인터페이스들 그리고/또는 다른 가상 채널들로부터의 커맨드 패킷들이 물리적으로 독립적이기 때문이다.
패킷 처리 로직(58)은 응답 패킷의 목적지 노드가 이 노드인지의 여부를 결정한다(결정 블록 144). 목적지 노드가 다른 노드인 경우, 패킷 처리 로직(58)은 응답 패킷 (및 적용가능한 경우, 대응하는 데이터 패킷을), 응답 패킷이 전송되는 링크를 통해 수신기 내의 응답 가상 채널에 대한 빈 버퍼 엔트리로 전송한다(단계 146).
응답 패킷의 목적지 노드가 이 노드라면, 패킷 처리 로직(58)은 대응하는 응답 카운터를 감분시키고 수신 상태를 갱신하도록 구성되는바, 이는 그 응답이 수신 상태가 디폴트 상태로부터 변경되어야 함을 나타내는 경우이다(단계 148). 또한, 응답 패킷이 데이터 패킷을 지정한다면, 데이터 패킷은 대응하는 응답 데이터 버퍼로부터, 그 응답에 할당된 데이터 버퍼로 이동된다(단계 150).
카운터를 감분시킨 후, 패킷 처리 로직은 모든 응답 패킷들이 수신되어 처리되었는 지를 결정하기 위해 카운터를 테스트할 수 있다(결정 블록 152). 모든 응답 패킷들이 수신되어 처리된 것으로 결정되면, 패킷 처리 로직(58)은 메모리 제어기(16A) 또는 캐시(50 및 54)에 이들이 커맨드를 완료하였음을 알리고, 데이터 버퍼로부터의 관련 데이터 및 응답 카운터로부터 수신 상태를 제공한다(적용가능한 경우, 단계 154). 주목할 사항으로서, 일단 응답 패킷이 처리되면(이 노드에 의해 전송 또는 수신되면), 응답 패킷은 응답 버퍼 엔트리 (및 적용가능한 경우, 응답 데이터 버퍼 엔트리)로부터 제거된다.
상기 설명에서는, 커맨드 패킷 또는 응답 패킷 처리의 "중단(suspension)"이라는 용어가 이용되었다. 일반적으로, 특정 패킷의 처리가 중단되는 경우, 중단의 이유가 제거될 때 까지 처리는 "중단된다". 그 커맨드 또는 응답의 처리가 중단되는 동안에는, 동일한 타입의 다른 패킷들이 처리될 수 있다.
선택된 응답 패킷이 대응하는 데이터 패킷을 지정하는 경우, 다양한 실시예들은 데이터 패킷이 아직 수신되지 않았음에도 불구하고(즉, 데이터 패킷이 데이터 버퍼 내에 아직 수신되지 않았음에도 불구하고) 응답 패킷을 처리할 수 있거나, 또는 데이터의 전송을 단순화하기 위해, 또는 동일한 링크를 통해 전송이 완료된 데이터 패킷을 지정하는 다른 제어 패킷을 허용하기 위해 데이터 패킷의 도달을 기다릴 수 있다. 응답 패킷이 처리될 때 데이터 패킷이 수신되지 않은 경우, 데이터 패킷은 이 데이터 패킷이 수신될 때 상기 설명한 바와 같이 처리될 수 있다.
도 17은 노드가 결합된 링크들을 상에서 패킷을 시작하기 위한 패킷 처리 로직(58)의 일 실시예의 동작을 나타낸 흐름도이다. 다른 시시예들이 또한 가능하며 고려된다. 도 17에 도시된 단계들은 이해의 용이를 위해 특정한 순서로 도시되었지만, 어떠한 적절한 순서라도 이용될 수 있다. 또한, 단계들은 패킷 처리 로직(58) 내의 결합 로직을 이용하여 동시에 수행될 수 있다. 패킷 처리 로직(58)은 캐시들(50 및 54)로부터의 필 요구/빅팀 블록들 그리고/또는 코어들(52 및 6)에 의해 수행되는 연산들에 응답하여 링크 상에서 패킷들을 시작할 수 있다. 따라서, 프로브 패킷들이 처리를 위한 메모리 연산을 선택하는 메모리 제어기(16A)에 응답하여 시작될 수 있다. 응답 패킷들은 프로브들이 처리된 후에, 그리고 완료된 이 노드에 의해 비롯되거나, 또는 이 노드에 의해 목표가 되는 트랜잭션에 응답하여 시작될 수 있다.
패킷 처리 로직(58)은 시작될 패킷이 이 노드로 리턴되는 데이터가 되는 지를 결정한다(결정 블록 160). 예를 들어, 이 노드에 의해 시작되는 판독 트랜잭션들은 데이터가 노드로 리턴되게 하며, 이 노드에 의해 시작되는 기록 트랜잭션들은 데이터가 그 노드로 리턴되게 하지 못한다. ChangetoDirty 트랜잭션들은 (다른 노드가 더티 상태로 영향을 받은 캐시 블록을 갖는 다면) 그 노드로 리턴되는 데이터가 될 수 있다. 유사하게, 프로브 패킷들은, 다른 노드가 더티 상태로 영향을 받은 캐시 블록을 갖고 프로브 응답들이 이 노드로 향한다면, 데이터를 이 노드로 리턴되게 할 수 있다. 트랜잭션이 이 노드로 리턴되는 데이터가 된다면, 패킷 처리 로직(58)은 데이터 버퍼 풀(68)로부터 데이터 버퍼를 할당한다(단계 162).
또한, 패킷 처리 로직(58)은 프로브 응답들이 패킷에 응답하여 이 노드로 리턴될 것인 지를 결정한다(단계 166). 이는 패킷이 프로브인 경우, 또는 패킷이 이 노드에 대한 프로브 응답들이 되는 트랜잭션(예를 들어, 판독 트랜잭션)을 시작하는 경우에 일어날 수 있다. 프로브 트랜잭션이 이 노드로 리턴되는 경우, 패킷 처리 로직(58)은 응답들에 대한 응답 카운터를 트랜잭션에 할당하고, 응답 카운터를 코히런트 구조 내의 노드들의 수로 시작한다(단계 168).
패킷 처리 로직(58)은 또한, 시작되는 패킷에 응답하여 다른 응답들이 이 노드(예를 들어, SrcDone, TgtDone 등)로 리턴될 지를 결정한다(단계 164). 이러한 다른 응답들이 리턴된다면, 패킷 처리 로직(58)은 응답 카운터를 할당하고 초기 카운트를 1로 설정한다(단계 165). 이후, 패킷 처리 로직(58)이 패킷을 전송한다(단계 170).
트랜잭션을 시작하기 전에 (데이터를 포함하는) 응답 패킷들을 처리하기 위해 리소스들을 미리 할당함으로써, 응답 패킷들은 수신 시에 처리가능해진다. 따라서, 일부 응답 패킷들이 다른 응답 패킷들과 논리/프로토콜 충돌을 가질 수 있지만, 각 응답 패킷이 그의 목적지 노드에 도달할 때 이들을 처리함으로써 물리적인 충돌들이 제거될 수 있기 때문에, 응답 패킷들은 응답 가상 채널에 통합될 수 있게 된다.
도 18은 버퍼 릴리스 필드들을 포함하는 정보 패킷(180)의 일 실시예를 도시한 블록도이다. 다른 실시예들이 또한 가능하며 고려된다. 버퍼 해제 필드는 각 버퍼 타입에 포함된다. RespData 필드는 응답 데이터 버퍼에 대응한다. 응답 필드는 응답 버퍼에 대응한다. 유사하게, CmdData 필드는 커맨드 데이터 버퍼에 대응하며, 커맨드 필드는 커맨드 버퍼에 대응한다.
각각의 버퍼 릴리스 필드들은 2개의 비트들을 포함하여, 단일 링크 상에서의 전송기로부터 수신기로의 하나의 정보 패킷(180)의 전송시 0 내지 3개의 각 타입의 버퍼가 비게 된다. 버퍼 내에는 3개 이상의 엔트리들이 제공될 수 있으며, 다수의 정보 패킷들이 한 타입의 3개 이상을 비우는 데에 이용될 수 있다. 패킷 처리 로직(58)은 각 타입의 버퍼 및 각 인터페이스 로직들(18A-18C)에 대해, 각 인터페이스가 결합된 링크의 다른 단부 상에서 수신기에 의해 제공되는 각 타입의 버퍼들의 총수를 나타내는 버퍼 카운트들을 포함할 수 있다. 이러한 카운트들은 정보 패킷들을 수신기로부터 버퍼 릴리스 필드들을 갖는 전송기로 전송함으로써 파워업시, 그 수신기 내에서 이용가능한 버퍼들의 수로 초기화된다. 다수의 정보 패킷들을 전송함으로써, 3개 이상의 엔트리들이 표시될 수 있다.
패킷 처리 로직(58)은 대응하는 타입의 버퍼(및 패킷이 데이터 패킷을 지정하는 경우에는, 데이터 버퍼)가 패킷들이 전송되고 있는 수신기 내에서 이용가능한 한, 소정의 가상 채널에 패킷들을 전송할 수 있다. 또한, 패킷 처리 로직(58)은 이 패킷 처리 로직(58)에 의한 패킷들의 처리로 인해 노드(12A) 내에서 비게 되는 각 타입의 인터페이스들(18A-18C)의 버퍼들의 수를 주목한다. 주기적으로, 패킷 처리로직(58)은 각 인터페이스 로직들(18A-18C)을 통해 정보 패킷(180)을 전송하여, 그 링크 상의 전송기에, 패킷 처리 로직(58)에 의해 비게 되는 버퍼 엔트리들의 수를 나타낸다.
가상 채널들 - 넌코히런트 구조
도 19는 I/O 하위 시스템(200)의 일 실시예의 블록도를 도시한다. 다른 실시예들이 또한 가능하며 고려된다. 도 19의 실시예에서, I/O 하위 시스템(200)은 호스트 브리지(202) 및 다수의 I/O 노드들(204A, 204B 및 204C)을 포함한다. 호스트 브리지(202)는 라인들(24I-24J)을 포함하는 코히런트 링크를 통해 처리 노드(12D)에 결합되고, 라인들(24K-24L)을 포함하는 넌코히런트 링크를 이용하여 I/O 노드(204A)에 결합된다. I/O 노드들(204A-204C)은 데이지 체인 구조(라인들(24N-24O)에서 부가적인 넌코히런트 링크들을 이용하여 서로 연결된다.
일반적으로, I/O 노드(204A-204C)는 I/O 하위 시스템(200) 내에서 트랜잭션들을 시작할 수 있다. 트랜잭션들은 궁극적으로 I/O 노드들(204A-204C), 다른 넌코히런트 링크, 또는 메모리(14)에 타겟을 둘 수 있다. 단순함을 위해, 트랜잭션들은 그의 실제적인 타겟에도 불구하고, 호스트 브리지(202)와 I/O 노드들(204A-204C) 사이에서 수행될 수 있다. 호스트 브리지(202)는 처리 노드들(12A-12D)로부터의 요구를 위해 I/O 노드들(204A-204C) 내에서 트랜잭션을 시작할 수 있으며, 그리고 컴퓨터 시스템 내의 다른 호스트 브리지 또는 코히런트 구조에 타겟을 두는 I/O 노드들(204A-204C)에 의해 시작되는 트랜잭션들을 처리할 수 있다. 따라서, I/O 노드들(204A-204C)에 의해 전송되는 패킷들은 데이지 체인 연결을 통해 호스트 브리지(202) 쪽으로 흐를 수 있다("업스트림" 흐름). 호스트 브리지(202)에 의해 전송되는 패킷들은 수신 I/O 노드들(204A-204N) 쪽으로 흐를 수 있다("다운스트림" 흐름). 데이지 체인 내에서 I/O 노드들과 호스트 브리지를 서로 연결하고 I/O 노드들을 단지 호스트 브리지와 (트랜잭션 레벨에서) 통신하게 함으로써, I/O 노드들이 다른 노드들에는 연결되지 않고 호스트 브리지에만 바로 연결되는 것으로 보이는 I/O 하위 시스템(200)의 논리적인 측면을 제공한다.
I/O 하위 시스템(200)은 링크 고장의 경우 강건함을 제공하고 처리 노드들의 크러스터들 간에 공유 I/O 하위 시스템을 허용하기 위해, 데이지 체인 상호 연결의 양쪽 단부들 상의 호스트 브리지에 연결될 수 있다. 한 브리지는 마스터 브리지로서 규정되고, 다른 브리지는 스레이브 브리지로서 규정된다. 링크 고장이 없다면, 하위 시스템 내의 모든 I/O 노드들은 마스터 브리지에 속하게 될 것이다. 링크 고장을 검출하게 되면, 고장측 상의 노드들은 고장이 검출된 동일 측면 상의 호스트 브리지에 속하는 것으로 재프로그램됨으로써, 2개의 하위 시스템들을 형성하고 처리 노드들과의 통신을 유지하게 된다. 트래픽의 균형을 유지하기 위해 (2개의 논리적으로 개별적인 체인들을 형성하는) 고장이 없는 경우, I/O 노드들은 2개의 호스트 브리지들 간에 할당될 수 있다.
패킷들이 데이지 체인의 끝(예를 들어, 도 19의 I/O 노드(204C))에 도달하고 어떠한 I/O 노드들(204A-204C)도 패킷들을 수신하지 않는 경우에는, 체인의 단부에 있는 노드에 의해 에러가 발생될 수 있다.
일반적으로, I/O 하위 시스템(200)은 넌코히런트 상호 연결로서 링크들을 실행할 수 있다. 넌코히런트 링크에서의 데이터 패킷 정의는 도 6을 참조하여 설명된 것과 유사하고, 넌코히런트 링크에서의 정보 패킷 정의는 (프로브 필드가 지정되어 있는) 도 3 및 18에 도시된 패킷 정의와 유사하다. 커맨드 및 응답 패킷들은 하기의 도 21 및 22에 도시된다.
가상 채널들과 관련하여, 넌코히런트 링크들은 상기 설명된 코히런트 링크와 동일한 가상 채널들을 이용할 수 있다. 그러나, 넌코히런트 링크에서는 프로브들이 이용되지 않기 때문에, 프로브 가상 채널은 제거될 수 있다. 도 9에 도시된 표(42)는 넌코히런트 링크의 일 실시예에 대해 규정된 가상 채널들을 도시한다.
주목할 사항으로서, 호스트 노드(202)는 처리 노드들(12)과 개별적인 것으로 도시되었지만, 필요에 따라 처리 노드에 통합될 수 있다.
도 20의 표(210)는 컴퓨터 시스템(10) 내의 넌코히런트 링크의 한 예시적인 실시예에 따라 이용되는 패킷들을 도시한다. 다른 모든 적절한 패킷들의 세트 및 커맨드 필드 엔코딩들을 포함하는 다른 실시예들이 또한 가능하며 고려된다. 표(210)는 각 커맨드에 할당된 커맨드 엔코딩들을 도시하는 커맨드 코드 칼럼과, 넌코히런트 패킷들이 속하는 가상 채널을 규정하는 가상 채널(Vchan) 칼럼과, 커맨드를 명명하는 커맨드 칼럼과, 그리고 그 커맨드에 대해 어떤 커맨드 패킷들(30, 212 및 214)이 이용되는 지를 나타내는 패킷 타입 칼럼을 포함한다.
Nop, WrSized, ReadSized, RdResponse, TgtDone, Broadcast 및 Sync 패킷들은 도 7과 관련하여 상기 설명된 대응하는 코히런트 패킷들과 유사하다. 하지만, 넌코히런트 링크에서는, 어떠한 프로브 패킷 또는 프로브 응답 패킷도 없다.
Assign 및 AssignAck 패킷들은 노드들에 Unit IDs를 할당하는 데에 이용된다. 마스터 호스트 브리지는 (한번에 하나씩) 각 노드에 할당 패킷들을 전송하며, 마지막으로 이용되는 Unit ID를 나타낸다. 수신 노드는 그 노드에 의해 요구되는 Unit ID의 수를 할당하여, 마지막으로 이용되는 Unit ID+1에서 시작한다. 수신 노드는 할당된 Unit ID의 수를 나타내는 ID 카운트를 포함하는 AssignAck 패킷을 리턴시킨다.
도 21은 넌코히런트 링크에서 이용될 수 있는 커맨드 패킷(212)의 일 실시예의 블록도를 도시한다. 커맨드 패킷(212)은 코히런트 패킷과 유사한 커맨드 필드를 포함한다. 또한, 코히런트 커맨드 패킷과 유사하게, 선택 소스 태그 필드(SrcTag)가 비트 타임 3에 포함될 수 있다. 어드레스가 비트 타임들 5-8 (및 선택적으로 최하위 어드레스 비트들에 대해서는 비트 타임 4에) 포함된다. 그러나, 소스 노드 대신, 유닛 ID가 제공된다.
유닛 ID는 (유닛 ID가 동일한 경우) 동일한 논리 소스로부터 비롯되는 패킷들을 식별하는 역할을 한다. 하지만, I/O 노드는 (예를 들어, 노드가 논리적으로 개별적인 다수의 장치 또는 기능을 갖는 경우) 다수의 유닛 ID를 가질 수 있다. 따라서, 노드는 1개 이상의 유닛 ID를 갖는 패킷들을 수신할 수 있다. 또한, 패킷들은 호스트 브리지와 노드 사이를 흐르기 때문에, 패킷 내에 포함되는 노드들중 하나(호스트 브리지 노드)가 그 패킷에 포함된다. 따라서, 넌코히런트 패킷 내에서는 단일 유닛 ID가 이용될 수 있다. 일 실시예에서, 유닛 ID는 5 비트를 포함할 수 있다. 유닛 ID 0은 호스트 브리지에 할당될 수 있고, 유닛 ID 31은 에러 경우에 이용될 수 있다. 따라서, 하나의 데이지 체인 내에 결합된 I/O 노드들 내에는 30개 까지의 유닛 ID가 존재한다. 보다 명확하게 설명하면, 시퀀스 ID 필드가 제로인 경우, 패킷은 정렬되지 않는다. 시퀀스 ID 필드가 제로가 아닌 경우, 패킷은 동일한 시퀀스 ID 필드값을 갖는 다른 패킷들에 대해 정렬된다.
도 22는 넌코히런트 링크에서 이용될 수 있는 응답 패킷(214)의 일 실시예의 블록도를 도시한다. 응답 패킷(214)은 커맨드 패킷(212)과 유사하게, 커맨드 필드, 유닛 ID 필드 및 소스 태그 필드를 포함한다. 필요에 따라, 다른 비트들이 포함될 수 있다.
도 23은 I/O 노드(204A)의 일 실시예의 블록도를 도시한다. 다른 I/O 노드들(204B-204C) 또한 유사하게 구성될 수 있다. 다른 실시예들이 또한 가능하며 고려된다. 도 23의 실시예에서, I/O 노드(204A)는 인터페이스 로직들(18M 및 18N), 제 1 세트의 패킷 버퍼들(220), 제 2 세트의 패킷 버퍼들(222) 및 노드 로직(224)을 포함한다. 인터페이스 로직(18M)은 라인들(24K 및 24L), 패킷 버퍼들(22) 및 노드 로직(224)에 결합된다. 인터페이스 로직(18N)은 라인들(24M 및 24N), 패킷 버퍼들(222) 및 노드 로직(224)에 결합된다. 노드 로직(224)은 또한 패킷 버퍼들(222 및 224)에 결합된다.
인터페이스 로직들(18M 및 18N)은 라인들(24L 및 24M)로부터 (각각) 패킷들을 수신하고, 라인들(24K 및 24N) 상에 (각각) 패킷들을 전송하도록 구성된다. 코히런트 링크에 대해 상기 설명된 인터페이스 로직과 유사하게, 인터페이스 로직들(18M 및 18N)은 수신된 패킷들을 제어 경로 및 데이터 경로로 분리할 수 있다. 제어 경로는 제어 패킷 버퍼들에 결합되고, 데이터 경로는 데이터 패킷 버퍼들에 결합된다. 또한, 인터페이스 로직은 수신된 패킷들을 제어 및 데이터 경로들로 분리하지 않을 수 있으며, 노드 로직(224)은 분리를 수행하기 위해 각 비트 타임에 대응하는 CTL 신호를 수신할 수 있다. 코히런트 인터페이스와 유사하게, 패킷 버퍼들(220 및 222)은 넌코히런트 링크에서 실행되는 2개의 가상 채널들에 대응하여, 제어 패킷들에 대한 커맨드 버퍼(CB) 및 응답 버퍼(RB)를 포함한다. 또한, 데이터 패킷 버퍼들(즉, 커맨드 데이터 버퍼(CDB) 및 응답 데이터 버퍼(RDB))이 각 가상 채널에 제공된다.
노드 로직(224)은 버퍼들(222 및 224) 내에 수신된 패킷들을 처리할 수 있으며, I/O 노드(204A)에 의해 실행되는 주변 기능에 응답하여 패킷들을 시작할 수 있다. 도 11에 도시된 제어 로직(66)과 유사하게, 노드 로직(224)은 (각각 패킷 버퍼들(222 및 224)에 대응하여) 제어 패킷 액티브 레지스터들(226A 및 226B) 및 (각각 패킷 버퍼들(222 및 224)에 대응하여) 데이터 패킷 액티브 레지스터들(228A 및 228B)를 실행할 수 있다. 또한, 넌코히런트 링크는 노드 ID 대신 유닛 ID에 따라 동작하기 때문에, 노드 로직(224)은 I/O 노드(204A)에 할당된 유닛 ID를 저장하기 위한 1개 또는 그 이상의 유닛 ID 레지스터들(230A-230N)을 포함할 수 있다. 유닛 ID 레지스터(230A-230N)의 수는, 그 노드 내에서 실행되는 유닛 ID의 수에 따라, 노드 마다 다를 수 있다.
다른 가상 채널들 내의 패킷들이 I/O 노드(204A) 내의 다른 버퍼들에 저장되기 때문에, 다른 가상 채널들 내의 패킷들은 서로 물리적으로 충돌하지 않는다. 이에 따라, 데드락이 없는 동작이 제공될 수 있게 된다. 또한, 노드 로직(224)은 (상기 설명한 바와 같이) 응답 패킷들 및 응답 데이터를 처리하기 위해 리소스들을 미리 할당할 수 있으며, 이에 따라 (상기 설명한 바와 같이) 응답 패킷들은 단일의 가상 채널 내에 통합될 수 있게 된다. 노드 로직(224)은 또한, 패킷들의 송신 및 수신에 대해 제어 버퍼들(220 및 222) (및 다른 노드들 내의 유사한 버퍼들)을 순환(flow)시키기 위해, (프로브 필드가 지정되어 있는) 도 18에 도시된 패킷과 유사하게 Nop 패킷들을 송수신하도록 구성될 수 있다.
노드 로직(224)은 또한 다양한 I/O, 또는 I/O 노드(204A)에 의해 수행되는 주변 기능들에 대응하는 로직을 포함할 수 있다. 예를 들어, I/O 노드(204A)는 디스크 드라이브들, CD ROM, DVD 드라이브 등과 같은 주변 저장 장치들을 포함할 수 있다. I/O 노드(204A)는, IEEE 1394, 이서네트, 범용 직렬 버스(USB), 주변 요소 상호 연결(PCI) 버스, 모뎀 등과 같은 통신 주변 장치들을 포함할 수 있다. 모든 적절한 I/O 기능들이 I/O 노드(204A)에 포함될 수 있다.
도 24는 패킷을 수신하기 위한 노드 로직(224)의 일 실시예의 동작을 도시한 흐름도이다. 다른 실시예들이 또한 가능하며 고려된다. 도시된 실시예는 일련의 비트 타임들로서 패킷들을 버퍼들(220 및 222) 내에 수신한다. 다른 실시예들은 인터페이스 로직들(18M-18N) 내에 패킷의 비트 타임들을 모으고, 버퍼들(220 및 222)에 완전한 패킷들을 제공할 수 있는데, 이러한 경우에서 비트 타임들로 패킷들의 수신을 조정하는 것에 관련된 단계들은 제거될 수 있다. 도 24에 도시된 단계들은 이해의 용이를 위해 특정한 순서로 도시되었지만, 어떠한 적절한 순서라도 이용될 수 있다. 또한, 단계들은 노드 로직(224) 내의 결합 로직을 이용하여 동시에 수행될 수 있다. 도 24에 도시된 단계들은, 비트 타임들이 각 인터페이스 로직으로부터 동시에 수신될 수 있기 때문에, 동시에, 그리고 각 인터페이스 로직들(18M-18N)에 대해 독립적으로 수행될 수 있다. 단계들(100-112)은 상기 설명된 도 14의 대응하는 단계들과 유사할 수 있다.
도 25는 커맨드 패킷을 처리하기 위한 노드 로직(224)의 일 실시예의 동작을 도시한 흐름도이다. 다른 실시예들이 또한 가능하며 고려된다. 도 25에 도시된 단계들은 이해의 용이를 위해 특정한 순서도 도시되었지만, 어떠한 적절한 순서라도 이용될 수 있다. 또한, 단계들은 노드 로직(224) 내의 결합 로직을 이용하여 동시에 수행될 수 있다. 도 25에 도시된 단계들은, 다른 인터페이스들 그리고/또는 다른 가상 채널들로부터의 커맨드 패킷들이 물리적으로 독립적이기 때문에, 동시에, 그리고 각각의 인터페이스 로직들(18M-18N) 그리고/또는 각각의 커맨드 패킷 버퍼와 독립적으로 수행될 수 있다. 또한, 1개의 커맨드 패킷 (또는 인터페이스 로직들(18M-18M) 마다 1개의 커맨드 패킷)이 적절한 공정 알고리즘에 따라 선택될 수 있다. 일반적으로, 처리를 위해 1개의 가상 채널로부터 선택되는 패킷들은 가상 채널 내의 패킷들에 대해 정렬 룰을 따르지만(예를 들어, 동일한 소스로부터 동일한 목적지로의 패킷들은 순서대로 선택된다), 필요에 따라, 그리고 정렬 룰이 이러한 선택을 허용하는 경우, 패킷들은 처리를 위해 순서를 벗어나게 선택될 수 있다.
단계(126)는 일반적으로 (유닛 ID 및 유닛 ID 레지스터들(230A-230N)에 기반을 두기는 하였지만) 도 15의 대응하는 단계와 유사할 수 있다. 또한, 노드 로직(224)은 패킷 라우팅표를 따르기 보다는, 패킷들을 동일한 방향(업스트림 또는 다운스트림)으로 전송하도록 구성된다. 패킷이 이 노드에 타겟을 둔다면, 노드 로직(224)은 (다운스트림 흐름으로부터의 패킷을 제거하면서) 패킷을 수신하고 패킷을 처리한다(단계 240). 주목할 사항으로서, 일단 커맨드 패킷이 처리되면(이 노드에 의해 전송 또는 수신되면), 커맨드 패킷은 커맨드 버퍼 엔트리로부터 제거되며 (그리고 적용가능한 경우, 데이터 패킷은 데이터 버퍼 엔트리로부터 제거된다).
주목할 사항으로서, 선택된 커맨드 패킷이 대응하는 데이터 패킷을 지정하는 경우, 다양한 실시예들은 데이터 패킷이 아직 수신되지 않았다고 할지라도 커맨드 패킷을 처리할 수 있으며, 또는 데이터의 전송을 단순화하기 위해, 또는 동일한 링크 상에서 전송이 완료되는 데이터 패킷을 지정하는 다른 제어 패킷을 허용하기 위해 데이터 패킷의 도달을 기다릴 수 있다. 커맨드 패킷이 처리될 때 데이터 패킷이 아직 수신되지 않았다면, 데이터 패킷은 이 데이터 패킷이 수신될 때 상기 설명한 바와 같이 처리될 수 있다.
도 26은 응답 패킷을 처리하기 위한 노드 로직(224)의 일 실시예의 동작을 도시한 흐름도이다. 다른 실시예들이 또한 가능하며 고려된다. 도 26에 도시된 단계들은 이해의 용이를 위해 특정한 순서로 도시되었지만, 어떠한 적절한 순서라도 이용될 수 있다. 또한, 단계들은 노드 로직(224) 내의 결합 로직을 이용하여 동시에 수행될 수 있다. 도 26에 도시된 단계들은, 다른 인터페이스들 그리고/또는 다른 가상 채널들로부터의 커매드 패킷들이 물리적으로 독립적이기 때문에, 동시에, 그리고 각각의 인터페이스 로직들(18M-18N) 그리고/또는 각 응답 패킷 버퍼와 독립적으로 수행될 수 있다. 단계들(114)은 (노드 로직(224)에 대해 유닛 ID 및 유닛 ID 레지스터들(230A-230N)에 기반을 두기는 하였지만), 도 16의 대응하는 단계들과 유사하다.
목적지 노드가 다른 노드인 경우, 노드 로직(224)은 응답 패킷들 (및 적용가능한 경우, 대응하는 데이터 패킷)을, 응답 패킷이 전송되는 링크 상의 수신기 내의 응답 가상 채널에 대한 빈 버퍼 엔트리로 전송한다(단계 250). 수신기는 응답 패킷을 패킷이 이미 흐르고 있는 동일한 방향(업스트림 또는 다운스트림)으로 흐를 수 있게 하는 노드이다.
응답 패킷의 목적지 노드가 이 노드라면, 노드 로직(224)은, 만일 있는 경우, 대응하는 응답 데이터 버퍼로부터의 대응하는 데이터 패킷을 그 응답에 할당된 데이터 버퍼로 이동시키도록 구성된다(단계 252). 다시 말해, 노드 로직(224)은 데이터를 다 써버린다. 이후, 노드 로직(224)은 대응하는 커맨드를 완료하고, 데이터 버퍼의 할당을 해제한다(단계 254). 주목할 사항으로서, 일단 응답 패킷이 처리되면(이 노드에 의해 전송 또는 수신되면), 응답 패킷이 응답 버퍼 엔트리로부터 제거되고 (그리고 적용가능한 경우, 데이터 패킷이 데이터 버퍼 엔트리로부터 제거된다).
주목할 사항으로서, 선택된 응답 패킷이 대응하는 데이터 패킷을 지정하는 경우, 다양한 실시예들은 데이터 패킷이 아직 수신되지 않았을 지라도 응답 패킷을 처리할 수 있으며, 또는 데이터의 전송을 단순화하기 위해, 또는 동일한 링크 상에서 전송이 완료되는 데이터 패킷을 지정하는 다른 제어 패킷을 가능하게 하기 위해 데이터 패킷의 도달을 기다릴 수 있다. 응답 패킷이 처리될 때 데이터 패킷이 아직 수신되지 않은 경우, 데이터 패킷은 이 데이터 패킷이 수신될 때 상기 설명한 바와 같이 처리될 수 있다.
도 27은 노드가 결합된 링크들 상에서 패킷을 시작하기 위한 노드 로직의 일 실시예의 동작을 도시한 흐름도이다. 다른 실시예들이 또한 가능하며 고려된다. 도 27에 도시된 단계들은 이해의 용이를 위해 특정한 순서로 도시되었지만, 어떠한 적절한 순서라도 이용될 수 있다. 또한, 단계들은 노드 로직(224) 내의 결합 로직을 이용하여 동시에 수행될 수 있다.
노드 로직(224)은 시작될 트랜잭션들이 이 노드로 리턴되는 데이터가 될 수 있는 지를 결정한다(결정 블록 260). 예를 들어, 노드에 의해 시작되는 판독 트랜잭션들은 데이터를 노드로 리턴시키며, 노드에 의해 시작되는 기록 트랜잭션들은 데이터를 노드로 리턴시키지 못한다. 트랜잭션이 데이터를 이 노드로 리턴되게 한다면, 노드 로직(224)은 리턴된 데이터를 저장하기 위해 데이터 버퍼를 할당한다(단계 262).