FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LiteXによるSoC環境構築を試行する (2. LiteXのブートシーケンスデバッグ)

https://raw.githubusercontent.com/enjoy-digital/litex/master/doc/litex.png

久しぶりに自作CPUのコアをLiteXに接続して、シミュレーション作業をしている。 FPGAの環境はどうにかなりつつあるので、シミュレーションでBIOSが動作するのを確認すれば、まずはなんとかなるんじゃないかなと思い作業中。

いろいろデバッグして、とりあえずブートシーケンスが動き出すところまで来ているのだが、コンソールがまだ出てこない。 こういう話前もやったんだけど、いつの間にかデグレードしているんだよなあ...

CRC32()のコードを何度も呼び出しているらしい。これをベースにフローを解析していく。

spike-dasm < scariv_inst.log | grep PC=0x000000243e
7118000000 ( 8, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4
404141000000 ( 6, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4
800886000000 (14, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4
1197689000000 ( 8, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4
1594468000000 ( 2, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4
1991342000000 (14, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4
2388181000000 ( 7, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4
2785055000000 ( 1, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4
3181845000000 (11, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4
3578687000000 ( 2, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4
3975395000000 (15, 1) PC=0x000000243e: 00006691 c.lui   a3, 0x4

crc32()の在処なのだが、libbase/crc32.cとともに呼び出しはbios/boot.cbios/main.cで行われている。

#ifndef CONFIG_BIOS_NO_CRC
        crcbios();
#endif

あれ?それよりまえにLiteXのロゴが出ていないとおかしいはずなんだよな。

#ifndef CONFIG_BIOS_NO_PROMPT
        printf("\n");
        printf("\e[1m        __   _ __      _  __\e[0m\n");
        printf("\e[1m       / /  (_) /____ | |/_/\e[0m\n");
        printf("\e[1m      / /__/ / __/ -_)>  <\e[0m\n");
        printf("\e[1m     /____/_/\\__/\\__/_/|_|\e[0m\n");
        printf("\e[1m   Build your hardware, easily!\e[0m\n");
        printf("\n");
        printf(" (c) Copyright 2012-2023 Enjoy-Digital\n");
        printf(" (c) Copyright 2007-2015 M-Labs\n");
        printf("\n");
#ifndef CONFIG_BIOS_NO_BUILD_TIME
        printf(" BIOS built on "__DATE__" "__TIME__"\n");
#endif

どうも命令トレースを確認していると、ret命令の戻り先が間違っているような気がしている。

398152000000 ( 9, 1) PC=0x0000001d46: 000060e2 c.ldsp  ra, 24(sp)
  GPR[ 1](20) <= 0000000000000000
398152000000 ( 9, 2) PC=0x0000001d48: 00006125 c.addi16sp sp, 96
  GPR[ 2](01) <= 0000000020001f40
398153000000 (10, 1) PC=0x0000001d4a: 00008082 ret
  GPR[ 0](00) <= 0000000000000000
398166000000 (11, 1) PC=0x0000000000: 0000a8b5 c.j     pc + 124
  GPR[ 0](00) <= 0000000000000000
398223000000 (12, 1) PC=0x000000007c: 20002117 auipc   sp, 0x20002
  GPR[ 2](0b) <= 000000002000207c
398224000000 (13, 1) PC=0x0000000080: f8410113 addi    sp, sp, -124
  GPR[ 2](14) <= 0000000020002000
398229000000 (14, 1) PC=0x0000000084: 20000297 auipc   t0, 0x20000
  GPR[ 5](25) <= 0000000020000084
398229000000 (14, 2) PC=0x0000000088: 4602be23 sd      zero, 1148(t0)
398230000000 (15, 1) PC=0x000000008c: 00000297 auipc   t0, 0x0
  GPR[ 5](15) <= 000000000000008c

追記:いろいろデバッグして、AXIにプロトコルを乗せ換える部分にバグがあったことが分かった。 修正すると、無事にブートローダが立ち上がるところまで行った。とりあえず一安心。

        __   _ __      _  __
       / /  (_) /____ | |/_/
      / /__/ / __/ -_)>  <
     /____/_/\__/\__/_/|_|
   Build your hardware, easily!

 (c) Copyright 2012-2023 Enjoy-Digital
 (c) Copyright 2007-2015 M-Labs

 BIOS built on Apr  5 2023 09:51:40
 BIOS CRC passed (6265d7fd)

 LiteX git sha1: be50d8e4

--=============== SoC ==================--
CPU:            SCARIV @ 1MHz
BUS:            WISHBONE 32-bit @ 4GiB
CSR:            32-bit data
ROM:            128.0KiB
SRAM:           8.0KiB


--============== Boot ==================--
Booting from serial...
Press Q or ESC to abort boot completely.
sL5DdSMmkekro
Timeout
No boot medium found

--============= Console ================--