AXI4-Lite

Seungyun Lee·2026년 4월 4일

AXI4-Lite Verification

목록 보기
1/3

1. VALID-READY Handshake

AXI 버스의 모든 데이터 전송은 Master(요청자)와 Slave(수신자) 간의 Handshake로 이루어집니다.

  • VALID: 데이터를 보내는 쪽(Source)에서 "내 데이터/주소 준비됐어, 가져가"라고 알리는 신호입니다.
  • READY: 데이터를 받는 쪽(Destination)에서 "나 지금 받을 수 있는 상태야"라고 알리는 신호입니다.
  • Rule: 이 두 신호가 동시에 1 (High)이 되는 바로 그 클럭(Clock Edge)에 데이터가 넘어갑니다. DV 엔지니어가 파형 뷰어(Waveform Viewer)에서 가장 지독하게 추적해야 할 버그가 바로 이 두 신호의 타이밍이 꼬여 시스템이 멈추는 Deadlock 현상입니다.

2. 5 Independent Channels

AXI4-Lite는 읽기(Read)와 쓰기(Write)가 충돌 없이 동시에 일어날 수 있도록 5개의 독립적인 길(Channel)을 뚫어놓았습니다. 각 채널은 본인만의 고유한 VALID와 READY 신호를 가집니다.

A. Write Transaction : 채널 3개

데이터를 슬레이브(메모리나 레지스터)에 기록할 때는 주소, 데이터, 결과 보고가 각각 다른 채널로 움직입니다.

Write Address Channel (AW 채널)

  • 역할: Master가 "어디에(Address) 쓸 것인지" 주소와 제어 신호를 Slave에게 보냅니다.
  • 핵심 Signal: AWADDR (주소), AWVALID, AWREADY
  • 특징: 이 채널의 핸드쉐이크가 성립되어야 Slave가 어디에 데이터를 써야 할지 알 수 있습니다.

Write Data Channel (W 채널)

  • 역할: Master가 "무엇을(Data)" 쓸 것인지 실제 데이터를 Slave에게 보냅니다.
  • 핵심 Signal: WDATA (데이터), WSTRB (바이트 단위 활성화 신호), WVALID, WREADY
  • 특징: AW 채널과 완전히 독립적입니다. 주소보다 데이터가 먼저 도착할 수도 있고, 동시에 도착할 수도 있습니다.

Write Response Channel (B 채널)

  • 역할: Slave가 쓰기 작업을 완료한 후, Master에게 "잘 써졌어(OKAY)" 또는 "에러 났어(SLVERR)"라고 결과를 보고합니다.
  • 핵심 Signal: BRESP (결과 상태), BVALID, BREADY
  • 인터뷰 팁: 왜 'B' 채널일까요? 데이터의 흐름이 Master에서 Slave로 가는 다른 채널들과 달리, 유일하게 Slave에서 Master 방향으로 거꾸로 돌아가는 Backward 응답이기 때문입니다.

B. Read Transaction : 채널 2개

데이터를 읽어올 때는 데이터를 보내는 쪽이 Slave이므로 구조가 조금 더 단순합니다.

Read Address Channel (AR 채널)

  • 역할: Master가 "어디에 있는 데이터를(Address) 읽고 싶은지" Slave에게 요청합니다.
  • 핵심 Signal: ARADDR (주소), ARVALID, ARREADY

Read Data Channel (R 채널)

  • 역할: Slave가 요청받은 주소에서 데이터를 꺼내어 Master에게 보내줍니다.
  • 핵심 Signal: RDATA (데이터), RRESP (결과 상태), RVALID, RREADY
  • 인터뷰 함정 문제: "왜 Read에는 B 채널 같은 별도의 Response 채널이 없나요?"
    정답: Read 동작에서는 Slave가 어차피 Master에게 데이터를 보내줘야 하므로, RDATA를 보낼 때 응답 상태인 RRESP를 그냥 같이 묶어서 보내면 되기 때문입니다. 굳이 채널을 하나 더 만들 필요가 없습니다.

3. Protection, Strobe, Response

awprot (Write Address Protection)

awprot는 Write Address Protection의 약자입니다. 해당 Transaction이 어떤 권한과 보안 수준을 가지고 Memory나 Register에 접근하는지를 나타냅니다.

실제 SoC 환경에서는 일반 유저 애플리케이션이 OS의 핵심 Register를 건드리면 시스템이 멈추기 때문에, 이 접근이 합당한지 검사하는 용도로 쓰입니다.

크기가 [2:0] (총 3-bit)인 이유는 3가지 서로 다른 상태 정보를 각각 1-bit씩 표현하기 때문입니다:

Bit [0] - Privilege (권한 레벨):

  • 0: Unprivileged access (일반적인 접근)
  • 1: Privileged access (운영체제, 커널 등 높은 권한의 접근)

Bit [1] - Security (보안 레벨):

  • 0: Secure access (안전한 접근 - TrustZone 등 보안 영역)
  • 1: Non-secure access (일반 구역 접근) ※ 0이 Secure라는 점이 헷갈리기 쉬우니 주의하세요.

Bit [2] - Instruction / Data (접근 유형):

  • 0: Data access (순수 데이터 읽기/쓰기)
  • 1: Instruction access (CPU가 명령어를 가져오기 위한 접근)

개인 프로젝트 수준의 간단한 DUT에서는 이 값을 무시하는 경우도 많지만, Protocol Violation을 피하기 위해 Driver에서 보통 기본값(3'b000)으로 묶어둡니다.

wstrb (Write Strobe)

wstrb는 Write Strobe의 약자로, 쉽게 말해 Byte enable 신호입니다.

32-bit wdata(Write Data) 버스로 데이터가 날아올 때, "이 32-bit 전체를 다 쓸 것인지, 아니면 그 중 특정 위치의 8-bit(1 byte)만 골라서 쓸 것인지" Slave에게 알려주는 역할을 합니다.

작동 규칙은 아주 직관적입니다:

  • wstrb의 1-bit는 wdata의 1-byte (8-bits)를 담당합니다.
  • 우리의 데이터 버스(wdata)가 32-bit라면 총 4개의 byte로 나눌 수 있습니다. 따라서 wstrb는 4-bit 크기인 [3:0]을 가집니다.

실제 작동 예시 (Corner Case 테스팅에 중요):

  • wstrb == 4'b1111: 4개의 byte 모두 Valid함. 32-bit 전체 공간에 데이터를 정상적으로 씁니다 (가장 일반적).
  • wstrb == 4'b0001: 가장 아랫부분 1-byte(wdata[7:0])만 Valid함. 나머지 24-bit 데이터는 무시하고, 타겟 레지스터의 맨 아랫부분만 업데이트합니다. (이걸 Partial write라고 하며, 검증 시 아주 중요한 Test Scenario 중 하나입니다).
  • wstrb == 4'b0000: 쓰기 명령이 들어왔지만 기록할 유효한 데이터가 없음. (Protocol 상 오류는 아니지만 보통 Null 동작으로 처리됩니다).

Response Channel

AXI Response Codes (필수 암기 Keywords)

  • 2'b00 (OKAY): 일반적인 접근이 정상적으로 성공(Success)했다는 뜻입니다. 우리 코드에서는 에러가 날 상황을 아직 만들지 않았기 때문에, 데이터가 들어오면 무조건 bresp <= 2'b00;을 출력하도록 하드코딩 해둔 것입니다.

  • 2'b01 (EXOKAY): 독점 접근(Exclusive Access) 성공을 의미합니다. (단, 가벼운 버전인 AXI4-Lite에서는 아예 사용하지 않는 코드이며, Full AXI에서만 사용합니다).

  • 2'b10 (SLVERR - Slave Error): Slave가 주소와 데이터를 정상적으로 받긴 했지만, 내부적인 이유로 처리에 실패했을 때 발생합니다. (예: Read-only 레지스터에 Write를 시도했거나, Slave 내부의 FIFO가 꽉 찼을 때 등).

  • 2'b11 (DECERR - Decode Error): Master가 요청한 주소에 해당하는 Slave가 칩 내부에 아예 존재하지 않을 때 발생합니다. 보통 Slave가 직접 띄우기보다는, 중간에서 주소를 분배해 주는 라우터 역할의 Interconnect가 대신 에러를 띄워줍니다.


Difference of Full AXI4

1. Burst Transfer (버스트 전송)

가장 결정적인 차이입니다.

AXI4-Lite: "주소 1번 ➡️ 데이터 1번"의 1:1 교환만 가능합니다. 데이터 100개를 쓰려면 주소도 100번 보내야 합니다.

Full AXI4: Burst Transfer를 지원합니다. Master가 시작 주소(Starting Address)를 딱 1번만 알려주면, 그 뒤로 최대 256개의 데이터를 연속으로 쏟아낼 수 있습니다.

추가되는 핀(Pin): 이를 위해 Full AXI에는 이 데이터가 몇 개짜리 묶음인지(AWLEN), 데이터 하나의 크기는 얼마인지(AWSIZE), 주소는 순차적으로 증가시킬 것인지 고정할 것인지(AWBURST)를 알려주는 복잡한 신호들이 대거 추가됩니다.

2. Out-of-Order Execution (비순차적 처리)

시스템의 병목 현상(Bottleneck)을 막기 위한 고급 기술입니다.

AXI4-Lite: 무조건 들어온 순서대로(In-order) 처리합니다. 1번 요청이 끝나야 2번 요청을 처리할 수 있습니다.

Full AXI4: 각 데이터 패킷에 Transaction ID (AWID, ARID, WID, BID)라는 꼬리표를 붙입니다. 만약 1번 ID의 데이터를 메모리에서 가져오는 데 시간이 오래 걸리면, 기다리지 않고 2번 ID의 데이터를 먼저 처리해서 내보낼 수 있습니다. 이를 통해 전체 버스의 Throughput(처리량)을 극대화합니다.

profile
Design Verification engineer

0개의 댓글