ハードウェア設計に関する情報をまとめるサイト。

Top > Verilator > Lintチェック

<<調査中>>



Lint方法


verilatorは、verilog記述に対して適切な記述かどうかを確認するリント機能があります。
変換を行わずリントのみを行う場合は以下のように実行します。

% verilator --lint-only [top_level.v]
  • すべてのLint(推奨)
% verilator --lint-only -Wall [top_level.v]
オプション-Wallを付けなくても論理合成は通るかもしれませんが、ミスを避けるならば一度すべてのLintをチェックしたほうがよいかもしれません。
  • Verilogのバージョンを指定
verilator --lint-only --language 1364-1995 [top_level.v]
1364-1995、1364-2001、1364-2005、1800-2005が指定できます。

Lint一覧

BLKANDNBLK

ブロッキングとノンブロッキング代入が混在している場合。
  • ワーニングを出力する例
input        clk;
input        rst_n;
input  [7:0] din;
output [7:0] dout;
reg    [7:0] dout;

  always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
      dout <= 8'd0;
    end 
    else begin
      dout = din;               // Warning、ノンブロッキング代入(<=)ではないため
    end 
  end 

BLKSEQ

F/F記述のregに対してノンブロッキング代入(<=)ではなくブロッキング代入(=)を使った場合ワーニングを出力します。
オプションで-Wallが必要。
  • ワーニングを出力する例
input        clk;
input        rst_n;
input  [7:0] din;
output [7:0] dout;
reg    [7:0] dout;

  always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
      dout = 8'd0;              // Warning、ノンブロッキング代入(<=)ではないため
    end 
    else begin
      dout = din;               // Warning、ノンブロッキング代入(<=)ではないため
    end 
  end 
%Warning-BLKSEQ: Blocking assignments (=) in sequential (flop or latch) block; suggest delayed assignments (<=).


明示的に許可する場合は、/* verilator lint_off BLKSEQ */を付けてください。


CASEINCOMPLETE -

CASEOVERLAP -

CASEX -

CASEWITHX -

CDCRSTLOGIC -

CMPCONST -

COMBDLY

DECLFILENAME -

DEFPARAM -

GENCLK -

IFDEPTH

IMPERFECTSCH -

IMPLICIT -

IMPURE -

INCABSPATH -

LITENDIAN -

MODDUP -

MULTIDRIVEN -

MULTITOP -

REDEFMACRO -

STMTDLY -

SYMRSVDWORD -

SYNCASYNCNET -

TASKNSVAR -

UNDRIVEN -

UNOPT -

UNOPTFLAT -

UNSIGNED -


UNUSED

使われていない信号があるときに表示されます。
有効にするには、-Wallを付けます。
  • ワーニングを出力する例
module (
 in1,
 in2,
 in3,。
 out1,
 out2
);
input [7:0] in1;
input [7:0] in2;      // <= Warning、この信号が使われていない。
input [11:0] in3;     // <= Warning、この信号の[11:8]のビットが接続されていない
output [7:0] out1;
output [7:0] out2;

  assign out1 = in1;
  assign out2 = in2[7:0];

endmodule

ソースコードごと無視する場合は、
/* verilator lint_off UNUSED */
を付けます。

VARHIDDEN -

WIDTH

assign文の左辺と右辺でビット幅が異なる場合ワーニングを出力します。
  • ワーニングを出力する例
 wire [6:0] a;
 wire [7:0] b;

 assign b = a;  // Warning、左辺8ビットに対して右辺7ビットを代入している
%Warning-WIDTH: Operator ASSIGNW expects 8 bits on the Assign RHS, but Assign RHS's VARREF 'a' generates 7 bits.


明示的に許可する場合は、/* verilator lint_off WIDTH */を付けてください。

次の場合は、ワーニングを出しません。
 wire [7:0] a,b;
 wire [7:0] c;
 assign c = a + b;  // 上位1bitオーバーフローする

WIDTHCONCAT -


Verilatorで変換できない記述

#遅延付きブロッキング代入

  • 次の記述はSyntaxエラーとなります。
input        clk;
input        rst_n;
input  [7:0] din;
output [7:0] dout;
reg    [7:0] dout;

  always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
      dout <= #1 8'd0;    // Syntax Error
    end 
    else begin
      dout <= #1 din;
    end 
  end 

#遅延を使ったSim用クロックジェネレータ


検証のために以下の記述はよく使うのですが、うまく変換されません。
  reg clk;

  initial begin
    clk = 'b0;
    forever #5 clk = ~clk;    // <= verilatorは#遅延が使えないので変換不可
  end

ワーニング回避のため、
/* verilator lint_off UNOPT */
/* verilator lint_off UNOPTFLAT */
/* verilator lint_off STMTDLY */
を付けてみたのですが、だめでした。
何か方法があるのだろうか。

メモ

  • -Wall で未接続 net が検出できるらしい(3.810)

管理人/副管理人のみ編集できます