FC2カウンター FPGAの部屋 ISE11.4のXSTとModelSimの差異
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ISE11.4のXSTとModelSimの差異

今、VHDLコードを書いていて奇妙な現象に遭遇した。ModelSimのシミュレーションでは、問題なく動作しているように見受けられるが、実機が動作しなかった。なぜだろうとかなり調べていたら、XSTとModelSimの解釈が違っているところが見受けられるようだ。
まずは、ソースコードの一部を示す。

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

...

constant THRESHOLD_LEVEL : integer := 6; -- 符号化する数値の下限

attribute keep : string;
attribute keep of h_data_th : signal is "TRUE";
attribute keep of h_data_9bits : signal is "TRUE";
begin


...

    h_data_9bits <= ('0'&bram_rd_data) - ('0'&bram_data_1d);
    v_data_9bits <= ('0'&ydata_1d) - ('0'&bram_data_1d);
    d_data_9bits <= ('0'&cam_ydata_2d) - ('0'&bram_data_1d);

...

    -- スレッショルド処理を行ったh, v, d データ
    th_level_9bit <= CONV_STD_LOGIC_VECTOR(THRESHOLD_LEVEL, 9);
    -- th_level_9bit_mi <= not(th_level_9bit-1);
    th_level_9bit_mi <= not(th_level_9bit)+1;
    h_data_th<=(others => '0') when signed(h_data_9bits)>signed(th_level_9bit_mi) and signed(h_data_9bits)<signed(th_level_9bit) else h_data_9bits;
    v_data_th<=(others => '0') when signed(v_data_9bits)>signed(th_level_9bit_mi) and signed(v_data_9bits)<signed(th_level_9bit) else v_data_9bits;
    d_data_th<=(others => '0') when signed(d_data_9bits)>signed(th_level_9bit_mi) and signed(d_data_9bits)<signed(th_level_9bit) else d_data_9bits;


結局は、小さい値を0に丸める回路を生成しようとしている。その場合のth_level_9bit_mi が問題となった。上のVHDLコードでModelSimではエラーやウォーニングなしにコンパイルが通って、シミュレーションでも正しい値が出ていた。
ISE_vs_ModelSim_1_100104.png

(注:h_data_9bits とh_data_thに 注目すると、h_data_9bits の002 がh_data_th では000 に丸められている)
ISE11.4での結果がおかしいので、ChipScopeを入れて監視しようとすると、h_data_th をKeepしていたはずが、信号がなくなってh_data_th_mi だけになってしまった。(h_data_th_mi <= not (h_data_th-1);、ちなみにどちらも2の補数表示の同じ絶対値のマイナスの数を計算する式)
ChipScope Analyzer の結果を見ると、全く丸めていない。
ISE_vs_ModelSim_2_100104.png

おかしいので、XSTのレポートを見ると、データ幅がちがうというウォーニングが出ていた。

WARNING Xst:1610 - "C:/HDL/FndISEWork/DWM2008_07/CamDispCntrl_SRAM_MPWavelet_inv/Sources/Camera_Controller.vhd" line 876: Width mismatch. has a width of 9 bits but assigned expression is 10-bit wide.


9ビットの予定なのに10ビットだそうだ。おかしい?
上のVHDLコードの代わりにコメントアウトされている

th_level_9bit_mi <= not(th_level_9bit-1);


に変更したら、XSTのウォーニングもなくなって正常動作するようになった。ChipScope Analyzer の表示画面を示す。今度は、正常にh_data_th がプローブできた。
ISE_vs_ModelSim_3_100104.png

何がおかしいのか分からないが、XSTでは、少なくとも9ビットのデータをnot して、+1 するとビット幅が増えてしまうことがあるようだ。注意する必要がありそうだ。
  1. 2010年01月04日 15:13 |
  2. FPGAのトラブル
  3. | トラックバック:0
  4. | コメント:2

コメント

vhdl で、sim より合成でこけるとなると、
ちょっと興味深いケースかも。
not + 1 ってことは、2 の補数を計算していると
ちゃんと ? 解釈して、
負の最大値だけは bit 拡張しないと符号変換は無理よと、
御親切にも言ってくれているのでしょうか。。。
  1. 2010/01/04(月) 15:24:02 |
  2. URL |
  3. astray #VWFaYlLU
  4. [ 編集 ]

どっちにしてもぐるっと回るので、関係ないような気がしますが、演算をすると1ビット増えたとして、integerの場合は符号拡張してしまうんでしょうか?
いずれにしてもウォーニングは見た方が良いようです。
  1. 2010/01/04(月) 18:55:36 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/1345-3a2361af
この記事にトラックバックする(FC2ブログユーザー)