VCU118 Rocket SoC Flash Boot Akışı
Son durum: Rocket SoC VCU118 üzerinde çalışıyor. Bootloader BootROM'dan başlıyor, kart üzerindeki QSPI flash'ı SPI üzerinden okuyor, APP_FLASH_OFFSET adresindeki uygulama imajını DTIM'e kopyalıyor, CRC kontrolünden sonra uygulamaya atlıyor. Hello UART uygulaması kart üzerinde doğrulandı.
Ne Yapıldı?
- Chipyard kullanmadan, repo içindeki Rocket Chip ve
millakışıyla VCU118 için SoC üretildi. - VCU118 top wrapper non-project Vivado akışına bağlandı.
- Rocket SoC'ye UART ve SPI flash controller eklendi.
- SPI flash sinyalleri Virtex UltraScale+
STARTUPE3primitive'i üzerinden karttaki config QSPI flash'a bağlandı. - BootROM içeriği hello programı yerine flash bootloader olacak şekilde değiştirildi.
- Bootloader, flash'tan header okuyup payload'u
0x80000000DTIM adresine yüklüyor. - ELF uygulaması için flash imaj formatı ve CRC32 kontrolü eklendi.
- Bitstream ve ELF/app flash programlama iki ayrı akışa ayrıldı.
- Eski tek MCS ile komple flash programlama opsiyonu korundu.
Klasör Yapısı
Donanım tarafı tek hardware/ ağacında toplanır. soc/ artık yazılım ve flash imaj üretimi içindir; target dizinleri ise akış giriş noktalarını ve scriptleri tutar.
hardware/
upstream/rocket-chip/
src/
bootrom/
scala
resources
soc/
Makefile
scala/fpga/VCU118Peripherals.scala
generated/
vcu118-soc/
vcu118-soc-verilog/
asic-rocket-soc/
asic-rocket-soc-verilog/
asic-rocket-soc-sim-verilog/
fpga/vcu118/
rtl/
Makefile
axi4_ram_64.sv
axi4_slave_tieoff_64.sv
rocket_bscan_dmi_tunnel.sv
constraints/
vcu118_rocket.xdc
sim/
fpga/vcu118/Makefile
asic/rocket/
wave.do
tb/
external/gps/rtl/
filelist.f
soc/
Makefile
software/
Makefile
bsp/
bootloader/
common/
hello_uart/
tools/make_flash_image.py
out/
software/
flash/
targets/fpga/vcu118/
Makefile
docs/
vcu118_rocket_flash_boot_guide.html
flow/vivado/
Makefile
scripts/
build.tcl
program_flash.tcl
program_fpga.tcl
write_flash.tcl
write_flash_regions.tcl
tools/
gen_vcu118_wrapper.py
out/
bitstream/
build/
flash/
logs/
reports/
| Dizin | İçerik |
|---|---|
hardware/soc |
Ortak Scala/Chisel SoC generator kaynakları ve FIRRTL/RTL üretim Makefile'ı. |
hardware/fpga/vcu118/rtl |
FPGA shell yardımcı RTL kaynakları. |
hardware/fpga/vcu118/constraints |
VCU118 XDC constraint dosyaları. |
soc/software |
Bare-metal BSP, bootloader, linker scriptleri ve uygulama kaynakları. |
soc/software/tools |
ELF dosyasını bootloader flash imajına çeviren ortak yardımcı araçlar. |
targets/fpga/vcu118/tools |
VCU118 top wrapper generator. |
targets/fpga/vcu118/flow/vivado/scripts |
Vivado non-project build, flash image ve programlama Tcl scriptleri. |
targets/fpga/vcu118/out |
Bitstream, generated wrapper, MCS/BIN, Vivado logları ve raporlar. |
Makefile Ağacı
Her katmanın kendi Makefile'ı var. soc/Makefile ortak SoC/software hedeflerini, targets/fpga/vcu118/Makefile FPGA hedeflerini, targets/asic/rocket/Makefile ASIC sim/shell hedeflerini yönetir.
| Makefile | Tipik hedefler |
|---|---|
soc/Makefile |
software, chisel, fpga-rtl, asic-rtl, clean |
hardware/soc/Makefile |
firrtl, rtl, fpga-rtl, asic-rtl, clean |
soc/software/Makefile |
all, app, bootloader, hello, flash-image, clean |
hardware/fpga/vcu118/rtl/Makefile |
shell, generated, clean |
targets/fpga/vcu118/flow/vivado/Makefile |
bitstream, program, flash-app, flash-bitstream, flash-combined |
hardware/sim/fpga/vcu118/Makefile |
smoke, clean. Full Verilator harness henüz eklenmedi. |
Kavramlar: Scala, Chisel, Rocket, Mill, FIRRTL ve firtool
| Kavram | Bu projedeki anlamı |
|---|---|
| Scala | JVM üzerinde çalışan programlama dili. Rocket Chip ve Chisel tabanlı SoC generator kodu Scala ile yazılıyor. Burada Scala kodu doğrudan RTL değildir; RTL üreten generator kodudur. |
| Chisel | Scala içine gömülü hardware construction language. Register, wire, module, bus bağlantısı gibi donanım yapıları Scala kodu ile tarif edilir. Chisel çıktısı önce FIRRTL ara temsiline gider. |
| Rocket Chip | Chisel ile yazılmış parametrik RISC-V SoC generator. Rocket core, TileLink bus yapısı, BootROM, debug, interrupt ve memory/peripheral bağlantı altyapısını sağlar. |
| Mill | Scala/JVM build tool. Bu repoda Rocket Chip Scala kodunu derleyip çalıştırılabilir assembly jar üretmek için kullanılıyor. |
| FIRRTL | Chisel'den çıkan ara devre temsili. FPGA/ASIC backend'e gitmeden önce donanım bu IR ile ifade edilir. |
| firtool | CIRCT tabanlı FIRRTL compiler. Bu akışta VCU118RocketSystem.fir dosyasını synthesizable SystemVerilog dosyalarına çevirir. |
Kısaca zincir şöyledir:
Scala/Chisel Rocket config
-> mill ile assembly jar
-> Rocket generator çalışır
-> VCU118RocketSystem.fir
-> firtool
-> split SystemVerilog RTL
-> VCU118 wrapper + shell RTL + XDC
-> Vivado synth/place/route
-> vcu118_rocket.bit
RTL Nasıl Generate Ediliyor?
RTL üretimi make -C targets/fpga/vcu118 rtl hedefiyle başlıyor. Ana adımlar:
make -C soc/software/hello_uartile hello ELF build edilir.make -C soc/software/bootloaderile flash bootloader build edilir ve BootROM imajı üretilir.mill -i 'rocketchip[6.7.0].assembly'Rocket Chip Scala/Chisel kodunu assembly jar haline getirir.java -jar out/rocketchip/6.7.0/assembly.dest/out.jarkomutu Rocket generator'ı çalıştırır.- Generator top olarak
freechips.rocketchip.fpga.VCU118RocketSystem, config olarakfreechips.rocketchip.fpga.VCU118RocketConfigkullanır. - Çıktı olarak
hardware/generated/vcu118-soc/VCU118RocketSystem.firoluşur. firtoolbu FIRRTL dosyasınıhardware/generated/vcu118-soc-verilog/altında SystemVerilog dosyalarına böler.filelist.foluşturulur ve generated assert satırları FPGA sentezini sadeleştirmek için temizlenir.gen_vcu118_wrapper.pygenerated top portlarını okuyuptargets/fpga/vcu118/out/build/generated/vcu118_rocket_top.svwrapper'ını üretir.
Bu zinciri çalıştıran ana komutlar:
make -C targets/fpga/vcu118 soc # Chisel/FIRRTL/SystemVerilog üretir
make -C targets/fpga/vcu118 bitstream # soc + Vivado non-project FPGA build
Bizim Rocket Config Neyi Oluşturuyor?
VCU118'e özel SoC tanımı hardware/soc/scala/fpga/VCU118Peripherals.scala içinde. Ana sınıflar:
| Sınıf / Config | Rolü |
|---|---|
VCU118RocketSystem |
Rocket subsystem üzerine BootROM, UART, SPI, GPS APB blokları ve top-level IO bridge bağlantılarını ekleyen SoC top generator. |
VCU118RocketSystemModuleImp |
Generated top-level portları oluşturur: uart_rxd, uart_txd, spi_sck, spi_csn, spi_dq_i/o/oe, gps_rf_clk, gps_rf_data. |
VCU118RocketConfig |
SoC konfigürasyon zinciri. BootROM, debug SBA, harici memory portlarının kapatılması, hard double FPU, 1 MiB DTIM, UART, SPI, GPS APB blokları ve tek küçük Rocket core burada seçilir. |
WithVCU118OneMiBDTIM |
Harici AXI RAM yerine Rocket D-cache scratchpad/DTIM kullanır. Varsayılan adres 0x80000000, boyut 1 MiB. |
WithVCU118FlashBootROM |
BootROM içeriğini soc/out/software/bootloader/bootloader.img dosyasından alır. |
WithVCU118UART |
UART peripheral'ı 0x10013000 adresine ekler. Clock 100 MHz, baud 115200. |
WithVCU118SPI |
SPI flash controller'ı 0x10014000 adresine ekler. |
WithVCU118GPS |
1 acquisition ve 9 tracking APB wrapper'ını 0x10020000 tabanından başlayarak 4 KiB pencereler halinde ekler. |
VCU118RocketConfig özeti:
new WithVCU118FlashBootROM ++
new WithDebugSBA ++
new WithoutTLMonitors ++
new WithNoMemPort ++
new WithNoMMIOPort ++
new WithNoSlavePort ++
new WithNMemoryChannels(0) ++
new WithNBanks(0) ++
new WithVCU118OneMiBDTIM ++
new WithVCU118UART(0x10013000L, 100000000, 115200) ++
new WithVCU118SPI(0x10014000L) ++
new WithVCU118GPS(0x10020000L, 9) ++
new WithNExtTopInterrupts(0) ++
new WithNSmallCores(1) ++
new WithIncoherentBusTopology ++
new BaseConfig
Peripheral'leri Nasıl Ekledik?
UART
TLFpgaUART, Rocket'ın peripheral bus'ına bağlı bir TLRegisterNode olarak yazıldı. Register map:
| Offset | Register | Görev |
|---|---|---|
0x00 | txdata | Bir byte yaz, UART TX başlasın. |
0x04 | rxdata | Alınan byte oku. |
0x08 | txready | TX yeni byte kabul edebilir mi? |
0x0c | rxvalid | RX byte hazır mı? |
0x10 | clockfreq | UART clock frekansı. |
0x14 | baudrate | UART baud değeri. |
UART pinleri doğrudan TileLink içinde kalmıyor; BundleBridgeSource/Sink ile top-level IO'ya çıkarılıyor. Wrapper bu portları VCU118 RS232 UART pinlerine bağlıyor.
SPI Flash Controller
TLFpgaSPI da peripheral bus üzerinde TLRegisterNode. Register map:
| Offset | Register | Görev |
|---|---|---|
0x00 | ctrl | busy, csn, quad kontrol/status bitleri. |
0x04 | tx | Transfer başlatır. |
0x08 | rx | Son alınan shift register değeri. |
0x0c | ready | Controller hazır mı? |
SPI controller serial ve quad mod için sck, csn, dq_i, dq_o, dq_oe sinyalleri üretir. Bu sinyaller top-level porta çıkarılır ve wrapper içinde STARTUPE3 ile FPGA config flash pinlerine bağlanır.
GPS APB IP'leri ve AFE Yardımcı Bloğu
GPS entegrasyonu /home/ankaoc/Desktop/anka-rocket/gps_system altındaki SystemVerilog wrapper'ları kullanır. SoC içinde bir adet acq_wrapper, dokuz adet tracking_wrapper ve APB peripheral olmayan bir afe_top instance edilir.
APBGpsBlock TileLink peripheral bus'tan TLToAPB ile APB'ye geçer. Acquisition ve tracking blokları APB register penceresi olarak görünür; afe_top sadece yardımcı logic olduğu için address map'e girmez.
GPS APB baz adresi 0x10020000. Her IP'ye 0x1000 byte pencere ayrılır. Tracking adres formülü: 0x10020000 + (tracking_index + 1) * 0x1000.
| Blok | GPS base'e göre offset | Absolute base | Adres aralığı | Interrupt |
|---|---|---|---|---|
gps-acq | 0x00000 | 0x10020000 | 0x10020000..0x10020fff | PLIC source 1 |
gps-tracking0 | 0x01000 | 0x10021000 | 0x10021000..0x10021fff | PLIC source 2 |
gps-tracking1 | 0x02000 | 0x10022000 | 0x10022000..0x10022fff | PLIC source 3 |
gps-tracking2 | 0x03000 | 0x10023000 | 0x10023000..0x10023fff | PLIC source 4 |
gps-tracking3 | 0x04000 | 0x10024000 | 0x10024000..0x10024fff | PLIC source 5 |
gps-tracking4 | 0x05000 | 0x10025000 | 0x10025000..0x10025fff | PLIC source 6 |
gps-tracking5 | 0x06000 | 0x10026000 | 0x10026000..0x10026fff | PLIC source 7 |
gps-tracking6 | 0x07000 | 0x10027000 | 0x10027000..0x10027fff | PLIC source 8 |
gps-tracking7 | 0x08000 | 0x10028000 | 0x10028000..0x10028fff | PLIC source 9 |
gps-tracking8 | 0x09000 | 0x10029000 | 0x10029000..0x10029fff | PLIC source 10 |
Scala/Chisel ile SoC'ye Nasıl Ekleniyor?
FpgaGPSParams base address, tracking sayısı ve pencere boyunu taşır. WithVCU118GPS(0x10020000L, 9) config fragment'i bu parametreyi aktif eder. VCU118RocketSystem içinde p(VCU118GPSKey) okunur, APBGpsBlock yaratılır ve PBUS üzerinden APB'ye bağlanır.
val pbus = locateTLBusWrapper(PBUS)
val domain = pbus.generateSynchronousDomain("FPGAGPS")
val dev = domain { LazyModule(new APBGpsBlock(params, pbus.beatBytes)) }
domain {
dev.node := TLToAPB() := pbus.coupleTo("gps") {
TLFragmenter(pbus, Some("FPGAGPS")) := _
}
ibus.fromSync := dev.intnode
}
APB wrapper'ların lokal adres genişliği pencere boyundan gelir. Varsayılan 4 KiB pencere için PADDR 12 bittir; üst adres bitleri boşa taşınmaz.
Clock, RF IO ve AFE Bağlantısı
FPGA wrapper 100 MHz fabric clock, 100 MHz acquisition clock ve 125 MHz tracking clock üretir. RF clock üretilmez; gps_rf_clk dış IO olarak gelir ve 16.368 MHz olarak constrain edilir. RF sample datası da gps_rf_data[3:0] dış IO'dur.
afe_top.start_i acquisition wrapper'ın afe_start çıkışından, sample_counter_clear_i ise sample_counter_clear çıkışından sürülür. afe_top.sample_align_o acquisition ve bütün tracking wrapper'lara, afe_top.sample_counter_o ise bütün tracking wrapper'lara bağlanır.
ASIC sim top'unda RF clock yine PLL modelinden çıkmaz; testbench gps_rf_clk girişini 16.368 MHz dış kaynak gibi sürer.
BootROM ve Bootloader
BootROM imajı soc/out/software/bootloader/bootloader.img. Bootloader şunları yapar:
- UART üzerinden durum mesajı basar.
- SPI flash reset ve JEDEC ID okuma komutlarını gönderir.
APP_FLASH_OFFSETadresinden 64 byte header okur.- Header'daki load address, entry, size ve CRC alanlarını doğrular.
- Payload'u flash'tan DTIM'e kopyalar.
- CRC doğruysa entry adresine jump eder.
FPGA İçin Eklenen Wrapper ve Shell Modülleri
Generated Rocket RTL doğrudan VCU118 kartına uygun değildir. Bu yüzden gen_vcu118_wrapper.py bir shell top üretir:
IBUFDSile VCU118sysclk1_300differential clock alınır.BUFGCE_DIVile fabric clock üretilir.- Reset ve LED gibi kart seviyesi sinyaller bağlanır.
- UART portları kart RS232 UART pinlerine bağlanır.
- BSCAN-DMI debug tunnel daha önceki JTAG/RAM load testleri için wrapper'a bağlanır.
- SPI flash portları
STARTUPE3primitive'ine bağlanır.
STARTUPE3 bağlantısının amacı: VCU118 üzerindeki config QSPI flash pinleri normal user IO gibi dışarı çıkmaz. UltraScale+ cihazda user design bu flash'a STARTUPE3 üzerinden erişir. Bizim wrapper'da bağlantı şu mantıkla yapılıyor:
assign spi_dq_i = cfg_flash_dq_i;
STARTUPE3 u_cfg_flash_startup (
.DI(cfg_flash_dq_i),
.DO(spi_dq_o),
.DTS(~spi_dq_oe),
.FCSBO(spi_csn),
.FCSBTS(1'b0),
.USRCCLKO(spi_sck),
.USRCCLKTS(1'b0),
...
);
Vivado FPGA Flow Scriptleri Nasıl Çalışıyor?
Vivado tarafı non-project mode. Ana script targets/fpga/vcu118/flow/vivado/scripts/build.tcl:
- Part:
xcvu9p-flga2104-2L-e. - Board part:
xilinx.com:vcu118:part0:2.4. hardware/generated/vcu118-soc-verilog/filelist.fiçindeki Rocket SystemVerilog dosyalarını okur.hardware/upstream/rocket-chip/src/main/resources/vsrc/plusarg_reader.vve GPS APB/native RTL kaynaklarını okur.hardware/fpga/vcu118/rtl/*.sviçindeki FPGA shell yardımcı RTL dosyalarını okur.targets/fpga/vcu118/out/build/generated/vcu118_rocket_top.svwrapper'ını okur.hardware/fpga/vcu118/constraints/vcu118_rocket.xdcconstraint dosyasını okur.synth_design,opt_design,place_design,phys_opt_design,route_designçalıştırır.- Timing, utilization, DRC ve power raporları üretir.
targets/fpga/vcu118/out/bitstream/vcu118_rocket.bitdosyasını yazar.
Kaynaklar
- Chisel resmi sitesi
- Rocket Chip Generator resmi deposu
- Mill build tool resmi dokümanı
- CIRCT / FIRRTL ve firtool dokümantasyonu
Önemli Dosyalar
| Dosya | Görev |
|---|---|
hardware/soc/scala/fpga/VCU118Peripherals.scala |
VCU118 Rocket config, UART, SPI flash controller, GPS APB blokları, AFE bağlantısı ve BootROM ayarları. |
/home/ankaoc/Desktop/anka-rocket/gps_system/ |
Acquisition, tracking, common AFE helper ve APB wrapper SystemVerilog kaynakları. |
targets/fpga/vcu118/tools/gen_vcu118_wrapper.py |
Generated Rocket top modülünü VCU118 wrapper'a bağlar; SPI flash için STARTUPE3 ekler. |
targets/fpga/vcu118/flow/vivado/scripts/build.tcl |
Vivado non-project sentez, place, route ve bitstream üretim akışı. |
targets/fpga/vcu118/Makefile |
Tek giriş noktası; software, RTL, bitstream, flash image ve programlama hedeflerini yönetir. |
soc/software/tools/make_flash_image.py |
ELF dosyasını bootloader'ın okuyacağı header + payload flash imajına çevirir. |
targets/fpga/vcu118/flow/vivado/scripts/write_flash_regions.tcl |
Bitstream ve app için ayrı MCS üretir; aradaki boşluğu MCS'e koymaz. |
targets/fpga/vcu118/flow/vivado/scripts/program_flash.tcl |
Vivado hw_server üzerinden seçilen MCS region dosyalarını flash'a yazar. |
soc/software/bootloader/ |
BootROM'a gömülen SPI flash bootloader kaynakları. |
soc/software/hello_uart/ |
DTIM'e yüklenip çalışan bare-metal hello UART uygulaması. |
Flash Bellek Yerleşimi
| Bölge | Varsayılan Offset | İçerik | Nasıl Değiştirilir? |
|---|---|---|---|
| Bitstream | 0x00000000 |
FPGA konfigürasyon bitstream'i. | BITSTREAM_OFFSET=0x... |
| Application / ELF image | 0x06000000 |
Bootloader header + ELF payload. | APP_FLASH_OFFSET=0x... |
Son doğrulanan app image bilgisi:
flash_offset: 0x06000000
payload_flash_offset: 0x06000040
load_addr: 0x80000000
entry: 0x80000000
payload size: 425 bytes
crc32: 0xf5aa3b60
Normal Geliştirme Akışı
1. SoC ve bitstream üret
cd /home/ankaoc/Desktop/rocket/rocket-chip
make -C targets/fpga/vcu118 bitstream
Bu hedef software'i de build eder, Rocket Verilog üretir, wrapper oluşturur ve Vivado non-project flow ile targets/fpga/vcu118/out/bitstream/vcu118_rocket.bit dosyasını üretir.
2. Bitstream'i flash'a bir kere yaz
make -C targets/fpga/vcu118 program-flash-bitstream
Bu işlem uzun sürer. Sadece bitstream region MCS'i üretir ve BITSTREAM_OFFSET adresine yazar. App offset'e kadar olan boşluğu programlamaz.
3. ELF / uygulama değiştikçe sadece app region yaz
make -C targets/fpga/vcu118 program-flash
Bu hızlı yoldur. APP_ELF dosyasından flash image üretir, APP_FLASH_OFFSET adresine küçük app MCS'i yazar. Bitstream'e dokunmaz.
4. FPGA'yı JTAG üzerinden SRAM'e programlayıp hızlı test et
make -C targets/fpga/vcu118 program-fpga
Bu komut flash'taki bitstream'i kullanmaz; direkt .bit dosyasını FPGA SRAM'e yükler. Bootloader yine kart üzerindeki SPI flash'tan uygulamayı okur. Geliştirme sırasında en hızlı test yöntemi budur.
5. Power-cycle sonrası flash'tan kalkış
Bitstream region bir kere doğru yazıldıktan sonra kart power-cycle veya program/reset sonrası flash'taki bitstream'den konfigüre olabilir. Ardından BootROM bootloader çalışır ve app region'daki imajı okur.
Komut Referansı
| Komut | Açıklama |
|---|---|
make -C targets/fpga/vcu118 software |
Bootloader, hello app ve app flash image üretir. |
make -C targets/fpga/vcu118 soc |
Rocket Verilog ve VCU118 wrapper üretir. |
make -C targets/fpga/vcu118 bitstream |
Vivado non-project flow ile bitstream üretir. |
make -C targets/fpga/vcu118 flash-regions |
Seçilen region'lar için ayrı MCS üretir. Varsayılan auto/all davranışı için FLASH_REGIONS kullanılır. |
make -C targets/fpga/vcu118 program-flash-bitstream |
Sadece bitstream region'ını flash'a yazar. |
make -C targets/fpga/vcu118 program-flash |
Sadece ELF/app image region'ını flash'a yazar. Günlük uygulama geliştirme için ana komut budur. |
make -C targets/fpga/vcu118 program-flash-elf |
program-flash ile aynı alias. |
make -C targets/fpga/vcu118 program-flash-all |
Bitstream ve app'i iki ayrı region MCS ile yazar; aradaki gap'i yazmaz. |
make -C targets/fpga/vcu118 program-flash-combined |
Eski tek MCS yolu. Bitstream + app tek MCS/BIN içinde üretilir ve programlanır. |
make -C targets/fpga/vcu118 program-fpga |
Bitstream'i JTAG ile FPGA SRAM'e yükler. |
make -C targets/fpga/vcu118 prune |
Büyük geçici çıktıları siler; mevcut bitstream, app image ve küçük region MCS dosyalarını korur. |
make -C targets/asic/rocket sim |
Questa/ModelSim batch sanity sim çalıştırır. Varsayılan app hello_uart. |
make -C targets/asic/rocket sim GUI=1 |
Questa/ModelSim graphical simulator açar; -voptargs="+acc" ile sinyal erişimini açar, onfinish stop ayarlar, hardware/sim/asic/rocket/wave.do dosyasını yükler ve run 0ns yaparak GUI'yi debug için hazır bırakır. |
Ayarlanabilir Değişkenler
| Değişken | Varsayılan | Açıklama |
|---|---|---|
BITSTREAM_OFFSET |
0x00000000 |
Bitstream flash başlangıç adresi. |
APP_FLASH_OFFSET |
0x06000000 |
Bootloader'ın app header beklediği flash adresi. |
APP_ELF |
soc/out/software/hello_uart/hello_uart.elf |
Flash'a konacak bare-metal ELF. |
BIT_FILE |
targets/fpga/vcu118/out/bitstream/vcu118_rocket.bit |
FPGA bitstream dosyası. |
FLASH_VERIFY |
0 |
Vivado flash verify aç/kapat. Uzun sürdüğü için kapalı. |
CFGMEM_PART |
mt25qu01g-spi-x1_x2_x4 |
VCU118 üzerindeki MT25QU01G flash için Vivado programlama parçası. |
FLASH_REGIONS |
auto |
app, bitstream, all veya virgüllü liste. |
Örnek: farklı app offset ile yazmak
APP_FLASH_OFFSET=0x06400000 make -C targets/fpga/vcu118 program-flash
Bootloader build edilirken de aynı APP_FLASH_OFFSET değeri kullanılır. Flow bunu software build'e geçirir; offset değiştiğinde bootloader içeriği de yeniden oluşur. Bootloader BootROM'a gömülü olduğu için offset değişikliği tam SoC/bitstream rebuild gerektirebilir.
Örnek: farklı ELF yazmak
APP_ELF=/path/to/my_app.elf make -C targets/fpga/vcu118 program-flash
Örnek: Questa GUI sim açmak
make -C targets/asic/rocket sim GUI=1
Bu komut compile/DPI hazırlığını yapar, asic_rocket_tb testbench'ini -voptargs="+acc" ile GUI'de yükler, onfinish stop kurar, hardware/sim/asic/rocket/wave.do dosyasını çalıştırır ve otomatik olarak sadece run 0ns çalıştırır. Devam etmek için Questa transcript'te elle run -all veya istediğin süre kadar run 1 us yazabilirsin.
Test Sonucu
1 Temmuz 2026 tarihinde yapılan kart testinde şu adımlar çalıştırıldı:
make -C targets/fpga/vcu118 program-flash
make -C targets/fpga/vcu118 program-fpga
UART cihazı: /dev/ttyUSB2, baud: 115200.
Alınan UART çıktısı:
VCU118 Rocket flash bootloader
Header offset: 0x06000000
Flash JEDEC ID: 0x0020bb21
Load: flash 0x06000040 -> mem 0x80000000, size 0x000001a9
CRC ok, jumping 0x80000000
Rocket Chip VCU118 hello UART
DTIM: 0x80000000..0x800fffff (1 MiB)
UART clock Hz: 0x047868c0
UART baud: 0x0001c200
Doğrulama: Bootloader flash JEDEC ID'yi doğru okudu, app header'ını 0x06000000 adresinden buldu, payload'u 0x80000000 DTIM adresine kopyaladı, CRC kontrolü geçti ve hello UART uygulaması çalıştı.
Notlar ve Riskler
program-flash-bitstreamuzun sürer; bunu sadece bitstream değiştiğinde çalıştır.- Günlük bare-metal geliştirmede yalnız
program-flashyeterlidir. program-fpgaSRAM'e yükler; power-cycle sonrası kalıcı değildir.- Power-cycle sonrası kendi kendine boot için bitstream'in flash'ta doğru programlanmış olması gerekir.
- Tek MCS opsiyonu
program-flash-combinedolarak duruyor; bu yol büyük MCS yazdığı için yavaştır.