VHDLとVerilog(1)

VHDLとVerilog(1)

 デジタル回路を設計するにあたり、今はHDL(エッチデーエル)で記述するのが当たり前となっています。当然、ANDやOR、DFFを素子で買ってきてデジタル回路を設計する事は可能ではありますが、かなり面倒な作業になるでしょう。

 ここではHDLである2つの開発言語について述べますが、結論を先に書いておくと、好きな方を使えばよいです。

 HDLはHardware Description Languageの略で、日本語訳はハードウェア記述言語とされています。HDLには(2020年)2種類あります。それがVHDL(ブイエッチデーエル)とVerilog(ベリログ)です。私が初めてHDLに触れたのはABEL(エーベル)でした。ABELは現在残っていません。ソフトウェアの言語にも衰退がありますが、HDLも同様にこの先何が主流になるのかはわかりません。したがって、一つの言語にこだわる事なく、広く時代の流れに乗りながら学習するしかありません。

 VHDLとVerilogのどちらが優越という事がないので、好きな方を使えば良いのですが、これも会社の決まりや顧客からの要望などがあり、自分で決められない場面もあります。

 そしてVHDLやVerilogを扱うと、シミュレートができるようになります。このシミュレートがかなり強力で、プロのデジタル回路設計現場でも欠かせないツールです。

 もし、これからHDLを学ぶし、会社の決まりもないので、どっちかを選ぶ必要があるとすれば、Verilogでスタートする事をお勧めしていますが、これはかなり個人的な趣味レベルの選択です。

 理由はVerilogにはwireとregという区別があるからです。もちろん、VHDLも同じ事ができますが、明確に言語で記述できるのがVerilogです。

 なぜ、wireとregを区別することにこだわるのかといえば、この2つを区別して設計する習慣をつけてほしいからです。

 ここでwireとregの説明が必要です。

 このような回路図があります。この時に、赤丸で記した信号に名前をつける事ができます。今は、wire_a,wire_b,wire_c,wire_dとつけました。実際のHDLでは読んで意味のある名前をつけるべきです。

 たとえば、wire_aはブール代数で次のように書けます。
   wire_a = not select
 select信号の反転をとった信号ですね。

同じ様にwire_b〜wire_dまで書いてみましょう。
 wire_b = input1 and select
 wire_c = input2 and wire_a
 wire_d = wire_b or wire_c ….. (1)

このように回路の好きな所で区切る事ができます。これをwire(ワイヤー)といいます。ワイヤー=線 の意味ですね。この区切る所は設計者が意味を持たせる事の方が多いです。

 好きな所で区切る事ができますから、wire_a〜wire_cなんてくどいだけなので、削除してwire_dだけにしましょう。次のようになります。

 wire_d = (input1 and select) or (input2 and (not select)) ……(2)

 本当にwireはどのように区切っても良いので、好きにしましょう。(1)と(2)のwire_dに注目してください。(1)のように細かく分割して書いても良いし、(2)のように一発で書いても良いのです。これは設計者の自由ですが、私はいつも半年後の自分にわかるように。という気持ちで区切りを決めています。 

 次にreg(レジスタまたはレジ)ですが、これはDFFを作る宣言です。このregがVHDLでは宣言できません。もちろん、VHDLもDFFの機能を作れます。作れますが、明確に宣言できないので、VHDLのソースコードを良く読まなくてはDFFなのかどうかはわからないのです。

 デジタル回路設計はAND,OR,NOT,ExOR,DFFで設計します。なので、この4つを明確にする習慣をつけましょう。

 私はVHDLで書く時に、wireとregの区別ができないので、マイルールでwireには 名前の前にwをつける。regには名前の前にrをつける。としています。

 上の回路図をVHDLで書く時には

signal wwire_a std_logic;
signal rreg_a std_logic;

 というように書くようにしています。そうすれば、wwire_aはワイヤーでrreg_aはレジスタだとわかります。逆にどっちもsignalで宣言されていますので、wireかregなのかは宣言だけでは不明です。VHDLの構文を読めばわかりますが、半年後、数年後に自分でソースコードを読み返した時のために、なるべく多くの情報を残しておくようにするのが良いエンジニアだと思っています。

 最後によく初心者はどっちを学べば良いのですか? という質問がありますが、私の経験ではいずれどっちも使います。なので、どっちが先でも良いと思います。ただし、wireとregの区別はきちんとする習慣をつけましょう。