日曜技術者のメモ

趣味でやった事のメモ書きです。

PYNQ JTAGでZynqとRISC-Vをまとめてデバッグ(失敗)

Xilinxのフォーラムを見てたらこんなのがあった

forums.xilinx.com

以前SCR1をFPGAで動かしたときにFPGARISC-Vで別々のJTAGケーブルが必要なのが面倒だと思った。これができれば1本のケーブルで全部できるやん!と思ってやってみた
結果、JTAGは繋がった様だがOpenOCDからRISC-Vに接続できなかった。

他にも調べるとZynq UltraScale とRocket Chipについての記事が見つかった
これもBSCANについて記載があるがnot workとも書いてる
RISC-V Hardware Design: Debug via BSCAN Chain - Edgeboard RISC-V Series - Pengcheng Xu's Place

実験環境

  • PYNQ-Z1
  • Vivado&Vitis IDE 2020.2
  • riscv-openocd (最新版をgit clone)
  • riscv-gnu-toolchain (最新版をgit clone)
  • SCR1

PL部

以下JTAG回りの実装で認識できそうなところまではできた
BSCANマスターが二つあるのは一つをDebug Hubに繋げないとILAが使えなくなった為
Debug HubのクロックはPLのクロックを接続している
f:id:ginnyu-tei:20210911103803p:plain:w400

PS部

JTAGに関しては何もしていない
PLへのクロック・リセット供給とSCR1コアをスタートする位

OpenOCD

cfgファイル

interface ftdi
transport select jtag
ftdi_vid_pid 0x0403 0x6010
ftdi_layout_init 0x0098 0x008b

ftdi_channel 0

adapter speed 1000
jtag newtap zynq_pl bs -irlen 6 -ircapture 0x1 -irmask 0x03 \
    -expected-id 0x23727093 \
    -expected-id 0x13722093 \
    -expected-id 0x03727093 \
    -expected-id 0x03736093

jtag newtap zynq cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 0x4ba00477

jtag newtap riscv cpu -irlen 5

target create riscv.cpu riscv -endian little -chain-position riscv.cpu -coreid 0

実験結果

まずはそのままBitStreamを書き込みHardware Managerで見てみると
Hardware Targetが二つになっている
f:id:ginnyu-tei:20210911105819p:plain:w400
下のTargetに接続するとデバイスがないエラーになるがPSからClockを供給していないので想定通り。
次にPSを動作させRISC-Vがリセット解除されてから改めて接続。IDcodeやIR lengthがSCR1と同じなので認識されている様子
f:id:ginnyu-tei:20210911110737p:plain:w400
これでいけると思ったが、Hardware Managerを切断しOpenOCDを起動するとPLとPSは繋がるがRISC-Vが見つからずエラーになる

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 1000 kHz
Info : JTAG tap: zynq_pl.bs tap/device found: 0x23727093 (mfg: 0x049 (Xilinx), part: 0x3727, ver: 0x2)
Info : JTAG tap: zynq.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd), part: 0xba00, ver: 0x4)
Info : JTAG tap: riscv.cpu tap/device found: 0xffffffff (mfg: 0x7ff (<invalid>), part: 0xffff, ver: 0xf)
Error: riscv.cpu: IR capture error; saw 0x1f not 0x01
Warn : Bypassing JTAG setup events due to errors
Error: dtmcontrol is 0. Check JTAG connectivity/board power.
Warn : target riscv.cpu examination failed
Info : starting gdb server for riscv.cpu on 3333
Info : Listening on port 3333 for gdb connections

多分Hardware TargetのPS、PLがある方をopenしているからだと思うがOpenOCD上でHardware Targetの切り替え方法が分からずここで終了