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の+演算子との比較を行った.
比較の結果,+演算子の方が遅延が少ないことがわかった.