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が開くのは、同じです。