← 전체 글로 돌아가기
Protocol

𝗔𝗫𝗜𝟰 │ WSTRB=0xFF가 첫 beat를 망칠 때

AXI4 unaligned INCR burst: per-beat WSTRB byte-lane mask

AXI4 unaligned INCR burst: per-beat WSTRB byte-lane mask 인포그래픽
Daily ASIC original infographic · English labels그림 크게 보기 ↗

DMA가 64-bit AXI 버스로 데이터를 쓰는데, 주소가 정렬됐을 때는 멀쩡하고 0x1003에서 시작할 때만 주변 byte가 바뀝니다. 메모리부터 의심하기 전에 AWADDR, AWSIZE, WSTRB를 같은 beat에서 나란히 보겠습니다.

64-bit 버스라면 WSTRB는 8-bit입니다. bit 0은 WDATA[7:0], bit 7은 WDATA[63:56]에 대응합니다. 하지만 버스가 8 byte라고 해서 매 beat마다 8개 lane을 모두 쓸 수 있는 것은 아닙니다. 이번 전송이 차지할 수 있는 주소 범위는 AWADDR와 AWSIZE가 정합니다.

예를 들어 AWADDR=0x1003, AWSIZE=2(beat당 최대 4 byte), AWLEN=2(총 3 beat), AWBURST=INCR로 놓겠습니다. 이 예에서는 쓸 수 있는 lane을 모두 켰다고 가정합니다.

  • 첫 beat: 시작 주소는 0x1003입니다. 다음 4-byte 경계 전에는 0x1003 한 byte만 남습니다. lane 3만 켜서 WSTRB=0x08.
  • 둘째 beat: 0x1004–0x1007, lane 4–7이므로 WSTRB=0xF0.
  • 셋째 beat: 0x1008–0x100B, lane 0–3이므로 WSTRB=0x0F.

핵심은 첫 beat가 1 byte만 허용돼도 다음 주소는 0x1004로 간다는 점입니다. 주소 진행은 켜진 WSTRB bit 수가 아니라 시작 주소, AWSIZE, beat 순서로 계산합니다. 따라서 이 3-beat 예시에서 주소상 허용되는 byte는 최대 1+4+4=9개입니다. 실제로 쓴 byte 수는 각 beat의 WSTRB가 그 안에서 몇 개 켜졌는지에 달려 있습니다.

RTL 리뷰에서는 매 beat의 허용 lane mask를 먼저 계산하고 WSTRB가 그 밖의 bit를 켜지 않았는지 확인하면 됩니다. 특히 unaligned 시작 주소를 받는 DMA, width converter, byte-enable 생성부에서 WSTRB=0xFF 같은 기본값을 그대로 내보내는지 살펴보세요. 이 예시는 64-bit 버스의 INCR burst에 관한 것이며, 다른 burst type이나 width 변환 경로에는 해당 조건을 다시 적용해야 합니다.

근거: Arm AMBA AXI and ACE Protocol Specification, IHI 0022H.c, §A3.4 (AXI4 주소 및 byte lane 계산, write strobe 규칙).

https://documentation-service.arm.com/static/602a9df190ee6824a1e02b98

ORIGINAL POSTLinkedIn에서 원문 보기 ↗
이전 글𝗥𝗘𝗦𝗘𝗧 │ reset을 푸는 순간에도 timing check가 있습니다