新しい知識や概念に出会うことが面白い

 ここまで、導入課題の流れを書いてきました。

 導入課題は、やはり個人的に初めてのHDLコーディングということで戸惑いも多くありましたが、困難である半面、新しい知識や概念に出会うことも多く、一番わくわくする時でもありました。

 導入課題を通して僕が感じたのは、何回も述べたように、HDLの記述はS/Wのそれとは全然違うということです。命令記述と構造記述という違いもそうですが、それ以前のコーディングに際しても基本となる考え方が全く異なっている点が、僕には非常に面白く感じられました。

 例えばS/W言語では、できるだけシンプルに、美しいコードを書くことが求められます。これはメンテナンス性や可読性を上げることが良しとされているためです。コードは可能な限り小さな処理に分け、再利用性を高め、同じ内容を2度書くことがないようにします。コーディングの際は、どちらかと言えばトライ&エラーを頻繁に繰り返し、プログラムをブラッシュアップしていくような書き方になります。

 一方、H/W言語を書く場合、最も優先されるのはバグを出さない書き方をすること、そして実際の回路の構造(≠処理)に対して忠実に書くということです。複雑な回路であればあるほど論理合成には時間がかかりますし、また誤動作の原因特定も困難になるので、バグを出さないような書き方をすることはとても重要です。実機はS/Wと異なり、「何行目でエラーが起こりました」などということは教えてくれません。回路シミュレーターやロジックアナライザーを使って地道に調べるしかありませんし、調べるには莫大な時間がかかります。最悪の場合、講師の方にも原因が分からないので全部書き直す、なんてこともあります。

 バグを減らすための記述としては、実際に生成される回路の形に従い、“1つのレジスターにつき1つのAlways文を書く”というものが挙げられます。このように書いていけばコードは非常に冗長になり、慣れていない人には読みにくくなってしまいますが、逆に少ない記述量でシンプルに書こうとすると、合成される回路が非効率的になってしまい、タイミングエラーの原因になります。

 S/W言語的には美しいコードが、逆に無駄の多い回路論理を合成するコードであることは多々あります。S/W言語をずっと書いてきた身としては、自ら汚い(と感じるだけで、H/W言語的にはきれいな)コードを書くことに生理的嫌悪を感じる場合もあるのですが、こればかりは仕方ありませんし、「似ているけど違う」というのは、個人的に少し面白いとも感じます。

 課題の合間に講師の方から伺う話もかなり面白く、例えば先に述べた「昔はHDLがなくて、全部手で書いていた(ので甘えるな)」などというエピソードをプロフェッショナルから聞けるのは、OJT形式のCOJTならではだと感じます。僕にとってはH/Wに関する話はどれも新鮮で、その分野に詳しい講師やTAの方々と雑談するのも、COJTの密かな楽しみです。

 以上、HDLを書く学習課題のうち、「導入課題」について、僕が感じてきたことを交えながら紹介しました。H/W言語は、S/W言語を書いてきた人間にとっては面倒事も多いですが、新鮮で好奇心をくすぐられる言語でもあります。今回あまり紹介できなかった、実機(FPGAボード)上での動作にまつわる実装方法の違いも多くあります。S/W言語を書いているかたも、ぜひH/W言語を一度体験していただだくと、視野が大きく広がるのではないかと思います。