본문 바로가기

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

 

하드웨어 설계에서 '탑 다운(top-down)' 방식은 전체 시스템의 아키텍처와 주요 기능을 먼저 설계하고, 그 후에 점차적으로 세부 구성 요소로 들어가는 방법입니다. 반면, '바텀 업(bottom-up)' 방식은 가장 낮은 수준의 구성 요소들을 먼저 설계하고 이를 통합하여 상위 수준의 시스템을 구축하는 방식입니다.

AXI 버스 트랜잭터를 설계할 때 '탑 다운' 접근 방식을 취한다면, 가장 먼저 전체 시스템의 테스트벤치를 설계하는 것으로 시작할 수 있습니다. 이 접근 방식의 장점은 전체 시스템의 요구 사항과 인터페이스를 먼저 파악할 수 있다는 것입니다. 이로 인해 시스템을 구성하는 각 모듈이 어떻게 상호 작용해야 하는지 명확해집니다.

테스트벤치에서는 다음과 같은 요소들을 고려해야 합니다:

  1. 테스트 시나리오: 마스터와 슬레이브 간의 통신을 테스트할 다양한 시나리오를 정의합니다.
  2. 모의 마스터 및 슬레이브: 실제 하드웨어 구성 요소를 모의하는 가상의 구성 요소를 만듭니다.
  3. 모니터링 및 체크: 통신이 정상적으로 이루어지고 있는지를 확인하는 로직을 포함합니다.
  4. 결과 보고: 테스트 결과를 사용자에게 보고하는 메커니즘을 구현합니다.

설계 프로세스를 진행하면서 다음 순서로 나아갈 수 있습니다:

  1. Testbench Top Design: 가장 먼저 전체 시스템의 테스트 환경을 설계합니다. 이것은 각 마스터와 슬레이브 모듈이 올바르게 작동하는지 확인하는 데 필요한 모든 요소를 포함해야 합니다.
  2. AXI Master and Slave Modules: 테스트벤치 환경이 준비되면, 실제 마스터와 슬레이브 모듈을 구현합니다.
  3. AXI Interconnect and Arbiter: 필요한 경우, 여러 마스터 및 슬레이브 모듈을 연결하고 버스 접근을 관리하는 인터커넥트와 아비터를 구현합니다.
  4. Integration and Testing: 각 구성 요소를 통합하고, 테스트벤치를 사용하여 전체 시스템을 검증합니다.
  5. Refinement and Debugging: 테스트 중에 발견된 문제점을 수정하고 세부 사항을 미세 조정합니다.

탑 다운 설계 접근 방식을 취함으로써, 시스템의 전체적인 행동과 인터페이스를 먼저 파악하고, 이후에 각 모듈의 내부 로직에 집중할 수 있습니다. 이 방법은 복잡한 시스템에서 요구 사항을 충족시키고 설계 오류를 최소화하는 데 도움이 됩니다.

테스트 벤치 top 설계 시작

시작하기 전에, 테스트벤치의 목적은 모든 AXI 트랜잭션이 올바르게 수행될 수 있도록 설계된 시스템의 기능을 검증하는 것입니다. 이를 위해, AXI 마스터와 슬레이브, 인터커넥트를 포함하여 전체 트랜잭션 경로를 시뮬레이션할 것입니다.

테스트벤치에서 수행할 작업은 다음과 같습니다:

  1. 환경 설정: 시뮬레이션 환경을 설정합니다. 이것은 시뮬레이션 시간, 클럭 주기, 리셋 조건 등을 포함합니다.
  2. 인터페이스 인스턴스화: 앞서 정의한 axi_interface 인터페이스를 인스턴스화하여 마스터와 슬레이브 모듈에 연결합니다.
  3. 가상 시퀀서 및 드라이버 구현: AXI 마스터의 행동을 모의하기 위한 가상 시퀀서와 드라이버를 구현합니다. 이것은 주소 및 데이터 트랜잭션을 생성하여 테스트 시나리오에 따라 AXI 신호들을 드라이브합니다.
  4. 모니터 및 체커: 트랜잭션을 모니터링하고, 프로토콜 규칙에 따라 올바르게 수행되는지 확인하는 모듈을 구현합니다.
  5. 결과 및 로깅: 테스트 결과를 분석하고 로깅하기 위한 메커니즘을 구현합니다.

이제 SystemVerilog로 간단한 테스트벤치 구조를 작성해 보겠습니다.
알겠습니다, DATA_WIDTH를 128 비트로 설정하겠습니다. 이제 128 비트 데이터 폭을 사용하는 AXI 인터페이스를 갖는 기본적인 테스트벤치를 구성해 보겠습니다.

`timescale 1ns / 1ps

module axi_testbench;

  // Parameters for the AXI interface
  localparam ADDR_WIDTH = 32;
  localparam DATA_WIDTH = 128; // Data width set to 128 bits

  // Clock and reset signals
  reg aclk;
  reg aresetn;

  // Instantiate the AXI interface
  axi_interface #(
    .ADDR_WIDTH(ADDR_WIDTH),
    .DATA_WIDTH(DATA_WIDTH)
  ) axi_if (
    .aclk(aclk),
    .aresetn(aresetn)
    // Connect other signals as necessary
  );

  // Initialize clock and reset
  initial begin
    aclk = 0;
    aresetn = 0;
    #100 aresetn = 1; // De-assert reset after 100ns
  end

  // Generate clock
  always #5 aclk = ~aclk; // Clock period of 10ns for a 100MHz clock

  // Instantiate AXI Master and Slave
  // The master and slave modules need to be written and instantiated.
  // They will utilize the axi_if interface for communication.

  // Instantiate AXI Traffic Generator
  // A traffic generator module needs to be written to create read/write operations.

  // Instantiate AXI Protocol Checker
  // A protocol checker module needs to be written to verify AXI operations.

  // Instantiate AXI Monitor and Results Logging
  // Monitoring and logging modules should be written to observe and record the transactions.

  // Define test scenarios
  initial begin
    // Define test scenarios to verify the operation of the AXI bus
    // For example, initiate various read and write operations with different burst types and sizes.
  end

endmodule

테스트벤치는 테스트의 요구 사항에 따라 확장되거나 수정될 수 있으며, 구현된 각 모듈은 시뮬레이션 동안의 동작을 확인하기 위해 테스트 시나리오에 따라 서로 상호작용합니다.
이 코드는 시뮬레이션의 클럭과 리셋을 생성하고 AXI 인터페이스 인스턴스를 생성하는 데에 초점을 맞추고 있습니다. 실제 AXI 마스터 및 슬레이브 모델, 트래픽 생성 로직, 프로토콜 체커, 모니터 및 로깅 로직은 별도로 구현해야 합니다. 테스트 시나리오는 시스템의 요구 사항에 따라 다양할 수 있으며, 여기에는 버스트 전송, 에러 처리, 다양한 유형의 읽기/쓰기 작업 등이 포함될 수 있습니다.

시나리오로 실제 작성

SystemVerilog를 사용하여 AXI 버스에서 128비트 데이터를 0x0000_0000 주소부터 연속적으로 7개의 데이터를 쓰는 시나리오를 테스트하는 테스트벤치를 작성해 보겠습니다. 이 시나리오는 AXI 마스터가 슬레이브에 데이터를 쓰는 과정을 시뮬레이션 합니다.

테스트벤치 설계

  1. AXI Interface 정의
  2. 클록 및 리셋 설정
  3. 마스터 모듈 설계
  4. 슬레이브 모듈 설계
  5. 테스트 시나리오 구현

각 모듈의 write_dataread_data 메서드는 테스트 시나리오에 따라 AXI 인터페이스를 통해 데이터를 쓰고 읽는 기능을 수행합니다. 여기서는 각 쓰기 작업이 0x00000000 시작 주소에서 16바이트 씩 증가하는 주소에 데이터를 쓰도록 설정했습니다.

마스터와 슬레이브 모듈이 정의된 후에는, 테스트벤치를 업데이트하여 두 모듈이 적절히 상호작용할 수 있도록 해야 합니다. 테스트 시나리오에서 마스터가 슬레이브로 데이터를 쓰는 과정을 테스트하므로, 테스트벤치는 이들 사이의 연결을 설정하고, 데이터를 전송하며, 응답을 확인하는 코드를 포함해야 합니다.

다음은 마스터와 슬레이브 모듈을 포함한 완성된 테스트벤치의 예시입니다:

`timescale 1ns / 1ps

module axi_testbench;

  // Interface and module parameters
  localparam ADDR_WIDTH = 32;
  localparam DATA_WIDTH = 128;
  localparam NUM_TRANSFERS = 7; // Number of write transfers

  // Clock and reset signals
  reg aclk;
  reg aresetn;

  // Instantiate the AXI interface
  axi_interface #(
    .ADDR_WIDTH(ADDR_WIDTH),
    .DATA_WIDTH(DATA_WIDTH)
  ) axi_if (
    .aclk(aclk),
    .aresetn(aresetn)
    // Connect other signals as necessary
  );

  // Clock generation
  initial begin
    aclk = 0;
    forever #5 aclk = ~aclk; // 100MHz clock
  }

  // Reset generation
  initial begin
    aresetn = 0;
    #100 aresetn = 1; // Release reset after 100ns
  }

  // Instantiate AXI Master
  axi_master #(
    .ADDR_WIDTH(ADDR_WIDTH),
    .DATA_WIDTH(DATA_WIDTH)
  ) master (
    .aclk(aclk),
    .aresetn(aresetn),
    .axi_if(axi_if.master)  // Connect to the AXI interface
  );

  // Instantiate AXI Slave
  axi_slave #(
    .ADDR_WIDTH(ADDR_WIDTH),
    .DATA_WIDTH(DATA_WIDTH)
  ) slave (
    .aclk(aclk),
    .aresetn(aresetn),
    .axi_if(axi_if.slave)  // Connect to the AXI interface
  );

  // Test sequence
  initial begin
    // Wait for the reset de-assertion
    wait(aresetn == 1);
    #10; // Wait for a few clock cycles after reset

    // Perform write operations
    for (int i = 0; i < NUM_TRANSFERS; i++) begin
      master.write_data(32'h00000000 + (i * 16), 128'hA5A5_A5A5_A5A5_A5A5_A5A5_A5A5_A5A5_A5A5);
      #10; // Wait for some time between writes
    end

    // Additional tasks or checks can be implemented here
    // Example: Read back data, check slave memory, etc.
  end

endmodule

주요 변경사항:

  1. 마스터 및 슬레이브 인스턴스: 마스터와 슬레이브 모듈이 AXI 인터페이스와 함께 인스턴스화되어 있습니다.
  2. 테스트 시나리오: 마스터가 특정 주소에 128비트 데이터를 쓰는 작업을 반복 수행합니다. 이는 테스트 목적에 따라 수정될 수 있습니다.
  3. 클록 및 리셋: 시스템의 클록과 리셋을 초기화하고 생성하는 로직을 포함합니다.

이 테스트벤치는 AXI 프로토콜을 사용하여 마스터가 슬레이브로 데이터를 전송하는 기본적인 시나리오를 시뮬레이션하는 데 필요한 모든 요소를 갖추고 있습니다. 필요에 따라 추가적인 검증 로직이나 데이터 확인 절차를 포함할 수 있습니다.

B로그0간

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