シリアルの怪奇現象を追っている話
先日、Uartの通信がPCとFPGA間でできるようになったので、 次にFPGAにChiselのMemを置いて書き込めるか確認しようとしました。 他にもGPIO設定できるものや、スイッチの設定値を読める機能もついでに追加しました。
で、テスト用のプログラムを作って、動作確認するのですが、 肝心のMemの読み書きができないことがわかりました。 シリアル転送でb'w' -> address -> wdata(テストではaddress) と送れば書き込めるようにしたはずが書き込めないようでした。
で、wdata送った後にマージンを置いてみることにしました。 挙動が変わりまたが、一致しません。意味不明なことに0x80が足されています。
[NG] i[00] rdata[80] [NG] i[01] rdata[80] [NG] i[02] rdata[81] [NG] i[03] rdata[81]
で、ものは試しと思い、addressを送った後にもマージンを追加することにしました。 すると、適切にかけることがわかりました。
chisel_uart/test_mem.py at 887cf8f93d3c4ee390d804ee54ae2586126bf465 · moamoai/chisel_uart · GitHub
ser.write(b'w') # memory write ser.write(txd) # addr time.sleep(MARGIN) ser.write(txd) # wdata time.sleep(MARGIN)
ああ、アドレス送った後に待たないと何か不都合があるんだなと思い、末尾のマージンをとることにしました。 すると、なんと以下のように0x80データを送った後に結果が不一致し始めたんです。 お化けでもみたような気になりました。
[NG] i[80] rdata[01] [NG] i[81] rdata[03] [NG] i[82] rdata[05]
あとがき
というわけで、現在も原因がわからない怪奇現象が発生したというお話でした。
見つかるか心配ですが、これが実機の醍醐味なんだ、と慰めながら現在も原因を調査中です。
以下のいずれかとは思うのですが、どれなのでしょうか。。それとも別の?
- ハード不良でシリアルデータのとりこぼし
--> 一番可能性高そうなのですが、ループバックテストがPassしているので、違うような気がするんですよね。 - ハードの論理というより、USB-Serialのところで何かおかしいことが発生している(2byte転送になっているとか)
--> オシロ使ってみないとわからないので大変です。。何か別の内部モニタを使えれば観測可能そう?