01signal.com

Versal ACAP FPGA 에서 FIFO 사용하기

FIFO Generator 는 어디에 있나요?

Versal FPGA 를 사용할 때, AMD 는 Verilog 나 VHDL 에서 인스턴스화(instantiation)하여 사용할 수 있는 단순한 FIFO 를 구현하는 IP 코어(IP core)를 제공하지 않습니다. 널리 알려진 FIFO Generator IP 는 Versal FPGA 에서는 사용할 수 없습니다. 적어도 Vivado 2022.1 및 이전 버전에서는 그렇습니다.

따라서 기존 FPGA 설계에서 FPGA 디바이스를 Versal FPGA 로 바꾸는 경우, 프로젝트를 어느 정도 수정해야 할 가능성이 높습니다. 거의 모든 FPGA 프로젝트가 FIFO Generator 를 사용하기 때문입니다.

Memory Generator 도 상황은 같습니다. 블록 RAM(Block RAM)을 만들 때 사용하던 이 IP 역시 Versal FPGA 에서는 지원되지 않습니다. 다만 이 IP 는 상대적으로 덜 사용됩니다. 블록 RAM 은 대개 추론(inference)으로 만들어지기 때문입니다. 다시 말해 RAM 을 만들 목적으로 Verilog(또는 VHDL)에서 배열을 선언하는 방식입니다.

참고로 AXI 인터페이스를 갖는 FIFO 와 RAM 은 여전히 IP 로 제공됩니다. Versal FPGA 에서 지원이 누락된 것은 '네이티브(native)' 인터페이스를 가진 FIFO 와 블록 RAM 뿐입니다.

이 문제를 우회할 방법은 몇 가지 있습니다. 그중 두 가지를 소개하겠습니다.

FIFO 에 대한 일반적인 튜토리얼은 이 페이지 시리즈를 참조하세요.

방법 #1: AMD Parameterized Macros 사용

AMD Parameterized Macros 는 Vivado 가 지원하는 모든 FPGA(즉, 시리즈-7 FPGA 이후 제품)에서 사용할 수 있습니다. 이 매크로들은 Verilog 또는 VHDL 의 모듈처럼 인스턴스화(instantiation)하여 사용할 수 있습니다. 이 매크로들에 대한 문서는 FPGA 의 프리미티브(primitive) 관련 문서와 함께 제공됩니다(예: Versal Architecture Premium Series Libraries Guide 의 UG1485).

하지만 프리미티브와 Parameterized Macro 사이에는 중요한 차이가 있습니다. 합성 도구(synthesizer)가 프리미티브를 만나면 보통 합성된 네트리스트(netlist)에 논리 요소 하나만 만들어냅니다. 반면 Parameterized Macro 는 Verilog 모듈처럼 아주 많은 논리 요소를 만들어냅니다.

FIFO 를 생성하는 파라미터화 매크로에는 여러 가지가 있으며, 특히 다음 두 가지가 있습니다.

이 두 매크로가 생성하는 FIFO 는 '네이티브(native)' 인터페이스를 가집니다. 즉 wr_en 이나 rd_en 같은 포트를 사용합니다. FIFO Generator 에서 제공되던 거의 모든 옵션은 매크로의 인스턴스화 파라미터(instantiation parameters)를 설정하여 활성화할 수 있습니다. 이러한 FIFO 는 '표준 FIFO(Standard FIFO)' 또는 First Word Fall Through(FWFT) 방식 중 하나로 만들 수 있습니다.

서로 다른 종류의 RAM 을 구현하는 매크로도 몇 가지 있습니다. 한편, 다양한 종류의 AXI-Stream FIFO 도 있습니다. 그런 FIFO 들은 Versal FPGA 에서도 IP 블록으로 만들 수 있습니다.

이 매크로들을 사용하는 방법에 대한 자세한 내용은 해당 Libraries Guide 를 참조하세요. Versal FPGA 의 경우 UG1485 입니다. 또한 Vivado 에서 인스턴스화 템플릿(instantiation template)을 얻을 수 있습니다. Tools > Language Templates 를 선택한 다음, Verilog > AMD Parameterized Macros (XPM) > XPM > XPM_FIFO 로 이동한 후, 해당하는 Synchronous FIFO 또는 Asynchronous FIFO 를 선택하면 됩니다.

다음은 기본적인 동기식 FIFO 를 만드는 예제입니다. 이 페이지에 나오는 FIFO 와 동일하게 동작합니다.

module fifo_8x2048
  #(parameter width = 8, depth = 2048)
   (
    input  clk,
    input  rst,
    input  wr_en,
    input [(width-1):0] din,
    input  rd_en,
    output [(width-1):0] dout,
    output full,
    output empty
    );

   xpm_fifo_sync #(
		   .DOUT_RESET_VALUE("0"),
		   .ECC_MODE("no_ecc"),
		   .FIFO_MEMORY_TYPE("auto"),
		   .FIFO_READ_LATENCY(1),
		   .FIFO_WRITE_DEPTH(depth),
		   .FULL_RESET_VALUE(1),
		   .READ_DATA_WIDTH(width),
		   .READ_MODE("std"),
		   .SIM_ASSERT_CHK(0),
		   .USE_ADV_FEATURES("0000"),
		   .WAKEUP_TIME(0),
		   .WRITE_DATA_WIDTH(width)
		   )
   xpm_fifo_sync_inst (
      .almost_empty(),
      .almost_full(),
      .data_valid(),
      .dbiterr(),
      .dout(dout),
      .empty(empty),
      .full(full),
      .overflow(),
      .prog_empty(),
      .prog_full(),
      .rd_data_count(),
      .rd_rst_busy(),
      .sbiterr(),
      .underflow(),
      .wr_ack(),
      .wr_data_count(),
      .wr_rst_busy(),
      .din(din),
      .injectdbiterr(1'b0),
      .injectsbiterr(1'b0),
      .rd_en(rd_en),
      .rst(rst),
      .sleep(1'b0),
      .wr_clk(clk),
      .wr_en(wr_en)
   );
endmodule

방법 2: Embedded FIFO Generator 사용

Embedded FIFO Generator 는 널리 알려진 FIFO Generator 와 사실상 같지만, 블록 디자인(block design) 안에서만 사용할 수 있습니다.

그러므로 가장 확실한 해결책은 블록 디자인을 만든 다음 Embedded FIFO Generator 를 추가하는 것입니다. 그런 다음 이 IP 블록의 파라미터를 기존의 FIFO Generator 에서와 똑같이 설정합니다. 이후에는 FIFO 의 모든 포트를 외부 포트에 연결합니다. 그 결과 FIFO 처럼 포트를 갖고 FIFO 처럼 동작하는 블록 디자인이 됩니다. 즉, FIFO 입니다.

이 방법은 다소 매끄럽지 못합니다. 특히 FIFO 의 포트 이름이 평소보다 길어지기 때문입니다. 예를 들어 wr_en 대신 FIFO_WRITE_0_wr_en 이라는 포트 이름이 생깁니다.

결론

FIFO Generator 가 Vivado 의 IP Catalog 에서 사라진 것은 갑작스럽고 설명하기 어려운 일이지만, 이 IP 를 Parameterized Macro 나 블록 디자인으로 대체하는 것은 대개 어렵지 않습니다.

더 넓게 보면, 설계를 Versal FPGA 로 이전할 가능성에 어떤 식으로 영향을 주든 상관없이, FIFO Generator 가 지원되는 FPGA 에서조차 FIFO Generator 사용을 중단하는 것이 좋은 생각일 수도 있습니다.

이 페이지는 영어 원문을 기계 번역한 것입니다. 의문이 드는 부분이 있으면 원문을 참조하시기 바랍니다.
Copyright © 2021-2026. All rights reserved. (dcc38493)