본문 바로가기

주의!!! 코드는 아직 검증되기 전입니다. 전체적인 구조를 잡기 위해 올려두는 부분이니 그대로 활용이 불가합니다.

 

AXI (Advanced eXtensible Interface) 버스는 ARM이 설계한 고성능, 고대역폭의 시스템 온 칩(SoC) 버스 인터페이스입니다. AXI는 AMBA (Advanced Microcontroller Bus Architecture) 사양의 일부로서, 특히 대용량 데이터 처리와 복잡한 시스템 설계에 적합한 인터페이스를 제공합니다. 이제 AXI의 주요 구성 요소와 특징을 자세히 설명해 드리겠습니다.

AXI 인터페이스 주요 특징

  1. 성능: 다중 마스터 및 슬레이브 구성을 지원하여 고성능 멀티프로세서 시스템 설계에 적합합니다.
  2. 확장성: 모듈식 설계를 통해 다양한 구성 요소와의 효과적인 통합이 가능합니다.
  3. 고대역폭: 복수의 데이터 전송을 동시에 처리할 수 있는 기능을 제공합니다.

AXI 프로토콜 버전

  • AXI3: 초기 버전으로, 대용량 데이터 전송과 멀티프로세서 지원에 초점을 맞춘 설계입니다.
  • AXI4: 보다 향상된 데이터 전송 효율과 더욱 다양한 메모리 관리 옵션을 제공합니다.
  • AXI4-Lite: 간단한 제어 및 상태 신호 전송에 적합한 경량 버전입니다.
  • AXI4-Stream: 데이터 스트림 전송에 최적화된 프로토콜로, 지속적인 데이터 흐름을 처리합니다.

AXI 버스 인터페이스 구성 요소

  1. 주소 채널(Read/Write Address Channels): 주소와 관련 제어 신호를 전송합니다.
  2. 데이터 채널(Read/Write Data Channels): 실제 데이터 전송을 담당합니다.
  3. 응답 채널(Read/Write Response Channels): 데이터 전송의 완료 및 상태 정보를 제공합니다.

AXI 트랜잭션 유형

  • 읽기 트랜잭션: 데이터를 읽기 위해 주소를 전송하고, 데이터와 응답을 받습니다.
  • 쓰기 트랜잭션: 쓸 데이터와 주소를 전송하고, 완료 응답을 받습니다.

AXI 인터페이스 채널 및 주요 시그널

AXI 프로토콜의 구체적인 시그널과 작동 방식에 대해 설명드리겠습니다. AXI 인터페이스는 다양한 채널을 통해 통신을 수행하며, 각 채널은 특정 신호들로 구성됩니다. 이 시그널들은 데이터의 전송, 주소 지정, 제어 및 응답 관리를 위해 사용됩니다.

  1. 주소 채널 (Address Channel)
    • ARADDR, AWADDR: 읽기 및 쓰기 주소를 전송합니다.
    • ARLEN, AWLEN: 버스트 길이, 즉 연속적으로 전송될 비트 수를 지정합니다.
    • ARSIZE, AWSIZE: 각 데이터 전송의 크기를 지정합니다.
    • ARBURST, AWBURST: 전송의 버스트 유형을 지정합니다. 예를 들어 INCR(증가), WRAP(랩) 등입니다.
    • ARLOCK, AWLOCK: 트랜잭션의 락 상태를 나타냅니다.
    • ARCACHE, AWCACHE: 캐시 가능성을 나타내는 신호입니다.
    • ARPROT, AWPROT: 전송의 보호 레벨을 나타냅니다.
  2. 데이터 채널 (Data Channel)
    • WDATA: 쓰기 데이터를 전송합니다.
    • RDATA: 읽기 데이터를 전송받습니다.
    • WSTRB: 쓰기 트랜잭션에서 각 바이트의 유효성을 나타내는 신호입니다.
    • WLAST: 현재 전송 중인 데이터가 버스트의 마지막 데이터임을 나타냅니다.
  3. 응답 채널 (Response Channel)
    • BRESP, RRESP: 쓰기 및 읽기 트랜잭션의 완료 응답을 나타냅니다. 응답 유형에는 OKAY, EXOKAY, SLVERR, DECERR 등이 있습니다.
    • BVALID, RVALID: 응답이 유효함을 나타냅니다.
    • BREADY, RREADY: 응답을 받을 준비가 되었음을 나타냅니다.

트랜잭션 흐름 예시

  • 읽기 트랜잭션:
    1. 마스터는 ARADDR에 주소를 설정하고 ARVALID를 '1'로 설정하여 주소 전송 준비가 되었음을 슬레이브에 알립니다.
    2. 슬레이브는 ARREADY를 '1'로 설정하여 주소 수신 준비가 되었음을 나타냅니다.
    3. 데이터와 함께 RVALID가 '1'로 설정되면 읽기 데이터가 유효합니다.
    4. 마스터는 RREADY를 '1'로 설정하여 데이터 수신 준비가 되었음을 나타냅니다.
  • 쓰기 트랜잭션:
    1. 마스터는 AWADDR에 주소를 설정하고 WDATA와 함께 AWVALID, WVALID를 '1'로 설정합니다.
    2. 슬레이브는 AWREADY와 WREADY를 '1'로 설정하여 주소와 데이터의 수신 준비가 되었음을 나타냅니다.
    3. 모든 데이터가 전송된 후, 마스터는 WLAST를 '1'로 설정하여 마지막 데이터임을 알립니다.
    4. 트랜잭션이 완료되면, 슬레이브

는 BRESP로 응답하고 BVALID를 '1'로 설정합니다.
5. 마스터는 BREADY를 '1'로 설정하여 응답 수신 준비가 완료되었음을 나타냅니다.

이러한 시그널과 트랜잭션 흐름을 이해하는 것은 AXI 버스를 Verilog 모델로 구현할 때 필수적입니다. 효율적인 통신을 위해 각 시그널의 역할과 상호 작용을 정확히 파악하는 것이 중요합니다.

AXI 버스 설명 블로그 글

SystemVerilog AXI 인터페이스 모듈 만들기

SystemVerilog를 사용하여 AXI 버스 트랜잭터를 모델링할 때 전체적인 구조는 다음과 같은 컴포넌트들로 구성할 수 있습니다:

  1. AXI Interface Definition: 먼저, AXI 버스 트랜잭터에 사용될 모든 신호에 대한 인터페이스를 정의해야 합니다. 이것은 interface 키워드를 사용하여 정의할 수 있으며, 주소 채널, 데이터 채널, 그리고 응답 채널과 같은 모든 채널에 필요한 신호들을 포함할 것입니다.

AXI 인터페이스를 설계하는 과정에서 발생하는 신호 방향 지정 오류를 해결하기 위해 전체 AXI 인터페이스(axi_interface.sv) 파일을 처음부터 작성하겠습니다. 이 설계는 AXI 프로토콜을 따르며, 주요 신호들과 마스터, 슬레이브 modport를 정의합니다. 이 인터페이스는 기본적으로 128비트 데이터 폭을 사용하며, 0x0000_0000 주소부터 7번 데이터를 쓸 수 있도록 설정됩니다.

// AXI4 interface definition with basic signals for master and slave communication
interface axi_interface #(
    parameter int ADDR_WIDTH = 32,
    parameter int DATA_WIDTH = 128
)(
    input wire aclk,    // Clock signal
    input wire aresetn  // Active low reset signal
);

    // Write address channel signals for master to initiate write operations
    logic [ADDR_WIDTH-1:0] awaddr;
    logic [7:0] awlen;
    logic [2:0] awsize;
    logic [1:0] awburst;
    logic awvalid;
    logic awready;

    // Write data channel signals
    logic [DATA_WIDTH-1:0] wdata;
    logic [(DATA_WIDTH/8)-1:0] wstrb;
    logic wlast;
    logic wvalid;
    logic wready;

    // Write response channel signals (slave to master response)
    logic [1:0] bresp;
    logic bvalid;
    logic bready;

    // Read address channel signals (master to initiate read operations)
    logic [ADDR_WIDTH-1:0] araddr;
    logic [7:0] arlen;
    logic [2:0] arsize;
    logic [1:0] arburst;
    logic arvalid;
    logic arready;

    // Read data channel signals (slave to master data)
    logic [DATA_WIDTH-1:0] rdata;
    logic [1:0] rresp;
    logic rlast;
    logic rvalid;
    logic rready;

    // Define modports for master and slave
    modport master (
        output awaddr, awlen, awsize, awburst, awvalid, wdata, wstrb, wlast, wvalid, bready, araddr, arlen, arsize, arburst, arvalid, rready,
        input awready, wready, bresp, bvalid, arready, rdata, rresp, rlast, rvalid,
        input aclk, aresetn
    );

    modport slave (
        input awaddr, awlen, awsize, awburst, awvalid, wdata, wstrb, wlast, wvalid, bready, araddr, arlen, arsize, arburst, arvalid, rready,
        output awready, wready, bresp, bvalid, arready, rdata, rresp, rlast, rvalid,
        input aclk, aresetn
    );

endinterface

위 코드는 AXI 표준의 주요 채널과 신호를 포함하며, 마스터와 슬레이브 간의 데이터 통신을 위한 모든 필수 신호들을 정의합니다. 마스터 modport는 주로 출력을 담당하고, 슬레이브 modport는 입력 신호를 받아들이고, 필요한 응답을 출력합니다. 이 인터페이스를 사용하여 AXI 마스터 및 슬레이브 모듈을 구현할 수 있으며, 주어진 예시처럼 특정 주소에서 여러 번의 데이터 쓰기 작업을 수행할 수 있습니다.

이 인터페이스 파일을 사용하여 SystemVerilog 환경에서 컴파일 및 시뮬레이션을 진행할 수 있으며, 에러가 발생하지 않도록 신호의 방향과 타입이 정확히 지정되어 있습니다.

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.