MII, RMII, GMII, RGMII: PHY로의 병렬 인터페이스
병렬 매체 독립 인터페이스(MII)는 MAC과 구리 PHY 칩을 PCB 위 몇 센티미터 구간으로 연결합니다 — 라우터, 소형 스위치, 액세스 포인트, 산업용 컨트롤러, RJ45가 달린 모든 임베디드 보드 내부에서 쓰입니다. 이들은 트랜시버 케이지까지 이어지지는 않지만, 케이지까지 이어지는 모든 인터페이스의 기준점이 됩니다: SGMII는 “직렬화된 GMII”이고, XGMII는 “10G에서의 GMII”이며, 구리 SFP 내부의 PHY도 이 가운데 하나로 내부 통신을 합니다. 이 페이지는 MII, RMII, GMII, RGMII의 핀, 클럭, 타이밍, RGMII 지연 문제, 인밴드 상태, MDIO 관리, 각 인터페이스에서 발생하는 장애를 다룹니다.
MII(IEEE 802.3 Clause 22)
| 항목 | 값 |
|---|---|
| 속도 | 10, 100 Mb/s |
| 데이터 | 4비트 TXD[3:0], 4비트 RXD[3:0] |
| 클럭 | TX_CLK, RX_CLK 모두 PHY에서 공급: 25 MHz(100M), 2.5 MHz(10M) |
| 제어 | TX_EN, TX_ER, RX_DV, RX_ER, CRS(carrier sense), COL(collision) |
| 관리 | MDC, MDIO(공유) |
| 신호 수 | 데이터/제어 16 + 관리 2 |
| 전압 레벨 | 5 V/3.3 V TTL |
| 전송 거리 | 수 cm; MAC당 PHY 1개 |
마이크로컨트롤러와 FPGA에서는 여전히 쓰이지만, 핀 수 문제로 RMII가 그 자리를 대체했습니다.
RMII(RMII Consortium spec v1.2)
| 항목 | 값 |
|---|---|
| 속도 | 10, 100 Mb/s |
| 데이터 | 2비트 TXD[1:0], RXD[1:0] |
| 클럭 | 단일 REF_CLK 50 MHz, MAC과 PHY가 공유; 오실레이터, MAC, PHY(PHY-clock-out 모드) 중 하나가 공급 |
| 제어 | TX_EN, CRS_DV(carrier sense와 data valid를 다중화), RX_ER(선택) |
| 신호 수 | 7–9 |
| 10 Mb/s 모드 | 각 니블을 50 MHz에서 10회 반복 |
| 전송 거리 | cm 단위 |
50 MHz 기준 클럭 토폴로지는 RMII의 고전적인 버그입니다: PHY는 외부 클럭을 기대하는데 SoC는 PHY가 클럭을 공급하길 기대하면, 링크 LED는 정상인데 인터페이스는 죽어 있는 상태가 됩니다.
GMII(Clause 35)
| 항목 | 값 |
|---|---|
| 속도 | 1000 Mb/s; 10/100에서는 MII 신호 방식으로 폴백 |
| 데이터 | 8비트 TXD[7:0], RXD[7:0] |
| 클럭 | 송신은 MAC에서 공급하는 GTX_CLK 125 MHz; 수신은 PHY에서 공급하는 RX_CLK 125 MHz; TX_CLK(PHY 공급)은 10/100 폴백에서만 사용 |
| 제어 | TX_EN, TX_ER, RX_DV, RX_ER, CRS, COL |
| 신호 수 | 24 + 관리 |
| 전압 레벨 | 2.5 V(다수 제품은 3.3 V 허용) |
| 전송 거리 | cm 단위; 125 MHz 싱글 데이터 레이트에서는 타이밍 여유가 빠듯함 |
오늘날에는 대부분 온칩 또는 FPGA 내부 인터페이스로만 쓰이며, 보드 위에서는 RGMII가 그 자리를 대신합니다.
RGMII(Reduced GMII, HP/Marvell specification v1.3, v2.0)
| 항목 | 값 |
|---|---|
| 속도 | 10/100/1000 |
| 데이터 | 4비트 TXD[3:0]과 RXD[3:0], 더블 데이터 레이트: 라이징 엣지에 하위 니블, 폴링 엣지에 상위 니블 |
| 클럭 | TXC 125 MHz(MAC 공급), RXC 125 MHz(PHY 공급); 100M/10M에서는 25/2.5 MHz |
| 제어 | TX_CTL(라이징 엣지에 TX_EN, 폴링 엣지에 TX_EN xor TX_ER), RX_CTL(RX_DV / RX_DV xor RX_ER) |
| 신호 수 | 12 |
| 전압 레벨 | 2.5 V(v1.3), 1.5 V HSTL 또는 1.8 V(v2.0 옵션); 일부 PHY는 3.3 V |
| 전송 거리 | ≤ 10–15 cm, 길이를 맞춘 트레이스 |
지연 문제
RGMII는 수신단에서 클럭이 데이터 엣지보다 1.5–2.0 ns 늦게 도착해야 합니다(셋업/홀드 윈도). 이를 만족하는 방법은 세 가지입니다:
| 모드 | 지연을 추가하는 주체 | 디바이스 트리 phy-mode | 비고 |
|---|---|---|---|
| PCB 지연(v1.3) | 클럭 트레이스를 약 5 cm 추가 | rgmii | 고전적이지만 불안정 |
| PHY 내부 지연(RGMII-ID, v2.0) | PHY가 TX/RX 클럭에 2 ns 추가 | rgmii-id | 오늘날 가장 흔함 |
| MAC/SoC 내부 지연 | SoC가 지연을 추가 | rgmii + MAC 쪽 지연 레지스터 | — |
| 혼합 | PHY가 한쪽 방향에만 적용 | rgmii-txid, rgmii-rxid | 한쪽만 지원하는 경우 |
지연을 두 번(PCB와 PHY 모두) 추가하거나 전혀 추가하지 않으면 RGMII 특유의 장애가 나타납니다: 1G에서는 링크가 올라와도 CRC 오류가 나거나 트래픽이 없고, 100M은 정상 동작합니다(100M은 주기가 40 ns라 스큐를 견딜 수 있습니다). PHY의 지연 레지스터나 phy-mode를 바꿔서 해결합니다.
인밴드 상태
유휴 상태일 때 PHY는 RXD[3:0]에 링크, 속도, 듀플렉스 정보를 실어 보내므로 MAC은 MDIO를 읽지 않고도 클럭 분주기를 재설정할 수 있습니다: RXD[0]은 링크, RXD[2:1]은 속도(00 = 10, 01 = 100, 10 = 1000), RXD[3]은 듀플렉스를 나타냅니다. 일부 MAC은 이를 무시하고 MDIO 폴링에만 의존합니다; 기대치가 어긋나면 PHY에서는 링크가 올라왔는데 MAC에서는 다운으로 보이는 상태가 됩니다.
TBI와 RTBI
Ten-Bit Interface: MAC/PCS와 외부 SerDes 또는 광 PHY 사이에서 8b/10b로 인코딩된 1000BASE-X 심벌을 주고받습니다(125 MHz에서 10비트, RTBI는 DDR로 5비트). 보드에서는 더 이상 쓰이지 않으며, 그 직렬 후속 규격이 1000BASE-X/SGMII입니다(SGMII와 시리얼 기가비트).
비교
| 인터페이스 | 핀(데이터+제어) | 클럭 | 최대 속도 | 전압 | 일반적인 용도 |
|---|---|---|---|---|---|
| MII | 16 | PHY에서 25 MHz | 100M | 3.3/5 V | MCU, 레거시 |
| RMII | 7–9 | 50 MHz 공유 | 100M | 3.3 V | 임베디드 SoC + PHY |
| SMII | 포트당 2–3 | 125 MHz | 100M | 3.3 V | 멀티포트 PHY(Cisco) |
| GMII | 24 | 125 MHz(MAC 송신/PHY 수신) | 1G | 2.5 V | FPGA, 온칩 |
| RGMII | 12 | 125 MHz DDR | 1G | 2.5/1.8/1.5 V | 보드 위 SoC ↔ PHY |
| SGMII | 4(2쌍) | 임베디드 1.25 GBd | 1G(10/100은 리플리케이션) | CML | SoC ↔ PHY, SFP 케이지 |
PHY 관리: MDIO/MDC
| 항목 | Clause 22 | Clause 45 |
|---|---|---|
| 주소 지정 | 5비트 PHY 주소, 5비트 레지스터(레지스터 32개) | 5비트 포트, 5비트 디바이스(PMA/PMD, PCS, PHY XS, DTE XS, AN, vendor), 16비트 레지스터 |
| 주요 레지스터 | 0번 control(리셋, 속도, AN 활성화, 루프백), 1번 status(링크, AN 완료), 2–3번 PHY ID(OUI + 모델), 4번 AN advertisement, 5번 link-partner ability, 9/10번 1000BASE-T control/status, 17번 이상 vendor(RGMII 지연, LED) | 1.x PMA, 3.x PCS, 7.x AN, 30.x/31.x vendor |
| 속도 | MDC ≤ 2.5 MHz(실제로는 더 빠른 경우가 많음) | 동일 |
| Linux 도구 | mii-tool -v eth0, phytool read eth0/1/0, ethtool eth0; 드라이버는 phylib, phylink 경유 | phytool read eth0/1:1/0 |
이는 MDIO가 아니라 I²C로 관리되는 플러거블 모듈과 대조적입니다(2선식 인터페이스). 구리 SFP의 내부 PHY는 예외입니다: 많은 설계에서 이 PHY의 MDIO 레지스터는 모듈의 I²C에서 보조 주소를 통해 접근할 수 있으며, 벤더는 이를 이용해 10/100 폴백과 자동 협상 동작을 설정합니다.
흔한 PHY와 인터페이스
| PHY 제품군 | 인터페이스 | 일반적인 보드 |
|---|---|---|
| Marvell 88E1111/88E1512/88E1510 | GMII, RGMII, SGMII, TBI | 라우터, 구리 SFP 모듈(88E1111) |
| Realtek RTL8211F/RTL8201 | RGMII/RMII | SBC, 소비자용 라우터 |
| Microchip KSZ9031/KSZ8081/LAN8720 | RGMII/RMII/RMII | 산업용, MCU 보드 |
| TI DP83867/DP83848 | RGMII, SGMII/MII, RMII | 산업용 |
| Broadcom BCM54xxx | RGMII, SGMII, QSGMII | 엔터프라이즈 스위치(쿼드/옥탈 PHY) |
| Marvell 88E1543/88E1548 | QSGMII 쿼드 | 48포트 액세스 스위치 |
인터페이스별 장애
| 증상 | 인터페이스 | 원인 |
|---|---|---|
| 링크가 전혀 안 올라옴, PHY ID는 정상 | RMII | REF_CLK 방향/소스 불일치 |
| 100M은 정상, 1G는 트래픽 없음/CRC 오류 | RGMII | 지연 모드(ID) 오류 또는 중복 적용 |
| PHY LED는 링크 업, MAC은 다운으로 인식 | RGMII/SGMII | 한쪽에서 인밴드 상태가 비활성화되었거나 MDIO 폴링 없음 |
| 1G에서 패킷 절반 손실 | GMII/RGMII | 트레이스 길이 스큐, 잘못된 전압 레벨 |
| MDIO에서 PHY를 찾지 못함 | 전체 | 잘못된 PHY 주소(스트래핑 핀), MDIO 풀업 누락 |
| 속도가 10/100에 고정됨 | 전체 | AN advertisement 레지스터 제한, 케이블 문제, 또는 1G를 지원하지 않는 phy-mode |
CodingBox에서
이 페이지의 내용은 모듈의 EEPROM을 거치지 않습니다 — 구리 SFP만은 예외로, 그 내부 PHY(대개 88E1111급 부품)가 CodingBox가 읽는 것과 동일한 I²C 뒤에 자리합니다. 구리 모듈이 1G에서는 동작하는데 10/100에서 동작하지 않는다면, 원인은 A0h 식별 정보 바이트가 아니라 그 PHY의 설정과 호스트의 SGMII/1000BASE-X 모드에 있습니다(구리 이더넷과 DAC, SGMII와 시리얼 기가비트).