3.HDLを書く為の前提条件

最低限、フリップフロップやラッチ、メモリというハードウェア回路の基礎知識は必要だと思います。セットアップ、ホールドタイムという概念を理解していることも必要でしょう。

HDLを書くまえに、システム設計や、仕様書、ブロックダイアグラム、ステートダイアグラム作成等の前準備も当然必要です。

書くにあたっての最も重要なことは、今書いているのが、

を明確に意識することだと思います。

組み合わせ回路は、記憶のない、入力が決まれば、出力は一意に決まるCで言えば関数のような回路です。

順序回路は、記憶素子が含まれる回路です。入力が決まっても過去の状態(ステート)が影響して出力は一意に決まりません。
フリップフロップや、ラッチが含まれれば、それらは1ビットの記憶素子なので順序回路になります。
 
論理合成では、一般には、組み合わせ回路の論理合成だけやってくれます。順序回路は一般には出力しません。HDLは、Register Transfer Languageです。Register間の情報の伝達は、人間がHDLにより指示してやらなければなりません。それが、当初のHDLという言語の目標であり、HDLを書くということです。このことはSystemVerilogになってもほとんど変わりません。SystemCが、一段高い抽象度をターゲットとして開発されている点がVerilogと明確な対比を示しています。あくまでHDLの主軸は、RTLを人間が書くということです。

従ってよいHDLを書くためには、基本的なハードウェアの知識が必要になります。
HDLの当初の目標の一つにハードウェアの抽象化というがあると思いますが、最新のSystemVerilogでは、構文で

が追加されており、抽象化とは逆行している部分も見受けられます。これは、HDLの書き方で、意図しない回路(ケアレスミスを含む)が論理合成されてしまうことの反省だと思います。HDLの構文としては間違いなくても、存在しない、あるいは合成不能なハードウェアを記述してもしかたありません。組み合わせ回路なのか、順序回路なのかという意識が最新のHDL言語でも重要であるという良い例になっていると思います。

ソフトウェアエンジニアの観点からいうと、Cを知っていれば、構文が似ているのでとっつきやすいというメリットはあります。VHDLは、ADAという言語をバックグランドに持っています。ADAは、クラッシュしにくいという特徴をもつ言語ですが、知っている人は日本ではあまりいないでしょうね。