
대부분의 프로그래밍 언어는 기본 단위가 있어 그 단위로 알고리즘이 논리 정연하게 구획되어 있다. C언어의 기본 단위는 함수, Java의 경우 기본 단위는 객체인데, Verilog에도 함수는 있으나 더 근본적인 module이라는 단위가 있다. Verilog가 HDL(Hardware Description Language)인 고로, 이 module은 AND 게이트, 계수기(Counters), 중앙처리장치(CPU), 혹은 컴퓨터 전체, 혹은 컴퓨터 네트워크 등 물리적인 대상들을 의미한다.
다음은 계수기의 예제이다.
module counter;
integer R;
initial
for (R=1; R <= 10; R = R + 1)
$display ("R= %d", R);
endmodule
위의 계수기는 정수 1부터 10까지 하나씩 세면서 각 숫자를 화면에 출력한다. $display 함수가 화면에 출력하는 함수인데, $가 달린 것을 보니 왠지 PHP문법 비슷한 것 같다. 그런데 매개변수 항을 보면 C의 printf() 문법과 동일해 보임을 알 수 있다. - 다음의 $display의 EBNF를 살펴보면 알 수 있듯이 이는 우연이 아닌 완전 동일한 것이다.
dlsplay_statement ::= $display; I $display ( <arguments> );
write_statement ::= $write; I $write ( <arguments> );
arguments ::= <argument> | <argument>, <arguments>
argument ::= "<string>" I <expression>
\n New line Quotation
\t Tabulator
\\ Character\
\"
%% mark Character %
%h, %H Hexadecimal number
%d, %D Decimal number
%o, %O Octal number
%b, %B Binary number
%f, %F Real number
%c Single character
%s Character string
%t Time
%m Present module name
그럼 이제 Verilog 프로그램과 module에 대한 EBNF를 살펴보고 마치도록 한다.
VERILOG program ::= <module> I <VERILOG_program> <module>
module ::= module <name_of_module> <list of ports>;
<module item>
endmodule
name_of_module ::= <identifier>
list of ports ::= I ( <port_list> )
port_list ::= <identifier> I <port_list> , <port_list>
module_item ::= <parameter_declaration> I <input_declaration>
I <output declaration> | <inout declaration>
I <reg_declaration> I <integer_declaration> | <wire_declaration>
I <event_declaration> I <gate_instantiation>
I <module_instantiation> | <always_statement>
| <initial_statement> | <continuous_assign> I <function>
I <task> I <module_item> <module item>
module_instantiation ::= <type_of_module>
<name_of_instance> ( <module arguments> );