JTAG debugiranje
Hazard3 sadrži RISC-V Debug Module i Debug Transport Module. Na ECP5 pločicama
Hazard3 izlaže RISC-V DTM kroz JTAG TAP ECP5 čipa i primitiv JTAGG. OpenOCD
stoga najprije vidi fizički ECP5 TAP, a zatim koristi privatne ECP5 ER1/ER2
instrukcije kako bi pristupio Hazard3 DTMCS i DMI registrima.
Za objašnjenje hardverskog puta, apstraktnih naredbi, ubrizgavanja instrukcija, pristupa sistemskoj sabirnici i debug mogućnosti odabranih u ovom bitstreamu pogledajte RISC-V arhitektura za debugiranje.
OpenOCD i GDB
GDB se s OpenOCD-om povezuje preko TCP-a, uobičajeno na localhost:3333. GDB
ne otvara izravno USB JTAG adapter. USB driver i konfiguracija adaptera stoga
pripadaju OpenOCD-u, dok scripts/load-firmware.sh koristi GDB tek nakon što
OpenOCD uspješno ispita metu.
Za ULX3S preporučeni launcher je:
./scripts/start-openocd.sh
Launcher je namjerno upotrebljiv i iz WSL-a i iz izvornog Linuxa. Na izvornom
Linuxu pronalazi openocd preko PATH. Pod WSL-om može koristiti priloženi
Windows openocd.exe za checkout na Windows mountu ako je WSL interop
dostupan; inače koristi izvorni Linux OpenOCD. Time putanje repozitorija i
format izvršne datoteke ostaju usklađeni s host okruženjem.
Projektne ULX3S konfiguracije napisane su za Ubuntu OpenOCD 0.12.0 i novije
OpenOCD buildove koje projekt trenutačno koristi. Konkretno, kompatibilni zapis
gdb_report_data_abort prihvaća 0.12.0; noviji buildovi mogu ispisati
upozorenje o zastarjelosti, ali ga i dalje prihvaćaju. Nemojte mijenjati OpenOCD
iz distribucije samo radi uklanjanja tog upozorenja.
Ako OpenOCD već radi i nijedan drugi GDB klijent nije spojen:
./scripts/load-firmware.sh
Ili navedite ELF izričito:
./scripts/load-firmware.sh /path/to/hazard3-boot-monitor.elf
Za ULX3S 12F nakon programiranja fpga_ulx3s_12f.bit preporučena naredba
drugog stupnja je:
./scripts/load-firmware-12f.sh
Ponovno koristi OpenOCD ako port 3333 već sluša; inače pokreće projektni OpenOCD launcher, čeka GDB server, učitava i provjerava board-specific SDRAM monitor te zaustavlja samo OpenOCD proces koji je sama pokrenula.
Oblik bez argumenta odnosi se na izlaz samostalnog scripts/build.sh builda.
Za potpuni board build radije koristite GDB datoteku naredbi za točno određenu
metu kako se monitor ne bi zamijenio s ELF-om izgrađenim za drugi takt ili
memorijski profil:
# ULX3S 85F
riscv-none-elf-gdb -batch -x scripts/gdb/load-ulx3s-85f-monitor.gdb
# ULX3S 12F
riscv-none-elf-gdb -batch -x scripts/gdb/load-ulx3s-12f-monitor.gdb
# ULX4M-LD 85F
riscv-none-elf-gdb -batch -x scripts/gdb/load-ulx4m-ld-85f-monitor.gdb
Svaka datoteka odabire monitor iz odgovarajućeg build/<board>/monitor/
direktorija, zaustavlja metu, učitava i provjerava ELF s compare-sections,
postavlja $pc na _start, nastavlja procesor i odspaja se. Nemojte koristiti
generički ili zastarjeli monitor ELF iz drugog board builda; može se izvršavati,
a ipak koristiti pogrešan UART djelitelj, memorijsku mapu ili protokol loadera.
Kada iz WSL-a pokrećete priloženu Windows .exe datoteku, okolna ljuska i
dalje je Bash. Koristite put poput ./bin/gdb/riscv-none-elf-gdb.exe i završnu
obrnutu kosu crtu (\) za nastavak Bash naredbe. cmd.exe sintaksa poput
.\bin\... i nastavak retka znakom ^ vrijede samo nakon izričitog ulaska
u cmd.exe; zalijepljeni izravno u WSL tumače se kao odvojene ili izmijenjene
Bash naredbe.
Ugrađeni ULX3S FT231X
Na ULX3S-u projekt koristi uobičajenu FT231X USB/JTAG vezu pločice. Trenutačni
OpenOCD ft232r put provjeren je na Windowsu s driverima WinUSB i
libusbK. WinUSB je praktičan kada isti FT231X koristi i Hazard3-Doom WebUSB
FPGA flasher. Zadani FTDI VCP/D2XX binding namijenjen je FTDI-native alatima
poput Windows fujprog i nije libusb OpenOCD put.
Ako Windows OpenOCD prijavi LIBUSB_ERROR_NOT_SUPPORTED pa zatim
ft232r not found: vid=0403, pid=6015, FT231X je obično još vezan na
FTDIBUS/D2XX. Prije pokretanja OpenOCD-a pomoću Zadiga odaberite WinUSB ili
libusbK za ULX3S uređaj. Ako ste FPGA najprije programirali Windows
fujprog alatom, imajte na umu da fujprog koristi izvorni FTDI driver,
pa prelazak između ta dva host alata može zahtijevati promjenu drivera.
Za matricu kompatibilnosti ULX3S drivera pogledajte FPGA WebUSB flasher.
Zdravo pokretanje OpenOCD-a na ULX3S 85F uključuje izlaz sličan ovome:
JTAG tap: lfe5u85.hazard3 tap/device found: 0x41113043
Examined RISC-V core; found 1 harts
hart 0: XLEN=32
Listening on port 3333 for gdb connections
U VM-u početna USB transakcija ponekad može prijaviti
LIBUSB_ERROR_TIMEOUT ili neuspjelo JTAG ispitivanje koje vraća same nule.
Procijenite konačno stanje, ne samo prvo upozorenje: ako OpenOCD nakon toga
ispita RISC-V jezgru i otvori port 3333, debug server je upotrebljiv. Čisto
trenutačno ponovno pokretanje dobra je potvrda. Ako TAP/jezgra nikada nisu
pronađeni, provjerite je li FT231X dodijeljen guestu, je li browser FPGA flasher
odspojen i posjeduje li neki drugi proces JTAG sučelje.
ULX3S s vanjskim Tigardom
Tigard se može koristiti umjesto ugrađenog FT231X-a. To je osobito korisno za usporedbu debug adaptera, izbjegavanje promjene FT231X drivera ili uporabu bržeg FT2232H MPSSE JTAG puta. Ožičenje slijedi objavljene Tigard i ULX3S JTAG pinoute; kvalificirajte ovaj put vanjskog adaptera na ciljnoj pločici prije nego što ga smatrate projektno provjerenom konfiguracijom.
J4 je fizički vanjski JTAG priključak, a ne zaseban JTAG kontroler. Njegovi
signali TCK, TMS, TDI i TDO spojeni su na hardverski JTAG TAP
ECP5 čipa. To su namjenski JTAG pinovi, a ne obični korisnički GPIO, pa Hazard3
ECP5 debug put ne vodi kroz uobičajena LPF LOCATE ograničenja. ULX3S
referentni LPF također ostavlja ta namjenska mjesta komentirana kao korisnički
GPIO.
Kada je Hazard3 konfiguriran za ECP5 debug transport, put izgleda ovako:
Tigard / FT2232H
|
v
ULX3S J4
|
v
ECP5 hard JTAG TAP
|
v
JTAGG
|
v
Hazard3 ECP5 JTAG DTM
|
v
RISC-V Debug Module
|
v
Hazard3 CPU
JTAGG je veza FPGA logike prema postojećem ECP5 TAP-u; Hazard3 ne stvara
drugi vanjski TAP. Hazard3 mapira RISC-V DTMCS i DMI registre podataka na
ECP5 ER1 i ER2 korisničke registre, koje biraju instrukcije 0x32 i
0x38. Standardne TAP funkcije poput IDCODE i BYPASS i dalje pruža ECP5 TAP.
Zato OpenOCD najprije identificira ECP5, a zatim privatnim instrukcijama dolazi
do RISC-V debuggera.
To se razlikuje od generičkog Hazard3 načina DTM_TYPE="JTAG", u kojem je
uobičajeni RISC-V JTAG DTM spojen na četiri korisnička I/O porta. Za ULX3S ECP5
način interno instancira hazard3_ecp5_jtag_dtm i JTAGG, pa se J4 spaja
na ECP5 TAP, a ne izravno na RISC-V JTAG pinove.
Spojite Tigard JTAG zaglavlje izravno na ULX3S J4:
Tigard GND (pin 2, black) -> ULX3S J4 GND
Tigard TCK (pin 3, white) -> ULX3S J4 TCK
Tigard TDI (pin 4, grey) -> ULX3S J4 TDI
Tigard TDO (pin 5, purple) <- ULX3S J4 TDO
Tigard TMS (pin 6, blue) -> ULX3S J4 TMS
Tigard VTGT -> not connected
Tigard TRST / SRST -> not connected
ULX3S vanjski JTAG – J4 je fizički priključak za hardverski ECP5
JTAG TAP. Za Tigard koristite njegove namjenske TCK, TDI, TDO i TMS pinove;
oni nisu obični FPGA GPIO.
Postavite Tigard u SPI/JTAG način i na 3,3 V logiku. ULX3S napajajte
normalno preko US1. Za fizički raspored J4 i upozorenja o ožičenju pogledajte
Pinovi pločica i ožičenje.
Dio OpenOCD konfiguracije za Tigard adapter je:
adapter driver ftdi
transport select jtag
ftdi vid_pid 0x0403 0x6010
ftdi channel 1
ftdi layout_init 0x0038 0x003b
ftdi layout_signal nTRST -data 0x0010
ftdi layout_signal nSRST -data 0x0020
adapter speed 1000
Hazard3 dio mete jednak je openocd/ulx3s-openocd.cfg: ECP5 TAP ima 8-bitni
instrukcijski registar, a Hazard3 DTMCS/DMI dohvaćaju se ECP5 privatnim
instrukcijama 0x32 i 0x38. Za ULX3S 85F ECP5 IDCODE je 0x41113043.
Pločica 12F umjesto toga koristi 0x21111043.
Nakon što OpenOCD prijavi ECP5 TAP, ispita jedan 32-bitni RISC-V hart i otvori port 3333, spojite projektni RISC-V GDB na ELF. S točnim GDB izvršnim programom iz instalirane RISC-V toolchain, interaktivni tijek konceptualno izgleda ovako:
$ riscv-none-elf-gdb path/to/hazard3-boot-monitor.elf
(gdb) target extended-remote localhost:3333
(gdb) monitor halt
(gdb) break main
(gdb) continue
(gdb) next
(gdb) stepi
(gdb) info registers
(gdb) continue
next i step rade na razini izvornog koda kada su debug informacije
dostupne; nexti i stepi rade jednu strojnu instrukciju odjednom. To je
pravo single-step debugiranje Hazard3 RISC-V jezgre koja radi unutar FPGA-a.
Vanjski Tigard i dalje ulazi kroz ECP5 JTAG TAP; ne spaja se izravno na RISC-V
pinove.
Debugiranje ugrađenog ULX3S ESP32 s Tigardom
Ugrađeni ESP32 potpuno je odvojena JTAG meta od Hazard3. To je klasični dvojezgreni Xtensa ESP32, pa koristite Espressif ESP32 OpenOCD podršku i Xtensa GDB, a ne RISC-V GDB koji se koristi za Hazard3. Ova je veza izvedena iz ULX3S sheme/LPF-a i Espressifovih dokumentiranih JTAG pinova; još nije projektno kvalificirana na ULX3S-u.
Izvorni ESP32 JTAG koristi:
TDI -> GPIO12 / MTDI
TCK -> GPIO13 / MTCK
TMS -> GPIO14 / MTMS
TDO <- GPIO15 / MTDO
Na ULX3S-u ta četiri ESP32 signala dijele se s microSD sučeljem. Praktična Tigard veza stoga do njih dolazi preko SD signala:
Tigard TDI (pin 4, grey) -> SD DAT2 -> ESP32 GPIO12
Tigard TCK (pin 3, white) -> SD DAT3 -> ESP32 GPIO13
Tigard TMS (pin 6, blue) -> SD CLK -> ESP32 GPIO14
Tigard TDO (pin 5, purple) <- SD CMD <- ESP32 GPIO15
Tigard GND (pin 2, black) -> board GND
Odgovarajući microSD kontakti su DAT2 pin 1, DAT3 pin 2, CMD pin 3, CLK pin 5 i VSS/GND pin 6. Breakout ili produžetak mnogo je jednostavniji i sigurniji od izravnog sondiranja kontakata utora. Izvadite SD karticu.
Upozorenje
ECP5 je spojen na iste SD signale. Nemojte debugirati ESP32 preko tih žica
dok FPGA može upravljati SD sabirnicom. Koristite ili provjerite FPGA sliku
koja ostavlja SD_D2, SD_D3, SD_CLK i SD_CMD u high-impedance
stanju. Normalni Hazard3-Doom dizajn koristi SD, pa ovu izolaciju treba
namjerno osigurati prije spajanja Tigarda.
Držanje ESP32 u resetu pomoću J3
Ako se na FPGA strani pojave problemi sa SD karticom, ULX3S J3 jumper može
se koristiti za držanje ESP32 u resetu. J3 je 2-pinski priključak koji pri
kratkom spoju uzemljuje ESP32 EN signal. Time se ESP32 onemogućuje i može ga
se izolirati od dijeljene SD sabirnice tijekom dijagnostike ili kada FPGA treba
isključivo vlasništvo nad SD karticom.
ULX3S J3 (WIFI_OFF) jumper – kratki spoj J3 povlači ESP32 EN
signal na nisku razinu i drži ESP32 u resetiranom/onemogućenom stanju.
Tigard SRST po želji se može spojiti na WIFI_OFF/EN stranu ULX3S J3
jumpera za hardverski reset. ESP32 EN je enable signal aktivan na visokoj
razini; povlačenje na nisku razinu resetira/onemogućuje čip. Nemojte spojiti
reset žicu na GND stranu J3 i nemojte spojiti Tigard VTGT kada se ULX3S
napaja samostalno.
Ako je instaliran Espressif OpenOCD, konfiguracija je ekvivalentna ovoj:
openocd \
-f interface/ftdi/tigard.cfg \
-c "set ESP32_FLASH_VOLTAGE 3.3" \
-f target/esp32.cfg
Zatim koristite ELF koji proizvodi ESP32 build:
$ xtensa-esp32-elf-gdb path/to/esp32-app.elf
(gdb) target remote localhost:3333
(gdb) monitor halt
(gdb) break app_main
(gdb) continue
(gdb) next
(gdb) stepi
Postavka ESP32_FLASH_VOLTAGE važna je jer je GPIO12/TDI također ESP32
boot-strapping ulaz. Espressif OpenOCD konfiguracija koristi postavku napona
flasha kako bi JTAG TDI idle stanje odgovaralo 3,3 V flash uređaju.
ULX4M-LD s Tigardom
ULX4M Micro-B DFU veza jest put konfiguracije/bootloadera FPGA-a. Ona nije Hazard3 JTAG debug adapter. Za ULX4M-LD debugiranje koristite vanjski Tigard FT2232H.
Provjerena Tigard konfiguracija
Koristite ove postavke:
Stavka |
Postavka |
|---|---|
Tigard odabir načina |
|
Tigard napajanje mete |
|
Referentni napon mete |
3,3 V |
USB VID:PID |
|
OpenOCD FTDI kanal |
|
JTAG sat |
1000 kHz |
ECP5 uređaj |
LFE5UM-85F |
ECP5 IDCODE |
|
Hazard3 DTMCS/DMI instrukcije |
|
Ispravan LFE5UM-85F IDCODE je 0x01113043. Nemojte koristiti
0x41113043 vrijednost povezanu s drugom ECP5 varijantom.
Razdvajanje Windows drivera
Tigard izlaže dva neovisna FT2232H USB sučelja. Konfigurirajte ih jednom i ostavite tako:
USB sučelje |
FT2232H kanal |
Windows driver |
Uporaba u projektu |
|---|---|---|---|
Interface 0 |
A |
FTDI VCP |
UART COM port |
Interface 1 |
B |
libusbK |
OpenOCD JTAG |
To omogućuje istodobnu uporabu PuTTY/Web Serial na UART-u i OpenOCD JTAG-a; nema razloga stalno mijenjati drivere. Ako se libusbK slučajno instalira na Interface 0, UART COM port nestaje. Vratite Interface 0 na FTDI USB Serial/VCP driver i ostavite Interface 1 na libusbK.
Primijenite libusbK na Tigard Interface 1 za JTAG. Interface 0 zadržite na FTDI VCP driveru za UART COM port.
ULX4M-LD UART preko Tigarda
Tigard UART sučelje neovisno je o JTAG kanalu. Koristite 115200 8N1, bez kontrole toka. Na Waveshare Raspberry Pi-style 40-pinskom headeru potvrđeno je ožičenje:
Tigard UART TX (yellow) -> physical pin 16 -> GPIO23 -> FPGA N4 -> uart_rx
Tigard UART RX (orange) <- physical pin 18 -> GPIO24 <- FPGA N3 <- uart_tx
Tigard GND -> physical pin 20
Tigard VCC -> not connected
TX i RX moraju biti križani točno kako je prikazano. Za označeni ULX4M-LD carrier pinout pogledajte Pinovi pločica i ožičenje.
ULX4M-LD OpenOCD konfiguracija
Projektna konfiguracija je:
./bin/openocd.exe -d2 \
-f ./third_party/Hazard3/example_soc/ulx4m-openocd-tigard.cfg
Važne vrijednosti konfiguracije ekvivalentne su ovima:
adapter driver ftdi
ftdi vid_pid 0x0403 0x6010
ftdi channel 1
ftdi layout_init 0x0038 0x003b
ftdi layout_signal nTRST -data 0x0010
ftdi layout_signal nSRST -data 0x0020
transport select jtag
adapter speed 1000
set _CHIPNAME lfe5um85
jtag newtap $_CHIPNAME hazard3 \
-expected-id 0x01113043 \
-irlen 8 \
-irmask 0xFF \
-ircapture 0x5
set _TARGETNAME $_CHIPNAME.hazard3
target create $_TARGETNAME riscv -chain-position $_TARGETNAME
riscv set_ir dtmcs 0x32
riscv set_ir dmi 0x38
gdb_report_data_abort enable
init
halt
Provjereno Tigard ožičenje ne spaja žicu za reset mete. Nemojte se oslanjati na SRST/TRST za resetiranje ili pokretanje ULX4M dizajna; FTDI layout unosi ostaju dio konfiguracije adaptera, ali reset u ovoj postavi nije fizički spojen na metu.
Zdrava sesija dolazi do izlaza sličnog ovome:
JTAG tap: lfe5um85.hazard3 tap/device found: 0x01113043
Examined RISC-V core; found 1 hart
XLEN=32
Listening on port 3333 for gdb connections
Poznata ispravna Hazard3 DTMCS vrijednost je 0x00004071.
Tumačenje dtmcontrol is 0
Hardverski ECP5 JTAG TAP može vratiti IDCODE čipa čak i kada Hazard3 korisnički bitstream ne radi. Zato je ova kombinacija dijagnostički korisna:
JTAG IDCODE = 0x01113043
dtmcontrol = 0
Ona dokazuje da fizički Tigard-prema-ECP5 JTAG put radi, ali ne dokazuje da
je Hazard3 JTAGG/DTM korisnička logika aktivna. Prije promjene DTM RTL-a ili
JTAG ožičenja potvrdite da je ULX4M korisnički bitstream stvarno pokrenut. Ako
je pločica još u DFU bootloaderu, pokrenite:
./bin/dfu-util.exe -a 0 -e
Zatim ponovno pokušajte OpenOCD. U provjerenom bring-up slijedu izlazak iz DFU-a na ovaj način pokrenuo je korisnički dizajn, vratio Hazard3 UART i učinio korisničku FPGA logiku dostupnom za daljnje testiranje.
Ako korisnički dizajn vidljivo radi preko UART-a, ali DTMCS je i dalje nula, upotrijebite sirovi ECP5 ER1/DTMCS scan ili usporedite s ranije poznatim dobrim OpenOCD buildom prije mijenjanja Hazard3 RTL-a.
Izgradnja i učitavanje monitora usklađenog sa satom
Trenutačni kvalificirani ULX4M-LD FPGA profil pokreće Hazard3/AHB na 40 MHz. Izgradite odgovarajući software-only monitor bez ponovnog routanja FPGA-a:
HAZARD3_BUILD_DIR="$PWD/build/ulx4m-ld-monitor-test/monitor" \
HAZARD3_MEMORY_PROFILE=64m \
HAZARD3_SYS_CLK_HZ=40000000 \
./scripts/build.sh
Zatim, dok OpenOCD već ispituje metu:
./scripts/load-firmware.sh \
./build/ulx4m-ld-monitor-test/monitor/hazard3-boot-monitor.elf
Uspješno učitavanje prijavljuje podudarne .vectors, .text, read-only
podatke i .data sekcije prije nastavka s adrese 0x00000040.
VisualGDB
Windows korisnici mogu koristiti projektne datoteke u VisualGDB/ s Visual
Studiom. Debugger i dalje komunicira s istom OpenOCD/GDB metom, pa naredbeni
put ostaje referentni workflow. Odspojite VisualGDB prije pokretanja batch
firmware loadera jer samo jedan GDB klijent smije istodobno posjedovati OpenOCD
metu.
GDB startup helper je:
scripts/hazard3-debug.gdb
Rješavanje problema
Ako debug modul nije pouzdano otkriven, najprije razlikujte fizički TAP pristup od Hazard3 DTM pristupa. Ispravan ECP5 IDCODE uz DTMCS nula drugačiji je kvar od adaptera koji uopće ne može pročitati ECP5 IDCODE. Smanjite JTAG sat tek nakon provjere aktivne FPGA slike, Tigard raspodjele drivera i postavki napajanja/referentnog napona mete.
Za uobičajene OpenOCD probleme i vlasništvo nad sučeljima pogledajte Otklanjanje poteškoća.