zeah 2025. 6. 16. 02:58
반응형

Bus는 interconnection network 중 가장 단순하고 가장 널리 사용되는 형태이다. Bus는 여러 module을 단일 공유 채널로 연결하며, 이 채널은 broadcast 매체로 작동한다. Bus는 일반적으로 여러 signal line(또는 단일 line)으로 구성되며, 이들 라인은 모든 module에 연결된다. 하나의 module이 bus를 통해 메시지를 전송하면, 나머지 모든 module은 해당 메시지를 수신하게 된다. 많은 경우 메시지는 특정 module을 대상으로 하며, 나머지 module은 이를 무시한다. 종종 메시지를 수신한 module은 원래 송신자에게 응답 메시지를 보낸다. 예를 들어, memory로부터 데이터를 읽기 위해 processor는 읽을 word를 지정하는 메시지를 memory module에 보낸다. 그러면 memory module은 요청된 데이터를 담은 메시지를 processor에 보내 transaction을 완료한다. Bus protocol은 어느 module이 언제 전송 권한을 가지는지를 결정하며, module 간 메시지와 transaction을 정의한다.

Bus는 상위 계층의 communication protocol이 활용하는 두 가지 주요 속성을 가진다: broadcastserialization. Bus에서 multicast나 broadcast 메시지를 전송하는 비용은 point-to-point 메시지를 전송하는 것과 동일하다. 이는 모든 메시지가 물리적으로 모든 module에 broadcast되기 때문이다. 이로 인해 global 정보를 bus를 통해 쉽게 분배할 수 있다. 또한, 한 번에 하나의 module만 bus를 통해 메시지를 전송할 수 있으므로 메시지들은 직렬화되어, 고정된 명확한 순서로 발생한다. Snooping cache-coherence protocol은 이러한 두 가지 속성을 모두 활용한다. 예를 들어, 쓰기 작업 시 cache line의 주소를 모든 module에 broadcast하여 각자 local copy를 무효화하거나 갱신할 수 있도록 하고, write는 직렬화되어 특정 주소에 마지막으로 쓰인 값이 무엇인지 명확하게 한다. 반면, broadcast가 무료가 아니고 serialization에 명시적 동기화가 필요한 일반적인 interconnection network에서는 이러한 protocol이 훨씬 복잡해진다.


22.1 Bus의 기본 개념

아래 그림 22.1은 A부터 D까지 네 개 module을 연결하는 일반적인 bus의 datapath를 보여준다. 각 module은 양방향 인터페이스를 통해 bus에 연결되어 있으며, 이 인터페이스는 transmit enable(ET)이 활성화될 때 신호 T를 bus로 내보내고, receive enable(ER)이 활성화될 때 bus에서 신호를 읽어와 내부 신호 R에 저장하도록 한다. 예를 들어, module A가 module C로 메시지를 보내려면, A는 transmit enable ETA를 활성화하여 TA 신호를 bus에 출력한다. 같은 cycle 동안, module C는 receive enable ERC를 활성화하여 bus로부터 메시지를 수신하여 내부 receive signal RC에 저장한다.

물리적으로, bus는 하나의 도선(serial bus), 전체 메시지를 한 번에 전달하는 여러 도선(parallel bus), 또는 그 중간 형태로 구성될 수 있다. 중간 형태에서는 메시지를 작은 수의 parallel conductor를 통해 순차적으로 여러 cycle에 나눠 전송할 수 있다.

전기적으로, bus는 각 module과의 연결로 인해 발생하는 stub 및 임피던스 불연속성 때문에 고속 동작이 매우 어렵다. 이러한 전기적 이슈는 이 책의 범위를 벗어난다. 논리적으로는, transmit 인터페이스는 각 module이 transmit enable이 활성화될 때 bus에 신호를 출력할 수 있도록 해야 한다. transmit 인터페이스는 다음과 같은 방식이 될 수 있다: tri-state driver(그림 22.2[a]), open-drain driver(22.2[b]), 또는 dotted-emitter driver(22.2[c]). 후자의 두 방식은 중첩(overlap)에 강점이 있다.


그림 22.1: 일반적인 bus의 datapath
네 개 module (A~D)이 공유 bus를 통해 통신한다. 특정 시점에 하나의 module만 transmit signal T를 bus에 출력할 수 있으며, 이때 transmit enable ET가 활성화된다. 해당 신호는 bus를 통해 broadcast되며, 다른 module은 각자의 receive enable ER을 통해 이를 수신할 수 있다.

 

그림 22.2: 일반적인 bus 송신기 인터페이스
(a) tri-state driver, (b) open-drain driver, (c) dotted-emitter driver

여러 module이 동시에 transmit enable 신호를 활성화하더라도 전력과 접지가 단락되지 않도록 설계되어 있다. 수신 인터페이스는 bus의 신호 레벨에 적합한 수신기와 receive enable이 활성화될 때 메시지를 캡처하는 레지스터로 구성된다. serial 또는 multicycle bus에서는 이 레지스터가 여러 cycle에 걸쳐 메시지를 조립할 수 있다.

Bus는 cycle, message, transaction 단위로 동작한다. 다른 interconnection network와 마찬가지로, message는 송신자로부터 수신자 집합으로 전달되는 논리적 정보 단위이다. 예를 들어 memory 주소를 읽기 위해 processor module은 주소와 control 정보를 포함한 message를 하나 또는 여러 memory module로 보낸다. Serial bus에서는 메시지를 구성하는 각 phit를 여러 cycle에 걸쳐 전송해야 한다. transaction은 인과관계에 의해 연결된 메시지들의 연속으로 구성된다. 모든 transaction은 하나의 message로 시작하며, 해당 message에 의해 유발된 일련의 응답 메시지로 구성된다. 예를 들어 memory read transaction은 processor에서 memory module로 보내는 요청 메시지와, 선택된 memory module에서 processor로 응답하는 메시지로 구성된다.

Bus는 외부 시퀀싱 방식 또는 내부 시퀀싱 방식으로 동작할 수 있다. 외부 시퀀싱 bus에서는 모든 transmit/receive enable 신호가 외부 중앙 시퀀서에 의해 제어된다. 내부 시퀀싱 bus에서는 각 module이 bus protocol에 따라 자체적으로 enable 신호를 생성한다. 예를 들어, 마이크로코드 방식 processor는 centralized control logic이 enable 신호를 생성해 레지스터와 연산 유닛 간의 데이터 전송을 제어하는 외부 시퀀싱 bus를 사용하는 경우가 많다. 반면, 대부분의 processor-memory bus는 내부 시퀀싱 구조를 가지고 있다. processor가 bus 제어권을 획득하면 자체적으로 transmit enable을 생성하고, memory module은 bus 상의 메시지를 모니터링하여 요청 메시지를 수신하거나 응답 메시지를 전송할 시점을 결정한다.

Bus cycle은 동기식(synchronous) 또는 비동기식(asynchronous)일 수 있다.
그림 22.3
(a) 동기식 bus에서는 bus clock에 동기화된 cycle 단위로 동작한다. 송신자는 clock cycle 시작 시 bus에 데이터를 출력하고, 수신자는 clock cycle 종료 시 데이터를 수신한다.
(b) 비동기식 bus에서는 송신자가 데이터를 bus에 출력한 뒤 request 신호(Req)를 assert한다. 수신자는 이 신호를 보고 데이터를 수신하고 acknowledge 신호(Ack)를 assert하여 전송 완료를 알린다. 송신자가 Ack를 받으면 driver를 비활성화하여 다음 전송을 위해 bus를 해제한다.

내부 시퀀싱 bus에서 메시지를 전송하는 과정은 arbitration, addressing, transfer, acknowledgment 순으로 진행된다.

  • Arbitration: 어떤 module이 transaction을 시작할지를 결정하며, 이긴 module은 bus master가 된다. 단순한 경우 processor만 항상 master가 되어 arbitration이 필요 없다.
  • Addressing: 수신 module을 지정한다. 어떤 bus는 broadcast address를 먼저 보내고 다음에 directed message를 보낸다. 또 어떤 경우는 메시지 자체에 address를 포함한다. 예: 그림 22.4와 같이 Control, Address, Data 순서로 구성된 메시지 사용. 여기서 address는 bus 상의 module을 지정하며, memory address는 Data 필드에 포함된다.

그림 22.5: 단순한 bus 예시
Processor P와 16개의 memory module (M0~M15)을 연결하는 병렬 bus 구조.

  • Control: 4비트 (cycle 종류)
  • Address: 4비트 (memory module 선택)
  • Data: 32비트 (주소 및 데이터 전송)

Read Transaction (Cycle 1~3)

  1. Cycle 1: Processor가 Control = Rd, Address = M4, Data = 100016 전송
  2. Cycle 2: Memory module M4 내부 접근 시간으로 idle
  3. Cycle 3: M4가 Control = Reply, Data = 요청된 데이터 전송

Write Transaction (Cycle 4~6)

  1. Cycle 4: Control = WrA, Data = 200016
  2. Cycle 5: Control = WrD, Data = 123416
  3. Cycle 6: M3가 Control = Ack 전송

timeout이 발생하면 bus 제어권은 processor로 다시 넘어가며, 이는 구현되지 않은 주소나 응답하지 않는 module로 인한 bus block을 방지한다.


22.2 Bus Arbitration

여러 module이 transaction을 시작할 수 있는 구조에서는 bus 사용 권한을 얻기 위해 arbitration이 필요하다. 이는 18장에서 설명한 어떤 arbitration 방식도 사용 가능하다.

Radial arbitration: 중심 arbiter에서 방사형으로 각 module과 연결되어 있으며, module은 request를 보내고 arbiter는 grant를 응답한다. 공정성을 위해 module은 마지막 cycle에서 request를 해제하거나, arbiter가 transaction을 감지하여 grant를 다음 module로 전환한다.

그림 22.7은 동기식 bus의 arbitration timing을 보여준다.

  • Cycle 1: Module 1이 request 전송
  • Cycle 2: Arbiter가 grant 부여
  • Cycle 3: Module 1이 transaction 시작
    → 고정 master 방식에 비해 2 cycle의 latency가 추가됨

그림 22.6: Radial Arbitration을 사용하는 bus 구조
각 module은 transaction을 시작하고자 할 때 중앙 arbiter로 request 신호를 보낸다. Arbiter가 grant 신호로 응답하면 해당 module은 bus master가 되어 transaction을 시작한다.

module 1이 transaction을 진행하는 동안 module 2는 bus 요청을 대기해야 한다. arbitration으로 인해 첫 transaction 종료와 두 번째 시작 사이에 2 cycle의 idle 구간이 생긴다. 이 idle 구간은 다음 transaction에 대한 arbitration을 현재 transaction과 동시에 수행하는 pipelining 기법으로 제거할 수 있다.

중앙 arbiter 없이 동작하는 방식으로는 Daisy-chain arbitration이 있다 (그림 22.8). 여기서는 고정 우선순위 arbiter가 각 module에 분산되어 있고, module 간 carry 신호를 전달한다. module 1은 carry0를 high로 고정하므로 항상 request 시 grant를 받는다. module 1이 요청하지 않으면 carry가 다음 module로 전달된다. 하지만 이 방식은 고정 우선순위와 delay 문제로 인해 현대 시스템에서는 거의 사용되지 않는다.

또 다른 방식은 wire-OR bus를 이용한 Sequential Distributed Arbitration이다. open-drain 또는 emitter-follower transmitter를 사용하는 경우, 각 bus line은 모든 송신기의 출력을 OR한 결과를 나타낸다. 이를 활용해 module의 주소 비트 우선순위대로 arbitration을 수행할 수 있다.

그림 22.9: Wire-OR bus를 이용한 분산 arbitration 알고리즘

  1. 우선순위의 최상위 비트부터 시작
  2. 모든 module이 자신의 우선순위를 bus에 출력
  3. 각 module은 bus에서 읽은 값이 자신의 비트보다 크면 경쟁에서 탈락
  4. 최종적으로 가장 높은 우선순위를 가진 module만 남아 bus master가 됨

표 22.1: 분산 arbitration 예시

  • 세 module의 우선순위: 1001(9), 1010(10), 0111(7)
  • Cycle 1: OR 결과 1111 → priority 7 탈락
  • Cycle 2: OR 결과 1011 → 모두 유지
  • Cycle 3: OR 결과 1011 → priority 9 탈락
  • Cycle 4: OR 결과 1010 → priority 10 승리

이 분산 arbitration 방식은 고정 우선순위(주소를 우선순위로 사용), least-recently-served(기존 master는 우선순위 0, 나머지는 증가) 등으로 구현할 수 있다.

장점: 별도의 중앙 제어 회로 없이 bus line만으로 구현 가능
단점: 느리고 arbitration 동안 bus 사용이 제한됨 → transaction과 arbitration 병렬 수행 불가능

Replicated Arbiter는 각 module에 arbiter 복사본을 배치하고 request 신호를 모든 복사본에 전달하는 방식이다. reset 시 모든 복사본은 동일한 상태에서 시작하며, 같은 입력으로 동일한 grant를 생성한다. 단, 다음과 같은 단점이 있다:

  • 버스 라인 수와 로딩 증가
  • State replication 문제 발생 가능 (soft error, 동기화 문제로 grant 충돌 발생 위험)
    → 이 문제를 방지하려면 복잡한 동기화 로직이 필요함

22.3 고성능 Bus Protocol

22.3.1 Bus Pipelining

앞서 본 그림 22.7에서처럼 arbitration 대기 시간 동안 bus가 idle 상태가 되면 성능이 저하된다. 특히 shared-memory multiprocessor처럼 거의 모든 transaction에 대해 arbitration이 필요한 경우 문제는 더 심각해진다. 이 경우 bus transaction의 각 phase를 pipeline으로 구성해 bus의 duty factor를 높일 수 있다.

그림 22.10은 memory write와 memory read transaction에 대한 pipeline sequence 및 reservation table을 보여준다.

  • 위쪽: cycle 순서
  • 왼쪽: 사용되는 자원
  • 진한 음영: 해당 cycle에서 독점 사용
  • 옅은 음영: 공유 가능

(a) Memory Write Transaction

  • Cycle 1: AR (arbiter request)
  • Cycle 2: ARB (arbitration decision)
  • Cycle 3: AG (grant)
  • Cycle 4: RQ (request),
  • Cycle 5: ACK (acknowledge)

(b) Memory Read Transaction (memory latency = 1 cycle)

  • Cycle 1~3: AR, ARB, AG
  • Cycle 4: RQ (read request)
  • Cycle 5: P (processing, memory access)
  • Cycle 6: RPLY (reply)

→ pipeline 구조 덕분에 각 phase가 중첩 실행되어 bus 사용률이 향상된다.

 

AG cycle은 arbitration 결과로 grant가 요청자에게 전달되는 cycle이다. Arbitration이 끝난 후, read transaction은 다음과 같이 구성된다:

  • RQ: 주소를 memory module로 전송
  • P: memory access 수행
  • RPLY: 데이터를 요청자에게 반환

Reservation table은 각 cycle 동안 어떤 자원이 사용 중인지 나타낸다.

  • 진한 음영: 해당 cycle 동안 transaction이 독점적으로 사용하는 자원
  • 옅은 음영: 여러 transaction이 동시에 사용할 수 있는 자원 (ex. arbitration, request 등)

Reservation table은 다음과 같은 간단한 규칙을 제공한다:
고정 지연을 가진 transaction은 그 reservation table이 독점 자원을 이미 다른 transaction이 점유하고 있지 않은 어떤 cycle에서도 시작할 수 있다.

→ 예시:

  • read transaction은 한 cycle 간격으로 시작할 수 있으나, 세 번째 read는 두 cycle을 기다려야 함
  • write transaction은 read 이후 최소 세 cycle을 기다려야 시작할 수 있음

그림 22.11은 pipelined bus에서 6개의 transaction(read 4개, write 2개)을 실행한 timing을 보여준다.

  • unpipelined bus에서는 34 cycle이 걸리지만
  • pipelined bus에서는 arbitration latency가 완전히 숨겨지며, 총 17 cycle에 완료된다.
  • Read 4의 P cycle 동안 Read 5가 RQ를 issue하는 것처럼 reservation 충돌이 없는 경우 병행 가능

그러나 read 후 write가 나오는 경우 pipeline 구조 mismatch로 인해 idle cycle이 발생한다. 예를 들어 Write 2는 Read 1의 RPLY와 충돌하지 않기 위해 cycle 7까지 대기해야 한다.
가변 지연이 있는 transaction이 포함될 경우 상황은 더 악화된다. 예: read의 P cycle이 0~20까지 걸릴 수 있다면, 그 동안 bus는 idle 상태가 된다.


22.3.2 Split-Transaction Buses

이러한 idle 문제는 transaction을 둘로 나누고 그 사이에 bus를 arbitration에 개방함으로써 해결할 수 있다. Split-transaction bus는 request와 reply 사이가 길고 가변적인 경우, bus 자원을 보다 효율적으로 사용하기 위해 사용된다.

그림 22.12는 Figure 22.11과 동일한 transaction sequence를 split-transaction으로 구성한 예다.
각 transaction은 다음과 같이 둘로 나뉜다:

  1. RQ 메시지를 보내는 transaction
  2. RPLY 또는 ACK 메시지를 보내는 transaction

예: Read 1은 cycle 4에서 RQ 전송 후 종료되고, Rply 1이 cycle 8에서 응답

  • 이 구조에서 arbitration은 3 cycle이 걸리므로, request와 응답 사이 최소 지연은 4 cycle
  • Latency는 증가하지만, waiting 동안 bus를 계속 사용할 수 있으므로 utilization은 극대화

그림 22.13은 transaction delay가 가변적인 경우의 이점을 보여준다.
(a) pipelined bus: 요청 후 응답을 위해 bus를 예약해야 하므로 다음 transaction이 대기해야 함
(b) split-transaction bus: RQ A 이후 RP A까지 대기 시간 동안 RQ B, C 및 그 응답을 병렬로 수행 가능

→ 단, 같은 cycle에 RP A와 RP C가 준비된다면 arbitration을 통해 한 쪽이 우선 처리되고 나머지는 대기

Split-transaction bus는 응답이 어떤 요청에 대한 것인지 식별하는 메커니즘이 필요하다.

  • 일반 bus는 timing으로 응답을 식별하지만
  • split-transaction bus는 응답 순서가 임의적이므로
  • 각 request에 고유한 tag를 부여하고, 응답 메시지에도 해당 tag를 포함해 매칭해야 함

예:

  • Sequent Symmetry: 요청자가 arbitration을 이기면 tag를 중앙 pool에서 받아 사용
  • SCSI: tag는 source address, destination address, sequence number로 암묵적으로 구성됨

22.3.3 Burst Messages

Bus transaction은 arbitration, addressing, acknowledgment 등 고정 오버헤드가 존재하며, 단일 word 전송일 경우 payload보다 오버헤드가 클 수 있다 (100% 이상).

→ 이 오버헤드를 줄이기 위한 방법: burst message, 즉 여러 word를 하나의 메시지로 묶어 전송

그림 22.14는 burst mode 메시지의 효율성 향상을 보여준다.
(a) 단일 word 전송: 3 cycle 중 2 cycle이 오버헤드 → 효율 1/3
(b) 4 word 전송: 총 6 cycle 중 4 word 전송 → 효율 2/3
(c) 8 word 전송이면 효율은 8/(8+2) = 4/5

일반화: 오버헤드 x cycle, 데이터 n word 전송 시 효율 = n / (n + x)

→ 그렇다고 무조건 burst size를 크게 하면 안 된다.

  • Burst size가 커질수록 high-priority requester의 대기 시간이 길어짐
  • 예: 256-word burst이면 대기 시간이 258 cycle로 증가 → 많은 application에서 불가능

해결책:

  • 일부 bus는 **burst 중단(interrupt)**과 재개(resume) 또는 **재시작(restart)**을 지원
  • 예: 메시지 A(8-word burst)를 메시지 B가 중단하고, 이후 A가 재개됨
    • A 재개 시 tag로 해당 message임을 식별해야 함
    • 중단된 메시지가 여러 개일 경우 이 tag는 필수
    • 경우에 따라 메시지를 처음부터 재시작할 수도 있음

그림 22.15는 interruptible burst message의 예를 보여준다 (이후 페이지에서 등장).

 

그림 22.15: Burst interrupt and resume
Message A가 전송 중에 Message B에 의해 중단되고, 이후 다시 재개됨.

  • 메시지를 abort하고 처음부터 다시 시작하는 방식은 중복된 데이터 전송으로 인해 성능을 떨어뜨릴 수 있다.
  • 긴 메시지를 중단하는 것은 긴 패킷을 여러 flit으로 나누는 것과 유사하다.
    → 고우선순위 패킷이 전체 패킷 전송을 기다릴 필요 없이 채널 대역폭을 할당받을 수 있다.
    → 차이점: flit은 매번 overhead를 가지지만, bus message는 실제로 interrupt될 때만 resume overhead가 발생한다.

22.4 Bus에서 Network로의 전환

기존에는 bus로 수행되던 많은 통신 작업이 이제 network로 이전되고 있다.
→ 일부 설계자는 bus의 특성을 point-to-point network에서 재현하려 한다.

복제하기 쉬운 특성: 모든 module이 공통 interface를 사용하는 구조
복제하기 어려운 특성: 모든 transaction의 직렬화(serialization), 전체 module에 대한 broadcast

예: Peripheral Component Interconnect (PCI) 버스는

  • 다양한 컴퓨터와 주변기기가 모듈화된 방식으로 상호운용할 수 있게 해 줌

Network에서도 Chapter 20에서 설명한 것처럼 공통 interface를 제공하지만,

  • 표준화는 미비함 → 최근 PCI-Express, Infiniband, Fibre Channel Switched Fabric 등의 등장으로 점점 확산 중

문제:

  • On-chip bus는 RC delay 문제로 인해 큰 단일 전기 노드로 구현 불가
    전기적 제약으로 인해 shared medium 사용이 어려움

해결책:

  • OR network 기반 논리적 bus (그림 22.16): 각 module의 출력이 OR되어 하나의 신호로 병합
    • 단, linear OR chain과 repeater chain은 delay가 큼 → tree network로 개선 가능 (Exercise 22.5 참고)

Broadcast & Serialization 유지 시도:

  • 예: snooping cache-coherence protocol
  • 256-bit wide bus로 cache line을 병렬 전송 (대용량 전송은 빨라지지만, 여러 address cycle을 동시에 처리 못함)
    → 해결책: 여러 parallel bus 사용
    • ex) 4개의 parallel address bus를 운영
    • 순서 보장을 위해 낮은 index의 bus가 먼저 도착한 것으로 간주
    • 단점: 충돌 감지를 위한 logic이 선형 이상으로 증가 → 고비용

궁극적 해결:

  • bus semantics 포기, network로 전환
    • broadcast가 필요한 경우에만 multicast 또는 분산 트리 사용
    • serialization이 필요한 경우, 특정 노드를 통해 모든 메시지를 전달해 순서 보장
    • 관련된 메시지만 직렬화하고 나머지는 병렬 처리 가능

예: directory-based coherence를 사용하는 대규모 shared memory 시스템은 일반적인 interconnection network 기반에서 동작함


22.5 PCI Bus 사례 연구

가장 널리 사용되는 버스 중 하나는 PCI Bus이다.

  • 임베디드 시스템부터 서버까지 다양한 시스템에서 사용
  • 이 장에서 설명한 여러 bus 특성을 종합적으로 갖춤

PCI 특징:

  • Synchronous bus, Multiplexed address/data line, Pipelined arbitration
  • 32-bit / 64-bit 지원
  • 33MHz / 66MHz / 133MHz
  • 최고 성능: 64-bit at 133MHz → 1 GByte/s burst 가능

표 22.2: 주요 PCI 신호선 설명

이름설명
CLK 모든 신호는 CLK의 rising edge에서 샘플링
AD[31:0] 주소/데이터 버스. address cycle에는 initiator가 주소 제공, data cycle에는 data 제공 (쓰기: initiator, 읽기: target)
C/BE[3:0] command / byte-enable. address cycle에서는 명령어(memory read 등), data cycle에서는 유효 byte 지정
FRAME# initiator가 bus transaction 시작 시 assert. deassert는 마지막 data cycle 시작을 의미
IRDY# initiator ready. IRDY#와 TRDY#가 모두 assert되면 전송 발생
TRDY# target ready. TRDY#와 IRDY#가 모두 assert될 때 data 전송
REQ# initiator가 bus master가 되기 위해 요청
GNT# 중앙 arbiter가 grant. 현재 transaction 완료 후 grant 받은 module이 initiator가 됨
 

예: 두 word PCI read transaction (그림 22.17)

  • Cycle 1: FRAME# assert, AD에 주소, C/BE에 memory read 명령
  • Cycle 2: IRDY# assert되지만 TRDY#는 아직 → 전송 안됨 (idle)
  • Cycle 3: TRDY# assert됨 → IRDY# & TRDY# 둘 다 활성 → 1st word 전송
  • Cycle 4: TRDY# 유지, IRDY#는 비활성 → 대기
  • Cycle 5: IRDY# 재활성화 → 2nd word 전송
  • Cycle 6: FRAME#과 IRDY# 모두 비활성 → transaction 종료
  • Cycle 7: 다음 master가 transaction 시작 가능

Write transaction은 read와 유사하나

  • data cycle 동안 initiator가 AD를 구동
  • turnaround idle cycle 불필요

그림 22.18: PCI bus arbitration pipelining

  • Cycle 1: module 1, 2가 동시에 REQ# assert
  • Cycle 2: arbiter가 module 1에 GNT1# assert
  • Cycle 3: module 1이 FRAME# assert 후 transaction 시작
  • Cycle 4: arbiter는 GNT1# 비활성화, GNT2# 활성화 → 다음 master에게 grant

 

그림 22.17: PCI bus read transaction

  • Cycle 1: initiator가 FRAME#을 assert하고 주소와 명령어(memory read)를 AD 및 C/BE에 제공
  • Cycle 2: IRDY#는 assert되지만 TRDY#는 아직 → 전송 없음 (turnaround idle)
  • Cycle 3: target이 TRDY# assert 및 데이터 전송 → 첫 번째 word 전송
  • Cycle 4: target은 데이터 제공, IRDY#는 비활성 → 대기
  • Cycle 5: IRDY# 재활성화 → 두 번째 word 전송
  • Cycle 6: FRAME#과 IRDY# 모두 비활성화 → transaction 종료

그림 22.18: PCI bus arbitration

  • Cycle 1: module 1과 2가 각각 REQ# assert
  • Cycle 2: arbiter가 module 1에 GNT# 부여
  • Cycle 3: module 1이 FRAME#을 assert하며 transaction 시작
  • Cycle 5: FRAME#과 IRDY# deassert → transaction 종료
  • Cycle 6: module 2가 FRAME#을 assert하며 다음 transaction 시작

PCI transaction은 split되지 않는다.

  • Read transaction은 요청과 응답을 포함
  • 단, latency가 긴 경우 bus 점유 방지를 위해 delayed transaction을 허용
    • target은 요청 정보를 latch한 후 TRDY# 대신 STOP#을 assert하여 transaction을 abort
    • initiator는 나중에 retry

→ delayed transaction은 split transaction과 유사하지만, 효율이 떨어지며 예외적인 경우에만 사용

PCI는 module 초기화를 위한 protocol 포함

  • 일반 address cycle 외에, IDSEL이라는 radial select signal로 slot 번호 기반 addressing 수행
  • 이를 통해 module의 configuration register를 read/write 가능
  • 초기화 과정:
    • controller가 module type을 파악하기 위해 register 읽음
    • 이후 address와 옵션을 설정하기 위해 configuration register에 write

22.6 문헌 주석

Bus의 기원은 1940~50년대 초기 컴퓨터까지 거슬러 올라간다.

  • Digital의 Unibus 이후 peripheral interface의 표준으로 자리 잡음
  • 현대 예시: PCI bus, SCSI bus

1960~1980년대: 대부분의 미니/마이크로컴퓨터는 bus로 CPU와 memory 연결
→ 현대 PC는 north-bridge chip을 통한 point-to-point 연결로 대체됨

흥미롭고 고성능인 예:

  • Rambus의 DRDRAM bus: high-bandwidth DRAM 연결
  • Sonics의 on-chip network: point-to-point 연결로 OR-tree 구조 bus 실현
  • Sun Ultra Enterprise 10,000: point-to-point 기반의 다중 address bus 사용
    → 이 사례들은 bus보다 network를 사용하는 이유를 뒷받침함

추가 정보: The Digital Bus Handbook에서 bus 기술에 대해 더 자세히 설명됨


22.7 연습문제

22.1 Multiplexed vs. Non-multiplexed bus 설계

  • 모든 transaction은 32-bit 주소와 4-bit control 포함
  • Read: 70%, 32-bit data를 slave → master
  • Write: 30%, 32-bit data를 master → slave (주소 전송과 동시에 가능)
  • 전체 40개 bus line 사용 가능
    → throughput 극대화 설계를 하라 (multiplexed 및 non-multiplexed 고려, pipelined 구조 가정)

22.2 Early win 분산 arbitration 최적화

  • Figure 22.9의 분산 arbitration은 b비트 address일 때 b cycle 소요
  • 일부 경우 더 빠르게 끝낼 수 있는 최적화 방법 제시
  • i개의 module이 무작위로 요청할 때의 평균 arbitration 시간 시뮬레이션 (0 < i ≤ b, b=8)

22.3 Reply bus 분리된 pipelined bus

  • Figure 22.11의 transaction을 reply bus가 별도로 존재하며 arbitration도 독립인 시스템에서 timing diagram 작성
  • 처리 속도 비교

22.4 Bus에서의 Virtual channel

  • 메시지를 flit 단위로 나누고 각 flit에 virtual channel tag를 추가
  • 대형 메시지가 짧은 고우선 메시지에 의해 interrupt될 수 있게 함
    → flit size에 따른 오버헤드 vs. 최대 대기 시간 그래프 작성
    (최대 메시지: 64KB, VC: 8개)

22.5 Tree 기반 bus 구조

  • Figure 22.16의 point-to-point OR bus를 tree로 재구성해 delay 최소화
  • 조건:
    • chip 크기 12mm x 12mm
    • module: 2mm 정사각형
    • 2mm마다 repeater 필요
    • 2mm 이동 및 1 gate 통과 시 시간 = 1 단위
      → 36개 module로 구성 시 linear vs. tree 구조의 최대 latency 비교

22.6 Split-transaction 버스에서의 reply ordering 시뮬레이션

  • tag를 쓰지 않고 request 순서에 따라 reply 순서를 고정하는 구조 비교
  • transaction delay는 1~Tmax 사이 균등 분포
    → tagged vs. ordered-reply bus의 평균 latency 비교 시뮬레이션

 

Figure 22.17: PCI bus read transaction
Cycle 1: initiator가 FRAME#을 assert하고, AD에 주소를, C/BE에 명령어(memory read)를 출력함
Cycle 2: IRDY#는 assert되었지만, TRDY#는 아직 비활성 상태 → 데이터 전송 없음 (turnaround)
Cycle 3: target이 TRDY#를 assert하고 첫 번째 데이터를 전송함 → IRDY#와 TRDY# 모두 assert되어 전송 발생
Cycle 4: 두 번째 데이터는 준비되었지만, IRDY#는 아직 비활성 → 전송 지연
Cycle 5: IRDY#가 assert되어 두 번째 데이터 전송 완료. 이 cycle에서 FRAME#도 deassert되어 마지막 data cycle임을 의미
Cycle 6: FRAME#과 IRDY#가 모두 deassert되어 transaction 종료됨

Figure 22.18: PCI bus arbitration
Cycle 1: module 1과 module 2가 각각 REQ1#과 REQ2#를 assert
Cycle 2: arbiter가 GNT1#을 assert하여 module 1에 bus master 권한 부여
Cycle 3~5: module 1이 transaction 수행
Cycle 5 종료 시 FRAME#과 IRDY#가 deassert되어 transaction 종료가 signal됨
Cycle 6: module 2가 이를 감지하고 FRAME#을 assert하여 새로운 transaction 시작


PCI의 주요 특징 요약

  • PCI는 split transaction을 지원하지 않는다. 한 read transaction에 요청과 응답이 모두 포함된다.
  • 단, long latency operation 중 bus 점유를 방지하기 위해 abort 및 retry 메커니즘을 제공함
    → target은 요청 정보를 latch한 뒤, TRDY# 대신 STOP#을 assert하여 transaction을 중단
    → initiator는 나중에 transaction을 retry (PCI 용어로 delayed transaction이라 함)

Delayed transaction은 bus 점유 최소화 측면에서 split transaction과 유사하지만, 효율이 떨어지며 예외적 경우에만 사용됨

초기화 프로토콜

  • 일반적인 AD bus를 통한 address 지정 외에 IDSEL(radial select signal)을 사용한 slot 기반 module 선택이 가능
  • Configuration read/write cycle을 통해 module의 구성 레지스터를 접근할 수 있음
    → 예: module 종류를 식별하고, 주소 설정 및 옵션 구성

22.6 문헌 주석

Bus는 등장 시점을 특정하기 어려울 만큼 오래되었으며, 1940~50년대의 초기 컴퓨터에서도 사용되었다.

  • Digital의 Unibus 이후 peripheral interface의 표준 구조가 되었다.
  • PCISCSI는 현대적인 예시
  • 1960~80년대: 대부분의 minicomputer와 microcomputer는 memory를 CPU에 연결할 때 bus를 사용
  • 현재는 north-bridge chip을 통한 point-to-point 연결로 대체

현대 예시

  • Rambus의 DRDRAM bus: 고대역폭 DRAM 연결
  • Sonics의 on-chip network: OR-tree 방식의 point-to-point bus 실현
  • Sun Ultra Enterprise 10,000: point-to-point 방식으로 bus 구성 + 다중 address bus 사용

→ 네트워크 방식이 bus보다 성능, 비용, 확장성에서 유리함을 잘 보여줌

추가 정보는 The Digital Bus Handbook 참고


22.7 연습문제

22.1 Multiplexed vs. Non-multiplexed bus 설계

  • 모든 transaction은 32-bit 주소 + 4-bit 제어 신호 필요
  • Read: 전체 transaction의 70%, slave → master로 32-bit data 전송
  • Write: 나머지 30%, master → slave로 32-bit data 전송 (주소와 동시에 전송 가능 시 그렇게 함)
  • 전체 bus line 수: 40개
    → 최대 throughput을 갖는 bus 설계 제안 (multiplexed / non-multiplexed, pipelined 구조 가정)

22.2 Early win 분산 arbitration 최적화

  • Figure 22.9의 방식: b비트 address일 경우 b cycle 필요
    → 일부 경우 더 빠르게 끝낼 수 있는 방법 제시
    → i개의 module이 무작위로 요청할 때 (0 < i ≤ b, b = 8), 평균 arbitration 시간 시뮬레이션 및 그래프화

22.3 Reply bus가 분리된 pipelined bus의 timing 분석

  • Figure 22.11의 transaction 시퀀스를, 응답을 위한 별도 bus와 arbitration이 존재한다고 가정하고 timing diagram 작성
    → 처리 속도 비교

22.4 Bus에서의 Virtual channel 개념 분석

  • 메시지를 flit 단위로 나누고 각 flit에 virtual-channel tag 부여
  • 고우선순위 짧은 메시지가 대형 메시지를 interrupt할 수 있음
    → flit size를 함수로 하여 overhead와 최대 대기 시간 그래프 작성
    (가정: 최대 메시지 64KB, virtual channel 8개)

22.5 Tree 기반 bus 지연 비교

  • Figure 22.16의 point-to-point 기반 bus를 tree 구조의 OR-network와 repeater chain으로 개선
  • 조건:
    • chip 크기 12mm², module 크기 2mm²
    • 2mm마다 repeater 또는 logic gate 필요
    • wire 2mm + gate 1개 = 1 단위 시간
      → 36 module 구성 시 linear vs. tree 구조에서 최대 latency 비교

22.6 Split-transaction 버스에서의 tagged vs. ordered reply 시뮬레이션

  • Tag 사용 없이 요청 순서를 따라 응답 순서를 고정
    → 응답은 위치 기반으로 식별됨
  • transaction delay는 1~Tmax 사이 균등 분포
    → tagged bus vs. ordered-reply bus의 평균 latency 비교 시뮬레이션 수행
반응형