久しぶりに自作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.c
とbios/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 ================--