SystemVerilogの+演算子について

SystemVerilogでは(複数)ビットの加算を+演算子によって行う事ができる.
しかし,この+演算子が最終的にどのようなゲート表現となるのか,確認したことがなかったため,今回はその確認を行う.
また,加算器は全加算器(半加算器)を用いることでも作成することができる.よって,+演算子と自作の加算器の性能比較も行う.

 

加算器の自作

加算器は全加算器から成り,全加算器は半加算器2つとORゲートから成る.
そのため,最初に半加算器を作成する.今回はSystemVerilogで作成した.
 

module HA(input logic a,
			input logic b,
			output logic s,
			output logic cout);
	assign s=a^b;
	assign cout=a&b;
endmodule

 
半加算器2つとORゲートにより,全加算器を作成する.
 

module FA(input logic a,
			input logic b,
			input logic cin,
			output logic s,
			output logic cout);
	logic s1_a2,c1,c2;
	HA hf1(a,b,s1_a2,c1);
	HA hf2(s1_a2,cin,s,c2);
	assign cout=c1|c2;
endmodule

 
そして,全加算器を組み合わせることで複数ビットの加算器を作成する.
 

module ADDER1
	#(parameter length = 128)
	(input logic [length-1:0] a,
	input logic [length-1:0] b,
	output logic [length:0] out);
	logic [length-1:0] FA_sout;
	logic [length-1:0] FA_cout;
	genvar i;
	generate
		for(i = 0; i < length; i = i + 1) begin: genAddder
			FA fa(a[i],b[i],i==0?1'b0:FA_cout[i-1],FA_sout[i],FA_cout[i]);
			assign out[i]=FA_sout[i];
		end
		assign out[length]=FA_cout[length-1];
	endgenerate
endmodule

 

+演算子による加算器作成

加算器の自作が終わったため,次に+演算子を用いた加算器のモジュールを作成する.
 

module ADDER2
	#(parameter length = 128)
	(input logic [length-1:0] a,
	input logic [length-1:0] b,
	output logic [length:0] out);
	assign out=a+b;
endmodule

 

比較用モジュールの作成

作成した2つの加算器を比較するためのモジュールを作成する.
 

module ADDER_CMP
	#(parameter length = 128)
	(input logic [length-1:0] a,
	input logic [length-1:0] b,
	output logic [length:0] out1,
	output logic [length:0] out2);
	ADDER1 add1(a,b,out1);
	ADDER2 add2(a,b,out2);
endmodule

 

測定

ADDER_CMPの作成が終わったため,このモジュールに対応するシンボルを作成する(ADDER_CMP.svを開いた状態で[File]->[Create/Update]->[Create Symbol Files for Current File]).
次に回路図の記述を行う.回路図を作成([File]->[New]->[Block Diagram/Schematic File)し,ADDER_CMPのシンボルにinput/outputピンを接続する.
 

 
コンパイルを行い,成功したらテスト用の入力波形を作成する.
波形ファイルを新規作成([File]->[New]->[University Program VWF])し,適当な入力波形を作成する.
今回は160[ns]毎に乱数で生成したデータを使用する.
Timing Simulationを行った結果,以下のようになった.
 

 
out1,out2でハザードが発生していることがわかる.この部分を拡大すると
 

 
となるため,0.4[ns](=5.677-5.277)自作した加算器の方が遅延が大きいことが分かる.
 

ゲート表現の確認

実際に生成されたゲート表現は[Tools]->[Netlist Viewer]で確認することが可能となっている.
確認したところ,全加算器の表現が自作と+演算子で異なっており,これが遅延の差の原因であるとわかった.
 
自作
 
 
+演算子

F0

F1

 
 

結論

今回は半加算器から加算器を自作し,SystemVerilogの+演算子との比較を行った.
比較の結果,+演算子の方が遅延が少ないことがわかった.