모듈의 정의는 항상 키워드 module로 시작한다.
모듈 정의의 처음에는 모듈 이름, 포트 리스트, 포트 선언, 선택적으로 파라미터가 온다.
endmodule문은 반드시 모듈 정의의 마지막에 와야 한다.
module SR_latch(Q,Qbar,Sbar,Rbar);
output Q,Qbar;
input Sbar, Rbar;
nand n1(Q,Sbar,Qbar);
nand n2(Qbar,Rbar,Q);
endmodule
module top;
wire q,qbar;
reg set,reset;
SR_latch m1(q,qbar,~set,~reset);
initial
begin
$monitor($time, "set = %b, reset=%b, q=%b\n",set,reset,q);
set = 0; reset = 0;
#5 reset = 1;
#5 reset = 0;
#5 reset = 1;
end
endmodule
포트는 모듈이 외부 환경과 소통할 수 있는 인터페이스임.
포트 리스트의 모든 포트는 모듈 안에서 선언되어야 한다.
Verilog에서 모든 포트 선언은 wire로 선언된다.
그러나 만약, output포트가 값을 유지해야한다면, 반드시 reg로 선언되어야 한다.
module DFF(q,d,clk,reset);
output q;
reg q;
input d,clk,reset;
.......
endmodule
module TOP;
reg[3:0]a,b;
reg c_in;
wire [3:0] sum;
wire c_out;
fulladd4 fa_ordered(sum,c_out,a,b,c_in);
endmodule
module fulladd4(sum, c_out, a, b, c_in);
output [3:0]sum;
output c_cout;
input [3:0]a,b;
input c_in;
endmodule
verilog는 위치 대신 포트 이름에 의해 외부 신호를 연결할 수 있다.
fulladd4 fa_byname(.c_out(c_out),.sum(SUM),.b(b),.c_in(c_in),.a(a));