Verilogをはじめよう! その3
前回はすべての論理回路はANDとORとNOTに還元できて、それがびっくりするくらい間違いだったという所まででした。
今回はHDLで回路を記述するメリットについて、いい加減に説明してみます。
独断と偏見でHDLで書く回路を分けると、制御系と演算系に分かれます。C言語でいうところの、業務系とか組み込み系とかそんな感じです。多分。
制御系というのは、DDRメモリにリード/ライトしたり、LEDをつけたり、ロジックを超えて何かを制御する人たちです。制御系の回路というのは、外部との嫌な部分を隠して演算系の回路とデータをやりとりするが仕事です。LSIの内部でも、クロックツリーを設計する人や、無茶早い乗算器を作っているような人は、ここに入ると思います。デジタル回路と呼んではいますが、他の部分がちゃんとデジタルで動くように何とかしている人たちです。Intel様は神様で絶対に逆らえません。JEDECとか下手に規格団体作って資料が分かれるより、全てIntel様で情報を管理して欲しいです。でも資料は探しやすくお願いします。制御系の回路は、完全に電子工作の延長上なので今回は特に話しません。
制御系と違うところに位置するのが演算系の回路です。ちなみにこの分け方は私しか使っていないので、特に学生の方は鵜呑みにしないようにお願いします。演算系というのは、入ってきたデータに何か演算をして、どこかに出すこと。CPUの創りかたによると、データの転送こそがCPUの動きなので、まさにCPUを設計しているようなそんな楽しい回路です。デジカメの中ではほにゃららフィルターで画像処理をしたり、電気の知識よりは数学的な知識が必要な所です。
HDLも他の言語と同じく、論理演算と算術演算があり、だいたい同じように動きます。他の言語との決定的な違いは、任意のビット幅で自由に並列演算ができる点です。重要なのでもう一度書きます。
・HDLを使うと、任意のビット幅で、自由に並列演算ができる。
これこそが、HDLをはじめる最大の理由です。
実際に並列に演算をしているHDLを見てみましょう。
reg [3:0] output_a, output_b;
reg [9:0] output_c;
reg [12:0] output_d;
always @ (posedge clk) begin
output_a <= input_a + input_b;
output_b <= input_a + input_c;
output_c <= input_b + input_c;
output_d <= input_d + input_c;
end
こういうVerilogは、こんな感じに合成されます。
予想通り、加算器が4つ作られています。
ここの説明はちゃんとしようとすると難しいのですが、上のように記述すると全ての加算機は同時に動きます。threadやfiberといった見かけ上同時に動くモデルではなく、本当に4つ同時に動きます。昨今のCPUは、命令の並列性を高めるために涙ぐましい努力をしているわけですが、HDLで並列に演算をするのはこんな簡単に実現できます。実際、プロセッサのパイプライン、スーパースカラー、アウトオブオーダー、レジスタリネーミング等の涙ぐましい努力は全てはHDLで記述できます。裏は取っていませんが、大半のCPUはこういった動作をHDLで記述して作られているはずです。私が知っているだけでも、身近にあるプロセッサのうち、最低4つは全てHDLで書かれています。
ちなみにRTL ViewerがXilinxからAlteraに変わりましたが、深い意味はありません。片方だけ押すと、EDSFで襲われるとかそんな物騒な業界ではないので安心してください。
並列性ともう一つの特徴である、任意のビット幅という点は上の絵をもう一度よく見てください。台形の形をしたものが加算機なのですが、上から12bit、10bit、10bit、4bitになっているのがわかるでしょうか。
reg [3:0] output_a, output_b;
の部分はC言語の配列の宣言に似ていますが、こう書くことで4bitのレジスタが作られます。一番下の加算機は、代入先output_aが4bitなので、4bitの加算器が作られています。当然、reg[99:0]とすれば100bitのレジスタが作られ、そこに+の演算子を書けば100bitの加算器が作られます。プロセッサを使った演算が、プロセッサが想定しているビット幅を超えると複数の命令が必要になることを考えると、HDLを使うメリットも良く分かるのではないでしょうか。
細かいところですが、HDLのレジスタは好きに順番の入れ替えや分解ができます。
{input_d[5:0], input_c[3:0]}
こう書けば、上位6bitがinput_d、下位4bitがinput_cな10bitなレジスタが作れます。
{input_a[0], input_b[0], input_a[1], input_b[1], input_a[2], input_b[2], input_a[3], input_b[3] }
こう書くと、input_aとinput_bのLSBとMSBを入れ替え、交互に配置しして一つの8bitレジスタを作ります。ハッカーのたのしみの中の人から見れば泣いて喜びそうですが、彼らはHDLの世界でもそれなりに無茶な演算を思いつく事でしょう。基本的にはMです。
この技術を駆使すれば、特定の演算に特化したすごいハードが作れるのはずなのですが、なかなか現実は難しいです。実際演算能力のみでハードウェア化している例は非常に少ないです。ハードウェア化する大半が、物理的な小型化や、バッテリ駆動のため、あるいはコントローラと一体化してリアルタイム性の確保/CPUの負荷を減らすとかそんなのです。あと、セキュリティとか。
並列化のみを見た場合、10個程度の中途半端な並列化ではGHzで動くIntel様プロセッサに歯が立ちません。10000個といったスケールで並列化できているなら、これもパソコンを並べた方が良いでしょう。前門のIntel様、後門のGoogleです。ただでさえニッチなところですが、今後もどんどんニッチになっていくと思います。
そんな状態でも、我こそは!と思われる方は、是非ハードウェアの業界に来てください。
まとめ:×Intel、○Intel様
The comments to this entry are closed.
Comments