シリアルの怪奇現象を追っている話

先日、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]

あとがき

というわけで、現在も原因がわからない怪奇現象が発生したというお話でした。

見つかるか心配ですが、これが実機の醍醐味なんだ、と慰めながら現在も原因を調査中です。

以下のいずれかとは思うのですが、どれなのでしょうか。。それとも別の?

  1. ハード不良でシリアルデータのとりこぼし
    --> 一番可能性高そうなのですが、ループバックテストがPassしているので、違うような気がするんですよね。
  2. ハードの論理というより、USB-Serialのところで何かおかしいことが発生している(2byte転送になっているとか)
    --> オシロ使ってみないとわからないので大変です。。何か別の内部モニタを使えれば観測可能そう?