2013年1月5日土曜日

DFT IPの作成 15

前回、2048点毎のダンプ値と期待値を比較した結果109番目(ファイル名としては108)から不一致が発生していることが判った。 そこで今度は108 ~ 109間の2048点の演算結果について比較したところ、416番目から不一致になっていることが判った。


上図の221600.cmpがそれに該当する。(221600/2048 = 108, 221600%2048 =416)
不一致の内容を確認したところ、R側の値が不一致となっていた。以下では図示のために両者の先頭データを並べた。2行目が期待値、3行目がシミュレーション結果だ。


GTKWaveで当該箇所の波形を確認し、それを上流の信号へとたどってみたところ、xd、即ちxp-xp-Nの値に行き着いた。


xdはdft_dline.vというモジュールで計算しているのでその箇所の波形を確認した結果、漸く、不具合箇所が判明した。浮動小数演算器はまったく問題無かった。


不具合の原因はxp-xp-Nのオーバフローだった。これらの値は16bit整数であり、xp-xp-Nの結果は例えば、+32767 - -32768 = 65535となるように結果は17bitとしなければならなかったのに、16bitとしてしまっていた。何という愚かな間違いをしているのかと。→自分

当該箇所を修正し、シミュレーションを再実行し得られた全データについて期待値(Cモデルの出力)と比較したところすべて一致した。

数値演算処理回路を組む場合は、最初にしっかりしたリファレンスモデル(Cモデル)を作成すべきだった。また、不具合がある場合は、まず自分(が作った物)を徹底的に疑うという基本的な事を忘れていた。これは反省すべき点だ。でも、このところ、似たようなIPばかり作っていたので、たまには数値演算処理系のものに挑戦したい思っていたが、それが叶ったし良い勉強になった。ともあれ、不具合箇所を特定し修正できてよかった。


0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...