FC2カウンター FPGAの部屋 ChipScope Analyzer でステートマシンのステートを表示する方法
FC2ブログ

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

FPGAの部屋

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

ChipScope Analyzer でステートマシンのステートを表示する方法

ChipScope Analyzer でステートマシンのステートを表示させると通常は16進数しか表示しない。私は通常VHDLでは、ステートマシンのステートをtype で列挙するだけで値を割り当てていない。それで、XSTのレポートファイル (***.syr) を見てステートを判断していた。それだととても面倒だ。VerilogでもOne Hotに値を指定していると、XSTでグレーコードに変更されたりするので、やはり、XSTのレポートファイル (***.syr) を見る必要がある。いちいち見ながらステートを判断するのは面倒なので、ChipScope Analyzer でステートマシンのステート名を表示する方法を試してみる。なお、参考にさせて頂いたのは、Xilinxのアンサー、”ChipScope Pro : Analyzer に FSM のステート名を表示させる方法”、”ChipScope Pro Software and Cores User Guide UG029 (v14.2) July 25, 2012”の55ページToken、そしてブログでは、徒然日記さんの”ChipScope™ Proの使い方 Lab. 5”を参考にさせて頂いた。

VHDLの場合
最初にVHDLのステートマシンのステート名を表示してみよう。まずは私の様にVHDLでtypeで宣言して、ステートの値を与えていない場合(たぶんステートの値を割り当てていてもXSTで変更されることがあるので、確認しておくことをお勧めする)は、XSTのレポートファイル(今回は、char_write_axi_master.syr)でステートマシンのステート値を確認する。まずは、VHDLの記述から下に示す。

type write_transaction_state is (idle_wr, awvalid_assert, data_write, bready_assert, wr_tran_end);
signal wrt_cs : write_transaction_state;


char_write_axi_master.syr には、こう記述されたていた。

Optimizing FSM <FSM_1> on signal <wrt_cs[1:3]> with user encoding.
----------------------------
 State          | Encoding
----------------------------
 idle_wr        | 000
 awvalid_assert | 001
 data_write     | 010
 bready_assert  | 011
 wr_tran_end    | 100
----------------------------


ここからToken ファイルを作成した。”ChipScope Pro Software and Cores User Guide UG029 (v14.2) July 25, 2012”の55ページToken の項を参照した。”@DEFAULT_TOKEN=ERROR”と記述しておくとデフォルトのステート値を定義できるようだ。つまりステートのリストにないステートということでERRORと記述しているようだ。下に、ChipScpe Analyzer 用 Token ファイル、wrt_cs.tok ファイルを示す。

#Optimizing FSM on signal with user encoding.

@DEFAULT_TOKEN=ERROR

idle_wr=000\b
awvalid_assert=001\b
data_write=010\b
bready_assert=011\b
wr_tran_end=100\b


なお、\b は2進数だが、\u の符号なし10進数、\h の16進数が使えるようだ。
ChipScope Analyzer の標準の表示を見てみる。なお、上にも書いてあるが、ステートマシンのステートの割り当ては、wrt_cs[1:3]なので、通常にバスにしているのだったら、逆順にしておく必要が有る。
下に、wrt_cs のChipScope Analyzer での16進数表示を示す。
ChipScopeA_sm_disp_1_121019.png

これに wrt_cs.tok ファイルを読みこませるには、wrt_cs_FSM_FFd の右クリックメニューから Bus Radix -> Token... を選択する。
ChipScopeA_sm_disp_2_121019.png

ダイアログが表示されるので、Select New File ボタンをクリックしてwrt_cs.tok を選択して、OKボタンをクリックする。
ChipScopeA_sm_disp_3_121019.png

すると、wrt_cs_FSM_FFd にステート値が表示された。
ChipScopeA_sm_disp_4_121019.png

ちなみに、wrt_cs_FSM_FFd3, 2, 1は通常ではバスになっていないので、バスにまとめてある。上図で、wrt_cs_FSM_FFd を展開してあるが、wrt_cs_FSM_FFd3, 2, 1 という順番になっているのがわかると思う。これは、XSTの論理合成の定義が、wrt_cs[1:3]となっているためである。wrt_cs_FSM_FFd1, 2, 3をバスにした当初は、通常 wrt_cs_FSM_FFd1, 2, 3の順番に並んでいるので、バス (wrt_cs_FSM_FFd) の右クリックメニューからReverse Bus Order をクリックしてバスの順序を逆にする必要がある。


Verilogの場合
Verilog で記述したステートマシンの定義を下に示す。

    parameter [2:0]    IDLE_MAIN =            3'b000,
                    CHAR_ROM_READ =        3'b001,
                    CHAR_ROM_VALID =    3'b011,
                    CONVERT_FORMAT =    3'b010,
                    NEXT_LINE_ST =        3'b110,
                    RASTER_VALID_WAIT =    3'b111,
                    RASTER_VALID_ST =    3'b101;
                    
    reg        [2:0]    mainsm_cs;


XSTで論理合成すると、グレーコードになってしまっていたので、今回はワンホットにせずにグレーコードで記述している。こう記述すると、XSTのレポートファイル(今回は、char_write_axi_master.syr)では、そのままのステート値になっていた。

Optimizing FSM <char_gen_8raster_i/FSM_2> on signal <mainsm_cs[1:3]> with user encoding.
-------------------
 State | Encoding
-------------------
 000   | 000
 001   | 001
 011   | 011
 110   | 110
 111   | 111
 010   | 010
 101   | 101
-------------------


これを元に、mainsm_cs.tok を記述した。

#Optimizing FSM on signal with user encoding.

@DEFAULT_TOKEN=ERROR

IDLE_MAIN=000\b
CHAR_ROM_READ=001\b
CHAR_ROM_VALID=011\b
CONVERT_FORMAT=010\b
NEXT_LINE_ST=110\b
RASTER_VALID_WAIT=111\b
RASTER_VALID_ST=101\b


なお、言うまでもないかもしれないが、”#”はコメントを表す。
この Token ファイルで、main_cs_FSM_FFd のステート値を表示させたのが、下の図になる。
ChipScopeA_sm_disp_5_121019.png

これで、ChipScope Analyzer でステーマシンのステート値を表示することが出来た。ちょっとステートを見れば良い時は、Token ファイルを作るのが面倒だが、しっかりステートマシンを解析したい時は便利だと思う。
  1. 2012年10月19日 04:06 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:4

コメント

> XSTで論理合成すると、グレーコードになってしまって

多分、私が昔嵌ったネタと同じかも。
デフォルトのままだと
FSM Encoding Algorithm = auto
なので、思った通りに最適化してくれます。
-- ワンホットをバイナリに変えられたりすると、
-- ff の後にデコード論理が付加されて、
-- 出力に glitch が乗るわけで (-_-;)...
FSM Encoding Algorithm = user
にしておけば、一応書いた通りになるよーです。
  1. 2012/10/19(金) 11:15:59 |
  2. URL |
  3. astray #VWFaYlLU
  4. [ 編集 ]

astray さん、こんにちは。教えて頂いて、ありがとうございました。
お察しの通りFSM Encoding Algorithm はAutoになっていました。とりあえず、Autoにしておいて様子を見てみます。グリッジが気になる出力のところはDFFで受けた上で出力しようと思います。それでもダメだったら(デコーダが大きくなって動作周波数を満たさないとか?)Userにしてみようと思います。

#コメントありがとうございました。コメント書いていただくと、とっても嬉しいです。
  1. 2012/10/19(金) 12:17:28 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

> グリッジが気になる出力のところはDFFで受けた上で

通常は、自動的にそうなるので問題ないのですが、
私が嵌ったケースでは、
tristate 制御周りで、タイミングがつらくて、
ワンホットの bit を直接出力してました。

それを形式的にバイナリにして、
その後にデコーダを付加してくれました。
出力用の ff を入れて、その前で一つ先の状態を
デコードするのが正しい最適化だと思うのですが、
そうなりません。
-- 手で書いたワンホットの方が better なのは自明。。。

fifo の制御信号なんかも要注意です。

> コメント書いていただくと、とっても嬉しいです

最近のネタは、私には高度過ぎて、突っ込みようもありません ^_^;
  1. 2012/10/19(金) 12:53:53 |
  2. URL |
  3. astray #-
  4. [ 編集 ]

>tristate 制御周りで、タイミングがつらくて、
>ワンホットの bit を直接出力してました。
確かに、そういうことはよくありますね。

>fifo の制御信号なんかも要注意です。
了解しました。肝に銘じておきます。

コメントありがとうございました。またよろしくお願いします。
  1. 2012/10/19(金) 18:18:37 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


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

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