シミュレーション

Verilogを使ってみた

2011年7月2日

今の時代、デジタル回路を考える際、HDL (Hardware Description Language)を会得するのは必須のようらしい。FGPAなどの応用範囲もある。覚えておいて損はない、言語だろう。

VHDLとVerilogの両方を試してみたが、Verilogの方が自分には合っているようだ。

とりあえず、MacOSXで環境を構築してみた。次の2つのツールが必要。

Icarus Verilog
GTKwave

Verilogの入門としては、以下のサイトが参考になった。

新居良祐サポートページ - Verilog-HDL入門

MacOSXの場合、.bash_profileを編集して、
PATH=/Developer/Simulator/Icarus/bin:/Developer/Simulator/GTKwave/bin:$PATH
export PATH

のようにしておくことが必要。コンパイルは「iverilog -o xxx -s XXX xxx.v 」で、シミュレートは「vvp xxx」で、波形の表示は「gtkwave xxx.vcd」のようにして、すべてコンソールで扱う。GTKwaveでは、波形の表示の際、メニュー:「search」→「signal search tree」から、波形を表示させるシグナルを選択する必要がある。

D-FFも、Verilogでシミュレートできた。ソースコードは以下の通り。
module DFFTEST;

reg d,c;
wire q;

DFF bbb (d,c,q);

initial begin
	$dumpfile("dfftest.vcd");
	$dumpvars(0,DFFTEST);
	$monitor("%t; d=%b, c=%b, q=%b",$time,d,c,q);
	
		d=1;c=0;
	#10	d=1;c=1;
	#10	d=1;c=0;
	#10	d=0;c=0;
	#10	d=0;c=1;
	#10	d=0;c=0;
	#10	$finish;
end

endmodule

module DFF (D,C,Q);

input D, C;
output Q;

wire nc,nnc,o11,o12,o21,o22,o31,o32,o41,o42;

	assign nc=!C;
	assign nnc=!nc;
	assign o11=!(D&nc);
	assign o12=!(o11&nc);
	assign o21=!(o22&o11);
	assign o22=!(o21&o12);
	assign o31=!(o21&nnc);
	assign o32=!(o31&nnc);
	assign o41=!(o42&o31);
	assign o42=!(o41&o32);
	assign Q=o41;

endmodule

実行結果は、以下の通り。
VCD info: dumpfile dfftest.vcd opened for output.
                   0; d=1, c=0, q=x
                  10; d=1, c=1, q=1
                  20; d=1, c=0, q=1
                  30; d=0, c=0, q=1
                  40; d=0, c=1, q=0
                  50; d=0, c=0, q=0

FPGAなどで効率の良い回路を組むためには、もっと勉強しないといけないだろうけれど、自作マイコンのシミュレーターとして使うには、学ぶべき機能は一通りマスターしたように思う。とりあえずは、使ってみよう。プログラミングは習うより慣れろだ。これを使った方が、回路設計が大幅に効率よく進みそうな気がする。HDLとは逆の考え方をするLabViewっていったい何だったのだろう?

コメント

Katsumi (2011年7月2日 20:33:24)

Delayは、
assign #5 nc=!C;
のように。

コメント送信