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