3.15 lint機能
lint機能とは、文法エラーにはならないけれども、記述上、推奨されない、バグの温床になりやすい箇所の指摘をする機能です。Veritakでは、Version1.19より、実験的にビット幅に関する機能を実装してみました。Verilogのビット幅は、言語仕様で自動拡張するので、多くのシミュレータでは、なにも言いません。VHDLユーザからするとコンパイル時に指摘される(エラーになる)ので違和感があるようです。また、LSIの合成ツールではやはり、文句を言うようです。このOptionをOnにすると、(ASIC屋さんに出す前に)、記述の段階で分かるので役に立つかもしれません。
Veritakは、以下のとき、Warning:Lintをコンパイル時に出力します。
NET系(WIREでのアサイン)とEXPR系のアサイン(BA(=)とNBA(<=))について、LHSとRHSのピン数(ビット幅)が異なるときに(Verilog言語仕様によるビット幅拡張の前に)Warning:Lint ..を出力します。
NET系とEXPR系のBinary表現でのコンペア(==、>=、<=,>、<、===、!==,!=)でビット幅が異なるときに(Verilog言語仕様によるビット幅拡張の前に)Warning:Lint ..を出力します。
NET系とEXPR系でのTernary表現(3項演算)で、True/Falseのビット幅が異なるときに(Verilog言語仕様によるビット幅拡張の前に)Warning:Lint ..を出力します
なお、Both定数(Ex.if(3'b000==4'b0000))等は、Warnig:Lintを出力しません。評価に行く前に、コンパイラの最適化フェーズで、if項が消えてしまう為です。
Lint機能をOnにするには、
Project OptionでLint機能Onとして、Reloadまたは、SaveProject後にLoadします。

サンプルソースは以下です。全ステートメントでWarning:Lintが出力される珍しいソースです。
module lint_test;
reg [3:0] a;
reg [2:0] b;
reg r;
wire [3:0] aw=1;
wire c= (a<b);
wire d= (a==b);
wire e= (a>b);
wire f= (a==b);
wire g= (a<=b);
wire h= (a>=b);
wire o= (a===b);
wire p= (a!=b);
wire q= (a!==b);
wire z=1 ? a: b;
initial begin
if (a<b);
if (a==b);
if (a>b);
if (a==b);
if (a<=b);
if (a>=b);
if (a===b);
if (a!=b);
if (a!==b);
a=1;
a<=1;
r= 1 ? a :b;
r<=1? a:b;
end
endmodule
|
出力はコンパイルステータス画面です。同じWarningが2回以上出力されることがありますが、異常ではありません。

::の行をクリックすることで、当該箇所をVeripadが開くのは、同じです。