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

更新

[[公開メモ]]

* ステートマシンのステートを記号で表示したい [#sd720719]

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つの方法を見つけました。

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

* 表示用の信号を別に用意する [#kb177b67]

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 を使う [#k00e70a5]

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 以上の数が現れたときに適用されます。

* コメント [#zc826d8f]

#comment_kcaptcha

Counter: 15059 (from 2010/06/03), today: 1, yesterday: 2