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