FPGA đám mây Alibaba: Kintex UltraScale+ giá 200 USD
(essenceia.github.io)- Giới thiệu thử nghiệm mua bo mạch Kintex UltraScale+ FPGA với giá 200 USD và tận dụng làm nền tảng phát triển
- Bo mạch này được bán ra mà không có tài liệu chính thức hay bảo hành, nên có thách thức về gỡ lỗi JTAG và thiết lập ban đầu
- Khảo sát khả năng tự xây dựng môi trường cấu hình và gỡ lỗi FPGA bằng OpenOCD và Segger JLink
- Mục tiêu thử nghiệm gồm kiểm tra giao diện PCIe/Ethernet của FPGA cũ, xác minh pinout và giám sát hệ thống
- Tổng hợp quy trình theo từng bước và kinh nghiệm xử lý sự cố từ khởi tạo, kết nối JTAG, xác định scan chain đến giám sát nhiệt độ/điện áp
Mở đầu
- Tác giả muốn có một FPGA mạnh để tạo mẫu cho các dự án quy mô lớn, đặc biệt là dòng UltraScale+ thuộc họ Xilinx Virtex, nhưng do chi phí và gánh nặng giấy phép Vivado Enterprise nên đã thu hẹp lựa chọn xuống các chip Kintex UltraScale+ được WebPack hỗ trợ (XCKU3P, XCKU5P)
- Các chip này vẫn cung cấp cấu hình rất cao, vượt xa mức dùng cho sở thích, như LUTs và bộ thu phát GTY
- Tác giả cần một bo phát triển đáp ứng các điều kiện tối thiểu gồm 2 cổng SFP+ hoặc 1 cổng QSFP, JTAG và PCIe x8 trở lên; trong quá trình cân nhắc tự thiết kế, mua sản phẩm Alinx hay tìm trên thị trường đồ cũ, cuối cùng đã mua được một bo FPGA tăng tốc của Alibaba Cloud trên Ebay với giá 200 USD
- Bo mạch mua về hoàn toàn không có tài liệu hỗ trợ và cũng chưa rõ còn hoạt động tốt hay không, nhưng ý tưởng hack một bo Kintex UltraScale+ giá rẻ rất hấp dẫn
Thách thức với debugger
- Theo tài liệu UG908 của Xilinx, việc cấu hình/gỡ lỗi FPGA bằng đầu dò JTAG được khuyến nghị là cách làm thông thường, nhưng tác giả thử dùng các lựa chọn thay thế mã nguồn mở như OpenOCD thay vì đầu dò chính hãng đắt tiền
- Đổi lại việc từ bỏ toolchain chính thức của Xilinx (như ILA), vẫn có thể tự phát triển logic gỡ lỗi riêng dựa trên thanh ghi JTAG USER
- OpenOCD chủ yếu được dùng cho ARM/RISC-V, nhưng cũng có thể áp dụng cho FPGA nhờ hỗ trợ nhiều loại probe, khả năng điều khiển chi tiết tác vụ JTAG và hỗ trợ định dạng SVF
- Tài liệu về hỗ trợ dòng UltraScale+ còn khá ít, nhưng các tiêu chuẩn JTAG, SVF và cấu trúc scan vẫn còn hiệu lực
Kế hoạch tổng thể
- Đây là kế hoạch thử nghiệm theo từng bước để cấu hình một bo FPGA cũ mua rẻ từ Ebay bằng các probe mã nguồn mở/không chính thức (OpenOCD, JLink...) trong bối cảnh không có hỗ trợ chính thức, nhằm tận dụng nó làm nền tảng phát triển
- Các bước lần lượt là: xác nhận thiết bị trên bo còn hoạt động → kết nối debugger JTAG → tìm pinout → truyền bitstream
Bước 1 - Xác nhận bo hoạt động bình thường
- Nếu bộ nhớ Flash chưa bị xóa, có thể kiểm tra sơ bộ bo còn hoạt động hay không bằng cách nhận diện PCIe endpoint từ bitstream của người dùng trước đó hoặc kiểm tra sự hiện diện của tín hiệu Ethernet trên PHY SFP
Bước 2 - Kết nối debugger JTAG
- Cần xác định vị trí các chân giao tiếp JTAG, số lượng thiết bị được nối và tình trạng Daisy chain
- Cũng có thể tận dụng các thanh ghi hệ thống JTAG của FPGA (đặc biệt là SYSMON) để giám sát nhiệt độ/điện áp theo thời gian thực, đồng thời kỳ vọng OpenOCD sẽ mở rộng hỗ trợ phần này
Bước 3 - Xác định pinout
- Cần phân tích mạch thực tế để biết loại/tần số/chân kết nối của nguồn clock ngoài, cũng như thông tin về các transceiver nối với SFP và PCIe
Bước 4 - Ghi bitstream
- Dự kiến dùng cấu hình tạm thời qua JTAG (bỏ qua Flash), thông qua driver openOCD virtex2 + pld hoặc phát lại SVF do Vivado tạo ra
- Tác giả cũng dự định tự động hóa toàn bộ quy trình chuyển từ Vivado sang SVF
Nhận bo và thử nghiệm ban đầu
- Đã nhận bo Kintex UltraScale+ FPGA (XCKU3P-FFVB676) xuất thân từ bộ tăng tốc Alibaba Cloud, kèm theo transceiver Huawei SFP28 25G, cáp vá OS2 và các phụ kiện khác
- Bo có dấu hiệu đã qua sử dụng, nhưng tình trạng phụ kiện cùng PCIe/SFP vẫn khá tốt
Kiểm tra nguồn độc lập
- Dùng adapter PCIe-USB để cấp nguồn đơn giản và kiểm tra sơ bộ tình trạng có điện thông qua LED và độ nóng của phần cứng
Thử nghiệm giao diện PCIe
- Tác giả thử dùng giao diện PCIe Gen2.0 x1 ngoài của Raspberry Pi 5 để kiểm tra FPGA (hỗ trợ Gen3.0, x8), và kỳ vọng thiết bị vẫn được nhận bình thường nhờ tính tương thích ngược
- Trong log
dmesgcủa Linux, bo được nhận diện là một PCIe Bridge và endpoint (kiểu Ethernet); việc gán vendor/device id mang tính riêng biệt giúp tránh xung đột với hệ điều hành - Dùng lệnh
lspci -vvvđể kiểm tra toàn bộ trạng thái thiết bị PCIe: bo này được khai báo hỗ trợ Gen3.0 x8, nhưng khi kết nối thực tế với Pi thì băng thông/tốc độ bị hạ xuống Gen2.0 x1 do giới hạn của Bridge và kết nối vật lý thực tế - Qua đó xác nhận giao diện PCIe của bo FPGA hoạt động bình thường
Giao diện JTAG
- FPGA Xilinx có thể cập nhật/nạp CMOS Configuration Latch (CCL) nội bộ theo kiểu SRAM qua JTAG
- Giao diện JTAG trên bo thực tế gồm chuẩn 4 dây (TCK/TMS/TDI/TDO) cùng các tín hiệu nguồn/đất; reset có thể được thực hiện thông qua FSM của Xilinx
- Cách bố trí chân thực tế khác với chuẩn thông thường nên cần đi dây riêng
Sử dụng Segger JLink
- Trong điều kiện không có bộ lập trình JTAG chính thức của AMD, tác giả dùng Segger JLink kết hợp với OpenOCD
- Vì JTAG có thể được thiết lập chỉ với 4 GPIO, đây là lựa chọn phù hợp cho các thử nghiệm ứng biến
- Bài viết có cung cấp sơ đồ đấu dây từ JLink sang bo FPGA; do dùng dây jumper cho breadboard và phải tính đến độ trễ tín hiệu trên dây dài, tốc độ TCK (clock) được giới hạn ở mức 1~10MHz
Môi trường OpenOCD
- OpenOCD là trình gỡ lỗi on-chip mã nguồn mở hỗ trợ nhiều probe và bo mạch khác nhau
- Nhờ hỗ trợ định dạng SVF tiêu chuẩn (liên kết với Vivado) và việc mạch/tool đều mang tính mở, khi có vấn đề phát sinh có thể tự phân tích và vá trực tiếp
- Tác giả tự build và sử dụng OpenOCD mới nhất (0.12.0+dev) cùng thư viện JLink
Xác nhận JTAG Scan Chain và kiểm tra IDCODE
- Trong điều kiện không biết sơ đồ mạch của bo, tác giả dùng chức năng quét tự động của OpenOCD để dò thiết bị/IDCODE trong JTAG chain
- Xác nhận bo này khớp với IDCODE của Xilinx KU3P (
0x04a63093) - Việc nhận diện cũng thành công sau khi chỉ định thủ công độ dài IR (độ dài thanh ghi lệnh là 6 bit)
- Cuối cùng đã xác định được đầy đủ JTAG scan chain của bo
Bộ giám sát hệ thống SYSMON
- Các thế hệ Xilinx cũ dùng XADC, còn dòng UltraScale+ tích hợp SYSMON4 để đo nhiệt độ/điện áp
- OpenOCD mặc định chưa hỗ trợ kết nối JTAG với SYSMON, nên cần tự bổ sung
- Có thể hack script đến mức gửi lệnh SYSMON (DRP) và đọc thanh ghi status để theo dõi nhiệt độ/điện áp theo thời gian thực
Thông qua toàn bộ quá trình trên, bài viết ghi lại kinh nghiệm xây dựng nền tảng gỡ lỗi và khai thác (giao diện PCIe/JTAG, giám sát hệ thống) chỉ bằng công cụ mã nguồn mở cho một bo tăng tốc FPGA Alibaba Cloud đời cũ không còn hỗ trợ chính thức nhưng mua được với giá rẻ.
1 bình luận
Ý kiến trên Hacker News
Tôi đã thử kiểm tra giao diện PCIe của bo mạch Lattice Certus-Pro NX "Versa" bằng Raspberry Pi V, và thấy cực kỳ tiện Raspberry Pi V đủ nhanh để chạy phần mềm desktop hiện đại, thậm chí cả Microsoft Teams! Tôi có thể demo thiết kế FPGA trực tiếp và chia sẻ màn hình desktop ngay trong lúc gọi hội nghị Chỉ tiếc là tài liệu cho SoC của Broadcom còn thiếu thốn Intel thì cung cấp đầy đủ tài liệu chip nếu qua NDA, nên tôi đã có thể tạo một môi trường FPGA PCIe rất tốt trên Xeon Ivy Bridge Sau khi lưu các thanh ghi cấu hình PCI, tái cấu hình FPGA rồi lập trình lại các thanh ghi, con chip sẽ xuất hiện trên bus mà không cần khởi động lại server hay quét lại (re-enumerate), rất tiện Bí quyết là tạm thời đặt bit root complex trong lúc tái cấu hình để vô hiệu hóa việc phát hiện lỗi PCIe (Khi đó tôi dùng Altera Stratix-IIgx) Có lẽ cũng còn cách khác, nên để lại tài liệu tham khảo: liên kết Stack Overflow Nhìn chung, nếu tài liệu đầy đủ thì việc báo lỗi trong quá trình khởi động PCIe rất hữu ích
Nếu bạn có adapter FT2232H (hoặc chưa có thì tôi khuyên nên mua một cái), có thể flash nó để tương thích dễ dàng với Vivado Tham khảo: hướng dẫn Vivado FTDI Device Programming
Ở công ty tôi lúc nào cũng giữ sẵn 20-30 chiếc FT2232H trong kho Nó thực sự hữu ích vì hỗ trợ nhiều giao thức như GPIO, I2C, SPI, parallel FIFO, v.v. Và thư viện Python pyFTDI cũng rất xuất sắc
Tôi có một adapter như vậy còn dư từ dự án khác, nhưng chưa từng làm việc với FPGA Tôi tò mò việc "tương thích với Vivado" trên thực tế nghĩa là gì Có phải là có thể cấu hình FPGA của AMD không, hay là mang ý nghĩa khác?
Điều này làm tôi nhớ đến một trường hợp rất sáng tạo khi Alibaba xử lý LSM compaction bằng cụm FPGA trong một storage engine MySQL tùy biến cho mảng cơ sở dữ liệu Tham khảo: PDF bài báo liên quan So với RocksDB, thông lượng và độ trễ được cải thiện mạnh, và ở một số tác vụ còn hơn hẳn một bậc Họ cũng từng cung cấp công nghệ này dưới dạng dịch vụ, nhưng rồi đã rút lui Tôi vẫn không rõ họ còn dùng nội bộ hay không, nhưng điều khiến tôi ngạc nhiên là gần như không có nơi nào tận dụng tăng tốc phần cứng cho các tác vụ cơ sở dữ liệu lặp đi lặp lại
Nếu bạn quan tâm đến FPGA PCIe hoặc card PCI, cũng có khá nhiều bo Gidel hàng cũ Có nhiều dòng như ProcSpark/ProcStar Phần mềm chính thức là proprietary, và vì có nhiều FPGA nên nếu muốn dùng trực tiếp trong Quartus thì phải tự lần ra pinout Tôi đã kiếm được một bo gắn con Stratix IV khổng lồ Bo Kintex UltraScale+ thật sự rất đáng thèm, nên bài này làm tôi cực kỳ ấn tượng
Nếu ở Trung Quốc thì cùng sản phẩm đó đang được bán trên idlefish với giá 480 nhân dân tệ (khoảng 68 đô la) Rẻ đến mức khó tin, nên tôi định tự thử một cái
Tôi vẫn chưa rõ liệu ai đó đã tìm ra thông tin pinout của đầu nối SFP ở mặt sau chưa Nếu phần này được tài liệu hóa và các lane PCI-e cũng được xác nhận, thì sẽ rất thú vị để thử làm thiết bị mạng quang tùy biến với nó Transceiver SFP chỉ cần cấp đầu vào là sẽ phát ra tương ứng, nên có thể làm các thiết bị tín hiệu quang tùy biến khá thú vị, dùng với backplane PCIe hoặc chạy độc lập đều được
Có ai biết ví dụ nào về việc triển khai mạng nơ-ron hay các kiến trúc connectionist khác bằng FPGA không? Điều thú vị nhất ở FPGA là ngay cả trường đại học hay cá nhân cũng có thể tiếp cận được kiểu chip "tùy biến" này Trong thời điểm AI đang nghiêng hẳn về LLM, tôi nghĩ đây là cơ hội để các nhóm nhỏ/cá nhân thử nghiệm hướng tiếp cận AI bottom-up thiên về động vật bằng FPGA
Ở FNAL, họ dùng mạng nơ-ron dựa trên FPGA cho suy luận từ kết quả thí nghiệm vật lý năng lượng cao LHC/CMS Cũng có các trường hợp điều khiển hệ động lực theo thang micro giây Tài liệu tham khảo: HLS4ML PDF slide của CERN IRIS-HEP Whitepaper Deploying tinyML on FPGAs PDF ví dụ từ NeurIPS ML4PhysicalSciences
Tôi không rõ "triển khai mạng nơ-ron bằng FPGA" ở đây là nói đến dùng FPGA làm bộ tăng tốc phần cứng cho suy luận, hay là tổng hợp toàn bộ mạng (kể cả trọng số) trực tiếp thành kiến trúc FPGA Dù theo cách nào thì FPGA cũng không thể hiện thực logic hoàn toàn tùy ý; nó là một cấu trúc dùng các khối giới hạn được phần mềm tổng hợp lại Với các trường hợp cần bộ nhớ dung lượng lớn, băng thông cao như LLM thì nó không phù hợp Dù FPGA có thể kết nối với bộ nhớ tốc độ cao, GPU ngày nay vẫn vượt trội hơn nhiều cho mục đích đó
Có thể xem differentiable logic gate networks, khá thú vị
Bài báo tham khảo: arXiv:2404.10076
Tôi thắc mắc vì sao bình luận này bị downvote nhiều thế Theo hiểu biết của tôi thì AI cần nhiều RAM và RAM rất nhanh cho mô hình, nên FPGA không phù hợp FPGA có chân để nối RAM tốc độ cao, nhưng thiết kế bo mạch và đường mạch nhiều lớp sẽ rất phức tạp Vì vậy card đồ họa phù hợp hơn nhiều
Nhìn cơn sốt AI này, cá nhân tôi có vài suy nghĩ
Trên eBay vẫn còn rất nhiều hàng liên kết eBay Có vẻ GPIO không được đưa ra header hay cổng tương tự, nên nếu ai có ý tưởng dự án hay để dùng nó thì rất mong được gợi ý
Tôi ấn tượng với chi tiết "bo mạch đi kèm vali du lịch" Không hiểu tại sao lại như vậy, phải chăng trong trung tâm dữ liệu người ta thường tháo bo này ra để mang đi? Hay là người bán trên eBay cho thêm vào để bảo vệ?