top.v : カウンターのテストコード。
/*
12bit Counter Test Module
Sat,04 Sep,2004 - Sun,05 Sep,2004
Copyright(C)2004 G-HAL
*/
`timescale 1ns/1ns // Unit timescale (実行単位/精度)
module top;
reg nRST;
reg clk;
wire [11:0] count_out;
counter count_1(nRST, clk, count_out);
parameter STEP = 10;
initial begin
// vcd 出力
$dumpfile("test.vcd");
$dumpvars(0, top);
// Initial
clk = 0;
nRST = 0;
#(STEP*2) nRST = 1;
#(STEP*100);
$stop; // Simulation を終了し、Simulator に戻る。
$finish; // Simulation を終了し、Simulator も終了する。
end
initial begin
forever
#STEP clk = ~clk;
end
always @(negedge clk) begin
$display( "Time=%d, count_out=%b, display(negedge clk)",$time, count_out);
end
always @(count_out) begin
$display( "Time=%d, count_out=%b, display(count_out)",$time, count_out);
end
initial $monitor($stime, "stime:%d, Time:%d, count_out:%b, monitor", $stime, $time, count_out);
// 第1引数が変化したら表示するらしい。
endmodule
counter.v : カウンター本体。
/*
12bit Counter
Sat,04 Sep,2004 - Sun,05 Sep,2004
Copyright(C)2004 G-HAL
*/
module counter(nRST,CLK,COUNT);
parameter SIZE=12;
input nRST;
input CLK;
output [SIZE-1:0] COUNT;
//synopsys sync_set_reset "nRST"
// ↑ xilinx のシンセサイザを使用している場合、
// この行を先頭の // も含めて付けると、
// 同期リセットに最適化を試みるらしい。
reg [SIZE-1:0] COUNT;
// output での名称と reg の名称が同じだと、
// レジスタ内容が直に出力される。
//always @(posedge CLK or negedge nRST) begin
// ↑ 非同期リセットの場合。
// xilinx のシンセサイザでは、これをやると、
// GCLRn を使用した最適化を試みるらしい。
always @(posedge CLK) begin
// ↑ 同期リセットの場合。
if (!nRST) begin
COUNT <= 0;
end else begin
COUNT <= COUNT + 1;
end
end
// assign COUT = COUNT;
// レジスタ内容を直に出力しているので、
// レジスタ内容を output に assign する必要が無い。
endmodule
// [ EoF ]
Makefile : 所謂 Makefile、GNU make 専用。
# VerilogHDL の為の Makefile
# (gnu make 依存)
# Copyright(C)2004 ghal
# 個別の環境設定
LIBDIR = .
SRCS = counter.v top.v
# 共通の環境設定
.SUFFIXES: .v .vvp .vcd .log
.PRECIOUS: %.v %.vvp
IVERILOG = iverilog
VVP = vvp
RM = rm
# 共通の処理設定
%.vvp:
$(IVERILOG) -o $@ -y $(LIBDIR) $^
.v.vvp:
$(IVERILOG) -o $@ -y $(LIBDIR) $<
.vvp.log:
echo "finish" | $(VVP) -l $@ $<
.vvp.vcd:
echo "finish" | $(VVP) $<
all::
clean::
-$(RM) -f *.bak
-$(RM) -f *.vvp
-$(RM) -f *.vcd
-$(RM) -f *.log
-$(RM) -f *.core
# 個別の処理設定
counter_test.vvp: $(SRCS)
counter_test.log: counter_test.vvp
# [ EoF ]
BSDmakefile : 所謂 Makefile、*BSD make 専用。
# VerilogHDL の為の Makefile
# (FreeBSD make 依存)
# Copyright(C)2004 ghal
# 個別の環境設定
LIBDIR = .
SRCS = counter.v top.v
# 共通の環境設定
.SUFFIXES: .v .vvp .vcd .log
.PRECIOUS: %.v %.vvp
IVERILOG = iverilog
VVP = vvp
RM = rm
# 共通の処理設定
.v.vvp:
$(IVERILOG) -o $@ -y $(LIBDIR) ${.ALLSRC}
.vvp.log:
echo "finish" | $(VVP) -l $@ $<
.vvp.vcd:
echo "finish" | $(VVP) $<
all::
clean::
-$(RM) -f *.bak
-$(RM) -f *.vvp
-$(RM) -f *.vcd
-$(RM) -f *.log
-$(RM) -f *.core
# 個別の処理設定
counter_test.vvp: $(SRCS)
$(IVERILOG) -o $@ -y $(LIBDIR) ${.ALLSRC}
counter_test.log: counter_test.vvp
# [ EoF ]