電気回路/HDL/ModelSim の radix define のバックアップ(No.1)

更新


公開メモ

ステートマシンのステートを記号で表示したい

ModelSim の wave ウィンドウでは、 刻々と変化する信号線の状態を、 2進数や16進数、アナロググラフなど、 さまざまな形式で表示することができます。

しかし、Verilog で書いたステートマシンのステートを、 分かりやすく記号で表示するのは一筋縄では行きません。

VHDL や SystemVerilog は enum が使えるので、 ステートを enum で記述すればシミュレーション時にそのまま読める形で表示されるのですが、 Verilog に enum は無いので、普通にやるとただの数値として表示されてしまいます。

こんなのを例として考えます。

module trimac_tx (
 ...
);
   ...

   localparam stIdle           = 0;
   localparam stMem            = 1;
   localparam stTx             = 2;
   localparam UdpChecksum0     = 3;
   localparam UdpChecksum1     = 4;
   localparam UdpChecksum2     = 5;
   localparam UdpChecksum3     = 6;
   localparam UdpChecksum4     = 7;
   localparam stDone           = 8;
   localparam stRewound        = 9;

   reg [3:0] state;
   always @(posedge tx_clk)
       if ( rst ) begin
           state <= stIdle;
       end else
       case (state)
       stIdle: 
           if (tx_start)
               state <= stMem;
   ...

この state を数値ではなく記号で表示する方法として、以下の2つの方法を見つけました。

色分けできることと処理が軽いことを考えると後者がお勧めです。

表示用の信号を別に用意する

http://cafeandverify.blogspot.com/2007/09/verilog-modeenum.html

にもあるように、テストベンチ側に表示用の信号を別に用意すれば、 かなり何でもできます。

以下のように、いくつかの状態を1つにまとめて表示するなど、 様々な応用を考えられます。

wire [8*6-1:0] trimac_tx_state =
   trimac.tx.state == 0 ? "Idle" :
   trimac.tx.state == 1 ? "Mem" :
   trimac.tx.state == 2 ? "Tx" :
   ( 3 <= trimac.tx.state && trimac.tx.state <= 7 ) ? "UdpChecksumX" :
   trimac.tx.state == 8 ? "Done" :
   trimac.tx.state == 9 ? "Rewound" : 
                          "???";

ModelSim ではテストベンチに SystemVerilog を使えるので、 enum 型に代入するだけでも行けそうです。

radix define を使う

ModelSim の radix define コマンドを使います。

ModelSim の Transcript ウィンドウに以下を打ち込むか、 あるいは *.udo ファイルに以下を記述して読み込むと、 wave の Radix 指定で TrimacTxStates を選択できるようになります。

    radix define TrimacTxStates {
        4'd0 "Idle",
        4'd1 "Mem",
        4'd2 "Tx",
        4'd3 "UdpChecksum0",
        4'd4 "UdpChecksum1",
        4'd5 "UdpChecksum2",
        4'd6 "UdpChecksum3",
        4'd7 "UdpChecksum4",
        4'd8 "Done",
        4'd9 "Rewound"
        -default decimal
    }

この方法の良いところは、記号で表示するだけでなく以下のように色も指定できるため、 文字が読めないほど縮小した場合にも、大まかな流れがよく分かります。

    radix define TrimacTxStates {
        0 "Idle" -color white,
        1 "Mem" -color yellow,
        2 "Tx" -color yellow,
        3 "UdpCrc0" -color yellow,
        4 "UdpCrc1" -color yellow,
        5 "UdpCrc2" -color yellow,
        6 "UdpCrc3" -color yellow,
        7 "UdpCrc4" -color yellow,
        8 "Done" -color yellow,
        9 "Rewound" -color red
        -default decimal
        -defaultcolor purple
    }

-default と -defaultcolor は、 本来あり得ない 10 以上の数が現れたときに適用されます。

コメント


Counter: 15081 (from 2010/06/03), today: 1, yesterday: 0