일단 Vitis는 기본적으로 툴이고
툴 사용법을 배웠다 보면 된다.
Zynq 7series가 탑재된 Cora Z7 보드를 이용했다.
이는 Arm cpu와 Xilinx의 FPGA가 합쳐진 SoC칩을 탑재하고 dram도 탑재했다.
결과적으로 cpu와 ram이 있어서 컴퓨터이고, FPGA란 변형 가능한 회로가 탑재되서
회로에 컴퓨터로 데이터를 넣어줘서 결과 값을 받거나, FPGA를 검증할 수 있는 보드이다.
이때 컴퓨터라 PS(Processor)이고, FPGA는 PL(Programmable Logic)이라 부른다.
옛날에는 PL이 따로 있었다고 하는 것 같았다. IC칩이 잔뜩 들어가서 점프선을 연결해서 회로를 만들었다고 한 것 같다.
FPGA는 기본적으로 회로 구성요소인 레지스터(F/F)과 카운터회로, MUX, 논리게이트 대체인 LUT(진리표)로 구성된다.
이외에 출력 타이밍 제어를 위한 버퍼나 다른 것이 있지만, 내가 배운 것만 적겠다.
간단하게 말해서 구성 요소를 잔뜩 집어넣고 점퍼선 연결을 MOSFET으로 대체한 것이라 생각하면 된다.
그래서 이 회로 연결을 담당하는 MOSFET에 입력할 신호들에 대한 정보를 담아야 되고
이를 bitstream이라 부른다.
이는 Behavial 설계라 부르는 입력 신호가 어떻게 바뀌어서 출력되는지를 설계한
c와 닮은 문법의.v 파일에서
이를 회로 구성요소로 바꾼 synthesis를 거치고,(여기서 실제로 출력이 나오는 pin을 선택한다.)
회로 구성요소를 출력 핀에 맞춰서 나오게 하려면 현재 보드의 어떤 위치에 회로 구성 요소를 배치할지 정하는 Implementation(구현, 자리배치)를 하고
여기서 문제가 없으면 bitstream 파일이 나온다.
ASIC이라 부르는 주문형 반도체는 이 과정이 특정 FPGA보드에 맞추는 것이 아니라
그대로 칩으로 만들기에
Behavial 설계(RTL)설계에서 문제가 없는지 열심히 검증하고
Synthesis를 하면 이를 LUT나 먹스가 아닌
진짜 논리 게이트로 구현한다 이를 netlist 파일이라 부른다.
이후, 디자인하우스라 부르는 레이아웃 회사에 넘긴다.
레이아웃은 말 그대로 논리 게이트를 배치하는 것이다.
칩의 사이즈를 정하고 그 안에 가능한 딜레이가 적은 구조로 집어 넣고 게이트 끼리 배선을 깔고
클럭을 넣어서 클럭 입력이 들어가는 모든 곳에 같은 타이밍에 클럭이 들어가는지,
신호의 딜레이에 변화가 생겨서 원하는 타이밍에 잘 들어오는지 확인하는 setup, hold delay, slack time등을
검증해서 회로가 원하는 대로 정상 동작하게 칩 사이즈 안에 배치하는 과정이다.
레이아웃 회사는 생산을 해주는 업체(파운드리)에서 공정 라이브러리를 받는다.
공정 라이브러리는 쉽게 말해서
삼성 파운드리 3nm 나 TSMC 2nm 공정에서 생산할 수 있는
최소 규격의 and, or, nand, nor, xor 등의 레이아웃을 미리 만들어 둔 파일들이다.
따라서 넷리스트의 and, or nand, nor, xor등의 논리 게이트를
해당 레이아웃 파일로 교체하면 논리게이트가 완성된다. 이를 Place(칩 안에 배치)한다고 한다.
이후 각 논리게이트를 배치하고 선후관계를 따져서 서로 연결한다. 이를 경로를 찾는다고 해서 Route(배선 정리)라고 한다.
이후 클럭 딜레이 셋업 타임 홀드 타임 슬랙타임
칩 전체 딜레이등을 확인한다.
결국 클럭을 사용한다는 것은 시간을 나눠서 데이터량을 늘린 것이기에
시간이 밀리면 데이터가 깨지고, 정상동작을 안하기 때문에 그런 것이다.
뭔가 내용이 조금 이상한데로 갔는데,
일단 bitstream파일을 생성했다.
이것만 있으면 FPGA만 돌아간다.
하지만, Arm cpu는 안쓴 것이다.
이때 Vitis를 이용한다.
간단하게 말해서 Vitis는 Xilinx SoC 용 임베디드 소프트웨어 제작 툴이다.
Arm칩에서 돌아가는 코드를 작성하는 툴이다.
STM32보드에서 STM Cube IDE나
ATmega 보드의 Microchip Studio나
아두이노의 개발 툴과 같다.
다만, 이건 SoC이다.
PS와 PL, Arm CPU와 FPGA가 붙어있다.
따라서 단순 계산이 아닌 FPGA에 접근해서 데이터를 주고 받을 수 있다.
이때
Arm cpu나 FPGA는 둘다 메모리 저장 소자가 없다.
그래서 dram이 붙어있다.
따라서 Arm cpu와 FPGA는 dram을 중간에 두고 작동한다.
Arm cpu에서 특정 메모리 주소에 값을 쓰면
FPGA의 탑 모듈의 인풋 또한 그 메모리 주소와 연결되어 있어서
메모리가 변경되면 입력이 들어왔다고 인식한다.
출력또한 마찬가지로 FPGA의 탑 모듈의 아웃풋이 메모리의 특정 주소와
연결되어서 값이 저장된다. 그러면 Arm cpu에서 그 메모리를 읽어오면
결과를 볼 수 있다.
이게 SoC인 Zynq 가 동작하는 방식이다.
이를 위해서는 FPGA의 bitstream을 제작할 때,
인풋과 아웃풋에 메모리 주소를 할당해야 되는데 이는 Vivado의 Synthesis단계에서 설정한다.
그래야 그 메모리 주소에 접근 가능한 LUT나 레지스터를 찾아서 Implementation 하는 것 같다.
그리고 그런 메모리 주소 설정 값은
Vivado에서 Export Hardware를 하면 나오는 .xsa 파일에 저장된다.
이 파일에는 FPGA의 인풋과 아웃풋과 연결된 메모리 주소가 나와있다.
이를 Vitis에서 읽으면 알아서 C코드 실행을 위한 파일들을 만들어준다.
그러면 나는 C로 메모리 접근하는 코드만 작성하면
자유롭게 FPGA와 통신할 수 있다.
그럼 이제 다른 주제로 넘어가자.
Arm cpu와 FPGA는 dram을 통해서 통신한다고 했다.
그렇다면 그 통신 방식은 무엇일까?
그게 AMBA Switch의 통신 규격이다.
AMBA는 Arm CPU의 주변기기 연결 통신 규격이다.
이는 데스크탑에서 인텔이나 AMD cpu가 AMD나 엔비디아의 그래픽카드와 통신하기 위해서
PCIE를 사용하는 것과 같이
Arm전용 통신 규격이다.
Arm은 이를 통해서 메모리 접근 주변 통신 모듈에 접근하기도 하고 테스트에 이용하기도 한다.
여기서는 FPGA와 통신하기 위해서
AXI4-Lite를 이용한다.
AXI는 Amba extension Interface로 칩 외부의 기기와 통신하기 위한 통신규격인데,
FPGA와 연결할 때도 사용한다.
Lite 말고도 streaming이나, full 규격도 있다.
다만 나머지는 선이 너무 많아서 가장 간단한 lite로 구현했다.
결국 얘도 신호선과 메모리 주소라
직접 짜도 되지만, 기본적으로 Vivado에서는 AXI slave 모듈 IP가 있다.
그걸 가져다 써도 되는데 약간 동작이 이상할 수 있으니 2023과 2024기준
수정해서 써야 한다.
결국 이 통신 규격을 통해서
데이터 전달을 하고 사용하는 것이다.
이를 통해서 복잡한 연산은 미리 만들어진 Arm cpu를 통해서 동작시키고
다중 병렬처리와 같이 cpu에서 작동하지 않는 계산은 FPGA에 넣어서 만들 수 있다.
'하만 과정 공부 > Verilog - Zynq7000' 카테고리의 다른 글
9-15 베릴로그 합성 문제 관련 배운 내용과 생각 정리 (1) | 2024.09.15 |
---|---|
9-5 베릴로그 합성 안되는 문제점 기록 정리 (0) | 2024.09.05 |