Verilog HDLを掘り下げる

こちらにあるのが「スイッチを押すたびに4bitのレジスタの値を1増やして、それをLEDで表示」というVerilog HDLのコード。

module Tiny(switch, led);
  input switch;
	output [3:0] led;
	reg [3:0] x;
 
	always @(posedge switch) begin
		x = x + 1;
	end
	assign led[3:0] = x;
endmodule

これをRTL Viewerで表示するとこのようになる。この図の時点では抽象度はあんまりかわらない。

これをTechnology Map Viewerで表示すると、かなり抽象度の違う図になる。

一部を拡大して、初期状態では非表示になっている箱の中身を一部表示させた。この箱(とそれに続くフリップフロップ)が物理的なロジックエレメント1個に対応する。

箱を選択すると、カルノー図などを見ることができる。先ほどの図ではANDやXORの組み合わせで表現されていたが、実体としては真偽値のテーブルであって、それを論理回路として表現したりカルノー図として表現したりしているわけだ。物理的なロジックエレメントにはRAMに書きこまれた真偽値のテーブルを読んで結果を返すLUT(Look Up Table)が含まれている。

この箱を選択した状態でResource Property Editorで表示するとロジックエレメントの中へとさらに掘り下げることができる。台形の記号は「マルチプレクサ」だ。ここで表示されているものは先ほどの図で赤線で囲われていた範囲だけではなく、その後につながっていたフリップフロップもセットになっている。

最初XORとANDを見て、半加算器だと早合点して、それでは配線が説明できずに悩んだ。自分が考えるのよりも、もっと頭のよい回路が出力されていた。要するに「1を足す」を実現するために加算器を作る必要はなくて、最下位ビットに関しては「最下位ビットを反転」で1を足したことになる。2番目のビットに関しては「最下位ビットが1なら反転」でよい。3番目のビットでは「最下位ビットと2番目のビットが1なら反転」でよい。そういう理由でANDとXORの組み合わせになっているわけだ。

今回の実験ではたまたまレジスタの幅を4bitにしていたため、一番上のビットでも4入力の論理回路で表現できた。もっと幅を増やした場合には「自分より下のビットがすべて1」を表現するために1つのロジックエレメントでは足りなくなってくるはず。その時にどんな回路が出力されるのかを調べてみるのも面白そう。