Chiusakpung's Electronics Blog

블로그 이미지
Computer programming ...
by 치우삭풍
  • Total hit
  • Today hit
  • Yesterday hit

'verilog'에 해당되는 글 4건

  1. 2009.05.31
    [3] parameter, defparam
  2. 2009.04.03
    [2] module, Verilog Programming의 기본 단위.
  3. 2009.04.03
    [1] 문법 이해를 위한 EBNF 형식에 관하여. 1
  4. 2009.04.03
    Introduction to Verilog
c 프로그램에서는 다음과 같이 Call by value를 통해 함수로 인자(paramter)를 넘겨줄 수 있습니다.

int factorial(int n = 0) {
  if (n == 0 || n == 1) return 1;
  else return n * factorial(n - 1);
}

int main() {
    int n = 10;
    factorial(n);

    n = 5;
    factorial(n);

    return 0;
}

위 프로그램을 베릴로그로 작성할 경우 다음과 같이 바꿔주면 되는데...
1) factorial이라는 모듈(함수)의 호출인자 n을 parameter라는 명령어로 정의해줍니다.
2) main이라는 모듈(함수)에서 factorial을 호출하기 위해 defparam라는 명령어로 factorial1.n = 5, factorial2.n = 10으로 
정의합니다.
3) 끝으로, factorial 모듈을 호출할 경우 factorial factorial1.n ();
으로 값을 넘겨줍니다.

1~3을 정리하면, 왼쪽의 c 문법이 오른쪽의 verilog 문법으로 바뀌는 것이지요


int factorial(int n = 0)     ->     module factorial; paramter n = 0;
factorial(10)                  ->     defparam param.n = 10;    factorial param.n ();
int n = 5;                      ->      defparam ex.n = 5;
factorial(n);                  ->      factorial ex ();

(예제)

module counter;

parameter Max = 0;

integer R;

 

initial

        for (R=l; R <= Max; R = R + 1)

               $display ("R= %d", R)

endmodule

 

module main_module;

defparam  COUNTER1.Max = 5,

          COUNTER2.Max = 10;

 

counter COUNTER1 ();

counter COUNTER2 ();

endmodule

덧붙여 설명하면 parameter는 함수의 호출인자들의 꾸러미라고 볼 수 있습니다. defparam은 호출전에 그 꾸러미의 내용이 무엇인지 값들을 할당해 주는 것이고요.

즉, 마지막에 counter COUNTER1 (); 과 같이 호출을 하게 되면, counter모듈은 그 뒤의 COUNTER1라는 꾸러미를 풀어서 그 안의 parameter 값들을 조사합니다. COUNTER1에 Max라는 이름이 5라는 값으로 배정되어 있네요. 따라서 counter는 Max = 5로 초기화한 뒤 원래의 계수 알고리즘을 수행합니다.

cf) parameter와 defparam의 EBNF는 다음과 같습니다.

parameter_declaratLon         ::= parameter <range> <list_of_assignments>;

range                         ::= | [<expression> : <expression>]

list_of_assignments           ::= <parameter_assignment>

                              | <parameter_assignment> , <list_of_assignments>

parameter_assignment          ::= <lvalue> = <expression>

AND

대부분의 프로그래밍 언어는 기본 단위가 있어 그 단위로 알고리즘이 논리 정연하게 구획되어 있다. 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> );

AND
첫번째 글은 다소 원론적인 이야기.

프로그래밍언어도 자연어와 마찬가지로 문법이라는게 있고, 이 문법에 따라 해당 프로그래밍 언어로 쓰여진 코드는 컴파일러나 인터프리터를 통해 기계어로 번역된다. 이 문법은 두 번역기에서 이미 구현되어 있으므로, 0과 1 밖에 모르는 컴퓨터도 알아듣는 매우 논리정연한 문법 구조임을 알 수 있다. 즉, 프로그래밍 언어는 자연어 보다 훨씬 엄격한 문법체계를 갖고 있다.

이런 언어 구조를 말끔히 기술하는 방법 중 EBNF(Extended Backus-Naur Form)란 것이 있다. 이 방법을 통해 한 문법(혹은 신택스, Syntax)을 '형식'으로만 재귀적으로 정의해 나갈 수 있다.

EBNF의 기본적으로 낱말의 '정의Definition', '대체Alternative', '나열Sequence','재귀Recursion'로 문법의 형식을 기술한다.
'정의'는 기본이 되는 단일 낱말이 어떤 문자, 어떤 형식을 갖는지 '::=' 를 이용해 정의하는 것을 말한다. 예를들면 다음의 '정의'는 EBNF를 통해 digit라는 낱말을 기술 한다.

     digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 

'|'는 OR을 의미한다. 따라서 위는 "digit라는 말은 0, 1, 2 ... 9 의 10개의 숫자 중 하나를 의미한다"를 함축한 문장이다.

다음은 '재귀'를 이용한 '정의'이다. 수는 임의의 숫자들이 임의의 개수개 모인 집합으로 볼 수 있다. 따라서 다음과 같은 number는 숫자 하나이거나, 혹은 둘 이상의 수인 셈이다.

     number ::= <digit> | <digit><number>

단순히 number ::= <digit><number> 만으로 정의할 경우 종결 조건이 없어 number는 무한대 길이의 숫자가 됨을 유의하자.

'재귀'를 이용해 number를 '정의'하는 문제를 계속 생각해보면 사실 EBNF가 유일하지 않다는 것을 알 수 있다. 다음과 같이 정의해도 상관 없으니 말이다.

     number ::= <digit> | <number><number>

그럼 한번 위의 두 EBNF 문장을 비교해 보자. 12는 첫번째 정의로는 <digit><number> -> 1<number> -> 1 <digit> = 12가 되며, 두번째 정의로는 <number><number> -> <digit><digit> = 12가 된다.

(여기서 통사론Syntax과 의미론Semantics 얘기가 나온다. 언어학 전공자가 아니므로 간단히만 알고 넘어가면 통사론은 언어의 형식만을, 의미론은 언어내 내포된 뜻을 논한다.) 

참- 쉽죠?



음... 생각해보니 -_-; 영어보다 프로그래밍언어를 먼저 배웠네 그려. 그래서인지 영어 공부에 꽤나 도움이 되었는데 말이지. ㅋㅋ

어쨌거나 마지막 예제는 Verilog for문의 EBNF.

for_loop        ::= FOR <variable>:=<number> TO <number> <stepsize> DO

                       <statement>;

Variable        ::= <variable> <variable> I <digit> I a I b I c I d I e I f I g I h
                    I i I j I k 
| l I m I n I o I p I q I r I s I t I u I v I w I x 
                    I y I z I A I B I C I D 
I E I F I G I H I I I J I K I L I M I N
                    I O I P I Q I R I S I T I U I V I W 
I X I Y I Z

stepsize        ::= I STEP <number>

참고로 stepsize의 경우 선택사항임을 눈치가 빠른 사람은 알 수 있다. ( | 앞에 아무것도 없다. )

언제 다 이렇게 이해하나하는 생각이 들겠다. 사실 대세인 C계열(혹은 ALGOL 계열)문법만 익혀도 코딩하거나 다른 사람의 코드를 이해하는데 지장 없기 때문이다. 하지만 새로 접하는 프로그래밍 언어에 대해서도 유연한 통찰력을 얻기 위해서는 이런 기초도 익혀둘 필요가 있다고 본다.

자 이제 EBNF에 대한 대략적인 것을 알았으니 다음 부턴 실제 코드로부터 배우고, 간간히 EBNF를 통해 문법을 익히도록 하자.

AND

Verilog란 언어는 Hardware Description Language로 하드웨어를 Implementation하기 위한 언어이다. 문법은 C와 거의 비슷하며, 흔히 디지털 회로를 설계하기 위해 사용된다.

-_-... 그리고 악명 높은 우리학교 전자과 실험1, 2, 3 중 2번째 시리즈, 3학년 2학기 내내 마주쳐야 할 놈이라는 것.

그래도 다행히 이번에 알게 되어 이렇게 문법 공부한 자료를 올려보도록 한다. 화이팅!

참고문헌 : Introduction to Verilog, Chapter11, U.Golze
AND

ARTICLE CATEGORY

전체 (126)
EECS (56)
Physics (5)
Misc. (60)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

ARCHIVE