[Verilog] リント大事だよ。

例えば、以下のコードがあったとします。
 1|module tb;
 2|  reg      r_a=0;
 3|  reg[1:0] r_b=0;
 4|
 5|  task task_(input a, output b);
 6|    begin
 7|      $display("--- Call Task input = %d ---", a);
 8|      b = 2;
 9|    end
10|
11|  endtask
12|
13|  initial begin
14|    task_(r_a, r_b); $display("--- Call Task output = %d", r_b);
15|  end
16|
17|endmodule

この記述を ModelSimでコンパイル&シミュレーションすると

vlog tb.v
Model Technology ModelSim ALTERA vlog 10.1d Compiler 2012.11 Nov  2 2012
-- Compiling module tb

Top level modules:
    tb
vsim -c -L work tb -do "run -all; quit"
Reading /home/kocha/tools/modelsim/13.0/modelsim_ase/tcl/vsim/pref.tcl 

# 10.1d

# vsim -L work -do {run -all; quit} -c tb 
# Loading work.tb
# run -all 
# --- Call Task input = 0 ---
# --- Call Task output = 0
#  quit 

となります。コンパイルは通るけど、シミュレーション結果としておかしいんですよね。
output = 0 なのは。


これで、Verilatorのリント機能を使うとどういう結果が出てくるかというと。

$> verilator --lint-only -Wall tb.v 
%Warning-WIDTH: tb.v:8: Operator ASSIGN expects 1 bits on the Assign RHS, but Assign RHS's CONST '?32?sh2' generates 32 or 2 bits.
%Warning-WIDTH: Use "/* verilator lint_off WIDTH */" and lint_on around source to disable this message.
%Error: tb.v:14: Unsupported: Function output argument 'b' requires 1 bits, but connection's VARREF 'r_b' generates 2 bits.
%Warning-WIDTH: tb.v:14: Operator TASKREF 'task_' expects 1 bits on the Function Argument, but Function Argument's VARREF 'r_b' generates 2 bits.
%Error: Exiting due to 1 error(s), 2 warning(s)
%Error: Command Failed /home/kocha/tools/verilator/bin/verilator_bin --lint-only -Wall tb.v

という感じで、注意してくれます。もうエラーなんですけどね。
わざわざリントチェックするのは面倒くさいと思う人も多いと思います。
そんな時には、Vimを・・・(おっと時間がきました。


[Vim] syntastic に Verilogが追加されます。

関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数