• 2023. 8. 19.

    by. 도 현

    반응형
    initial 구문

    initial문 내부의 모든 문장들이 initial 블록을 구성한다. initial 블록은 시간 0에서 시작하고, 시뮬레이션동안 한 번만 수행되고, 다시는 수행되지 않는다. 만약 여러 개의 initial 블록이 있으면, 각 블록은 시간 0에서 동시에 수행되고, 다른 블록과 상관없이 독립적으로 실행을 마친다. 여러 개의 행위 수준 문장은 반드시 키워드 begin과 end문을 사용해서 묶어야 한다. 만약 하나의 행위 수준 문장만 있다면 묶을 필요가 없다.

     

    always 구문

    always문 내부의 모든 행위 수준 문장으로 always 블록을 구성한다. always문은 시간 0에서 시작하고, always 블록 내의 문장을 루프 형식으로 연속되게 수행한다. 이 문장은 디지털 회로의 연속적으로 반복되는 활동의 블록을 모델링하기 위해 사용된다. 매 1/2주기마다 클럭 신호를 바꾸는 클럭 생성기 모듈을 예로 들어보면, 실제 회로에서 클럭 생성기는 시간 0부터 회로에 전원이 들어오는 한 계속 동작한다.

     

    event 제어

    event 제어는 다음과 같이 event가 발생할 때까지 처리를 지연시킨다.

    - #<정수식> : 정수값에 따라 지정된 시간만큼 처리가 지연된다.

    - @<event> : <event 식>에 의해 지정된 event가 발생할 때까지 처리를 지연시킨다.

     

    wait문

    wait문은 타이밍을 제어하는 문의 일종으로 @(이벤트 식)는 에지에서 동작하는 반면에 wait문은 레벨에서 동작한다.

    - wait(식) : 레벨에서 동작(식이 참이면 즉시 실행, 거짓이면 대기)

    - @(이벤트.식) : 에지에서 동작(이벤트가 발생할 때까지 대기)

     

    timig 제어

    타이밍 제어는 다음과 같이 처리를 지연시킬 수 있다.

    - #<정수식> : 정수값에 따라 지정된 시간만큼 처리가 지연됨.

    - @<event> : <event 식> 에 의해 지정된 event가 발생할 때까지 처리를 지연시킴.

     

    Register 변수형에 대한 대입문의 2가지 형태

    - 블록킹 대입문(=) : 블록킹 대입의 큰 특징은 "하나의 대입이 끝나고 나서, 다음 대입을 한다" 라는 것이다. 즉, 기술된 순서에 따라서 회로 동작이 다르기 때문에, 순차회로에서 사용하기가 적합하지 않다. 이와 같이 블록킹 대입을 사용할 경우는 순서에 따라서 결과가 다르게 되기 때문에 주의가 필요하다.

    -논블록킹 대입문(<=) : 논블록킹 대입은 always 문 블록내의 대입식에서 오른쪽 처리가 완전히 끝나고 나면, 일제히 왼쪽에 대입된다". 따라서 왼쪽의 처리가 결과를 임시로 레지스터에 기억하고 있어서, 왼쪽 전체가 처리가 끝나면 일괄적으로 원래 대입되는 레지스터로 대입되게 된다. 시프트 레지스터 설계에서 블록킹 대입과 논블록킹 대입의 차이를 확실히 구별할 수 있다.

     

    case문

    문장 형식은 다음과 같으며, 아이템(item) 항1~항N 다음과 블록문(begin ~ end)을 사용하면 여러 문장을 한 번에 처리할 수 있다. 항1~항N은 한번 사용한 것을 다시 사용할 수 없으며, 보통 상수를 사용하고, 판정식에 식 혹은 여러 식을 사용할 경우에는 콤마로 분리한다. 처리문에서 여러 문장을 처리하려면, 블록문으로 묶어야 한다. 판정식에서 판정 가능한 모든 값을 "항1~항N"에서 사용하지 않았을 경우에는 default문으로 사용하지 않은 항에 대해서, 처리를 하여야 한다.

     

    if-else문

    if문은 조건이 참(true)이면 if문 다음의 문장을 실행하고, 그렇지 않으면(거짓:false) else문 다음의 문장을 실행하는 조건문이다.

    - 네스티드(nested) if~else문 : 네스티드 if~else문의 형식은 없고, 단지 "if~else"문에서 "else"다음에 "if"문을 또 사용하는 것이다. 네스티드 if문은 5개를 넘지 않는 것이 하드웨어 구성상 좋다.

     

    루프(loop)

    Verlog HDL에는 4가지 형식의 루프문이 있다 while, for, repeat, 그리고 forever가 있다. 루프문은 C 프로그래밍 루프의 문법과 거의 유사하다. 모든 루프 문장은 initial 또는 always 블록 안에 위치한다. 루프는 지연 표현할 수 있다.

    - while 루프 : 루프는 키워드 while로 지정한다. while은 while-수식이 거짓이 될 때까지 수행한다. 만약 while-수식이 거짓이면, 루프는 전혀 수행되지 않는다. 만약 여러 개의 문장이 루프에서 수행된다면 키워드 begin과 end로 묶어야 한다.

    - for 루프 : 문장 형식은 다음과 같고, 블록(begin ~ end) 처리도 할 수 있다. "for" 루프문의 동작 흐름은 조건이 맞을 때까지 처리문을 반복해서 실행하게 된다. for문에서 사용하는 인덱스는 integer로 선언이 되어 있어야 한다. 상태 초기화와 for 루프에서 절차적 할당인 증가를 포함하고, 따로 분리해서 지정할 필요가 없다. 그러므로 for 루프는 while 루프에 비해 더 간단한 구조를 제공한다. 그러나 for 루프보다는 while 루프가 좀 더 일반적으로 쓰여 진다. 모든 상황에서 while 루프가 for 루프로 바뀔 수 있는 건은 아니다.

    - Repeat 루프 : repeat 구조는 정해진 횟수만큼 루프를 수행한다. repeat 구조는 일반적인 논리 수식의 루프에 쓰여 질 수 없다. 그런 상황에서는 while 루프가 사용된다. repeat 구조는 반드시 상수, 하나의 변수 또는 하나의 값이 될 수 있는 숫자를 포함해야 한다. 만약 숫자가 하나의 변수 또는 하나의 값 이하면 그것은 루프를 시작할 때만 계산되고, 루프를 수행 중 일 때는 계산할 수 없다.

    - forever 루프 : 어떤 수식도 포함하지 않고, $finish 태스크를 만날 때까지 계속 수행된다. 이 루프는 항상 참값을 갖는 while 루프와 동일하다.

    반응형