Top > Verilator > Lintチェック
<<調査中>>
verilatorは、verilog記述に対して適切な記述かどうかを確認するリント機能があります。
変換を行わずリントのみを行う場合は以下のように実行します。
検証のために以下の記述はよく使うのですが、うまく変換されません。
ワーニング回避のため、
/* verilator lint_off UNOPT */
/* verilator lint_off UNOPTFLAT */
/* verilator lint_off STMTDLY */
を付けてみたのですが、だめでした。
何か方法があるのだろうか。
<<調査中>>
- Lint方法
- Lint一覧
- BLKANDNBLK
- 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
- VARHIDDEN -
- WIDTH
- WIDTHCONCAT -
- Verilatorで変換できない記述
- メモ
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が指定できます。
ブロッキングとノンブロッキング代入が混在している場合。
- ワーニングを出力する例
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
F/F記述のregに対してノンブロッキング代入(<=)ではなくブロッキング代入(=)を使った場合ワーニングを出力します。
オプションで-Wallが必要。
明示的に許可する場合は、/* verilator lint_off BLKSEQ */を付けてください。
オプションで-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 */を付けてください。
使われていない信号があるときに表示されます。
有効にするには、-Wallを付けます。
ソースコードごと無視する場合は、
/* verilator lint_off 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 */
を付けます。
assign文の左辺と右辺でビット幅が異なる場合ワーニングを出力します。
明示的に許可する場合は、/* verilator lint_off WIDTH */を付けてください。
次の場合は、ワーニングを出しません。
- ワーニングを出力する例
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オーバーフローする
- 次の記述は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
検証のために以下の記述はよく使うのですが、うまく変換されません。
reg clk; initial begin clk = 'b0; forever #5 clk = ~clk; // <= verilatorは#遅延が使えないので変換不可 end
ワーニング回避のため、
/* verilator lint_off UNOPT */
/* verilator lint_off UNOPTFLAT */
/* verilator lint_off STMTDLY */
を付けてみたのですが、だめでした。
何か方法があるのだろうか。
タグ
最新コメント