verilog向けコードメトリクス算出機能をリリース
pyverilog_toolboxにverilog向けコードメトリクス算出機能をリリースしました。
モジュール/ファンクション/レジスタレベルで全インスタンスについてメトリクスを算出し、それぞれのメトリクスの合計スコアと上位メンバを表示します。スコアが大きいほど複雑なやつです。。
使い方
例によってテストコードで。
コマンドプロンプト上で
(Pyverilog_toolboxをインストールしたディレクトリ)/verify_tool
に移動し、
$ Python metrics_calculator.py ../testcode/metrics_func.v
と入力します。適宜、.vファイルは測定対象に変更してください。
出力は
module metrics
total: 19
average: 19
each score:
TOP: 19
Number of input ports: 4
Number of output ports: 0
Number of registers: 1
Number of clocks: 1
Number of resets: 1
register metrics
total: 1
average: 1
each score:
('TOP', 0): 1
Number of branch: 0
Max nest: 1
function metrics
total: 9
average: 9
each score:
('TOP.md_always0.al_block0.al_functioncall0', 0): 9
Number of branch: 1
Max nest: 2
Number of variables: 2
てなような感じでプロファイルが出てきます。
モジュール/レジスタ/ファンクションが複数ある場合は上位から表示されます。
沢山あると大変なので、表示数上限を設定しており、設定ファイルにより上限を変更することができます。(設定ファイル記述法の詳細はgithubにて)
メトリクス判断基準の詳細
モジュールレベル
・input portの数
・output portの数
・regの数
・clkの種類(=非同期ドメイン数)
・rstの種類
デフォルトではただレジスタが増えるよりもポートの増加に対して厳しい判定をします。
(ポートが多い=疎結合の原則に反する。)
またクロックドメインの数によっても大きく上昇するので、非同期ドメインが存在するモジュールはなるべく小さく作りスコアを抑えるべき、ということになります。
レジスタレベル
・条件分岐(if,else if, else)の数
・ネストの数
デフォルトでは条件分岐が増える以上にネストの数に厳しいです。どんな言語でも過剰なネストは悪だと思うので。
ファンクションレベル
・条件分岐(if,else if, else)の数
・ネストの数
・読み込み変数の数
こちらもデフォルトでは条件分岐が増える以上にネストの数に厳しいです。
また、変数が多いと読み込み順を誤りやすくなるなど、
可読性が下がると推定します。
考え中のことと活用法
メトリクスの指標としてよく使われる行数カウントは現在のところ未実装です。
実装がめんどくさかった、というのと、
数えりゃいーじゃん、というのと、
verilogの行数はregの数×if文の分岐数で大体決まってくるので、
そこまで重要ではないかなと。要望があれば足すかもしれません。
また正直パラメータは適当です。私の感覚で決めました。
納得いかん!という型は設定ファイルによって書き換えることが出来ます。
詳細はgithubにて。
またスコアが高いとか低いとか絶対値それ自体には大きな意味はありません。
機能の大きさに伴ってスコアが増えるのは当たり前ですし、
ポートがない空のモジュールを作ればそれがスコアゼロで最高のVerilogコードと言うことになってしまいます。
むしろリファクタリング前と後でどれだけ減ったかとか、
あるいは他のモジュール/レジスタと比べて突出して複雑なものがあるから、
リファクタリングしたほうがよいサインなのかもという風に、
相対値に着目したほうが有意義かと思います。
また、pyverilog_toolboxに実装されているcodeclone_finder(同一レジスタの発見器)や、
unreferenced_finder(未使用変数の発見器)を使ってメトリクススコアを減らすのもよいでしょう。
追伸:
そういえばpyverilogのissueにsympyによる論理最適化なんてのが追加されております。熱い。
メトリクス測定→スコア高い奴をオートでリファクタリング→メトリクス現象なんてできたらワクワクですなあ。
他のissuesも気になります。pyverilogの更なる進化に期待。