「なるべく同系統の信号は一つのalways文にまとめて記述するのが良い」という話を各所の複数の人から聞いたことがある。自分は(かなり)過去、Verilog外部研修で、always文はなるべく分けて書くように習った経験があり、なるべく束ねる説に対し、それはちがうよ・と指摘していた。簡単にいうと、束ねるのは記述漏れや考慮漏れの原因になるから。ところが、最近また別の方々の書いたRTLを見たところ、極力一つのalwaysにまとまるように書かれていた。結構ベテランと思われる方々。多分、このプロジェクトにはじめの方からかかわっている人がそのような書き方をしたため、他のかたもそれに習ったのだろうとおもわれるが。さて、どちらが正しいのだろう。自信が無くなってきたのでちょっと調べてみた。 結論としては、なるべく分けるが正解と思う。
某スタイルガイドによれば、次のようにある。Point ①組み合わせ回路のalways文について、ラッチを生成する危険をさける ②回路構造を意識したalways文記述を行う ③1つのalways文の中で複数の出力信号を定義することは避ける何れも「束ねるのは記述漏れや考慮漏れの原因になるから」というもの。
①について
always内のif文に複数の出力を並べて書く際は、すべての条件(if/else if/else)にすべての出力を書きましょうということ。
RTLの意識があまりなく、ソフトウェア的な発想で記述される方にありがちな気がする。if (...) a=X,b=Y; else if (...) a=Z; else if (...) b=W;のような書き方はやめましょうということ。
組み合わせ回路において、一つのalways文中に記載しているにもかかわらず、その条件文を目的とする出力のみをその条件文に記述し、目的としない出力は記述しない・というスタイル。このような回路は、「記述されていない=状態保持」を意味するので、「不要な条件が来たら状態をラッチする」という指示になっている。これにより、機能的には意図通りに動くとしても、無駄な回路が生成される可能性が生じ、タイミング要件が厳しくなったり、非活性の回路生成によりカバレッジ率を低下させる原因となる。
②について
回路イメージの単位を意識するように・ということ。意図するところは、回路の見通しを良くするべき・ということ。それにより、合成後の回路の予測性が向上し、合成後の回路のタイミング要件を満たしやすくなる。見通しがよく、デバッグ効率が向上するというメリットが得られる。具体的には、出力(F/Fなり組み合わせ出力なり)を束ねるためにalways文のセンシティビティリストと制御信号(if文の条件に)無駄な信号を入れないこと。回路Aと回路B、・・・を一つのalways文で書こうとしたとき、回路A用の制御信号、回路B用の制御信号、・・・をすべての回路に当てはまるように追加することになる。これは冗長回路を生成する可能性、記述ミスの可能性、回路イメージをつかみにくくする原因となる。わかりやすくするために束ねたいのだろうが、かえって人にもツールにもわかりにくいものとなるのを避けましょう・ということ。
③について
一つのalways文に、「if~end」,「if~end」,「A=XYZ;」のような記述、されにはこれら何れかの出力が何れかの入力になるような記述を入れ込まないようにしましょう・ということ。意図することろは、不要なプライオリティ回路が生成される可能性を避ける、回路の見通しを良くする・ということ。always文は上から順序処理されるので、always文内の記述順によりプライオリティが生じる。これにより、下位にかかれた回路のイネーブル条件として上位の回路が使われる可能性がある。また、これらの出力をブロッキング記述にしている場合、上から順に実行される(プライオリティが形成される)ことを意味し、それぞれに出力と入力の関係を持たせる場合、記述順が逆にならないよう考慮する必要がある。また、ある出力が、より上位に記述された回路の入力となる場合、上位の回路が活性化しない危険がある。さらには活性化させるためにセンシティビティリストに出力を追加した場合、alwaysがループする危険がある。自由な書きやすい記述スタイル(?)だが、RTLレベルを意識する必要があるということ。
0 件のコメント:
コメントを投稿