Verlilog HDL 이론 2일차

JS·2023년 3월 9일
0

Verlilog HDL

목록 보기
2/6

산술 연산자

  • 피연산자의 비트에 x 나 z 가 포함된 경우, 전체 결과 값은 x

  • 나누기와 나머지 연산자에서 두 번째 피연산자가 0인 경우, 결과값은 x

  • 나머지 연산자의 결과 값은 첫번째 피연산자의 부호를 따름

  • 거듭제곱 연산자에서 다음의 경우에는 결과 값이 정의되지 않음
    -> 첫번째 피연산자가 0이고 두 번째 피연산자가 양수가 아닌 경우
    -> 첫번째 피연산자가 음수이고 두 번째 피연산자가 정수 값이 아닌 경우

    ex)

이동연산자

관계 연산자

  • 오퍼랜드의 비트가 x 혹은 z의 값을 포함하면 결과 값은 1 비트의 x
    -> X의 값이 모르는 값이기 때문
    -> X<=Z인 경우, 참인 것처럼 보이지만 X가 연산자에 포함되므로 결과값은 X가 나옴

  • 두 오퍼랜드의 비트 수가 다른 경우에는 비트 수가 작은 오퍼랜드의 MSB 쪽에 0이 채워져 비트 수가 큰 오퍼랜드에 맞추어 판단

  • 오퍼랜드 중 하나가 실수형이면 다른 오퍼랜드도 실수형으로 변환된 후 비교

등가 연산자

등가: 내용이 같으면 등가
동일: 형태가 같아야 동일

ex)

예제 1.6.4의 연산을 보면 등가와 동일의 차이점이 잘 보인다.
X와 Y의 형태는 같기 때문에 동일이지만 포함된 x의 값을 알 수 없기 때문에 내용이 다를 수 있기 때문에 등가라고는 할 수 없다

bitwise 연산자

  • and, or, not, xor와 같은 논리적 연산을 비트단위별로 수행
  • 오퍼랜드의 비트 수와 동일한 비트 수의 결과, 병렬합성
  • 연산자를 구현하는 하드웨어는 기본적인 논리 게이트

축소 연산자

  • 단일 오퍼랜드에 동작, 벡터 입력에 대하여 1비트의 결과
  • 입력수가 여러 개인 단일 게이트 합성

논리 연산자

  • true(1) 혹은 false(0)의 1비트 평가 결과
  • if, case 문 등의 조건식 판단에 주로 사용

결합 연산자

  • 스칼라 혹은 벡터의 구성요소를 결합하여 보다 큰 벡터 생성
    -> ex)
  • assign sha2 ={4{a[7]), a[7:4]};의 경우, a[7]을 4번 반복한 후, a[7:4]와 결합하라는 의미이다.

조건 연산자

  • 3개의 오퍼랜드, RHS의 값을 평가하여 좌측변수에 전달
    ?는 :를 사이에 두고 조건이 맞으면 :앞의 값을 틀리면 뒤의 값을 변수에 할당함
    -> ex)(a==1)?1:0 -> a가 1이면 1이면 a에 1을 대입하고 1이 아니면 0을 대입함
    -> Mux처럼 동작

코드 최적화

eq = (~i1 & ~i0) ? 1'b1;
	 (~i1 & i0) ? 1'b1;
     (i1 & ~i0) ? 1'b1;
     1'b1;
    
eq = i1^~i0;

위의 두 코드는 같은 기능이다.
코딩이 어렵다면 알고있는 것으로 우선 구현한 후, 추후에 필요성을 느끼면 최적화를 하자

연산자 우선순위

-> ex)

인스턴스

모듈 인스턴스
-> 이미 만들어진 것을 활용하여 구체화하는 것
-> 부품을 조립하는 것과 유사

포트 순서에 의한 연결

  • 모듈정의시 사용한 포트 목록의 순서와 동일하게 신호 연결
  • 연결하지 않아도 되는 포트는 두 개의 콤마 , , 사용
  • 포트 정의시 사용한 순서와 신호의 크기가 일치하도록 유의

포트 이름에 의한 연결

  • 포트 이름과 신호 이름을 같이 표현, 순서에 무관
  • 연결이 필요하지 않는 포트는 신호 이름을 빈칸 ( )으로 남겨둔다.

파라미터(parameter)를 포함한 인스턴스

  • 명시적 파라미터 재정의
  • 파라미터의 계층적 이름(hierarchical name)을 가진 defparam 문을 사용
  • 묵시적 파라미터 재정의
  • 모듈 사례화 시 #(value)의 형태로 사용.
  • 모듈 내에서 여러 개의 파라미터가 선언되었을 때는 파라미터의 선언 순서대
    로 값 지정
    -> ex)

    -> 이름에 의한 연결은 순서를 신경 쓸 필요 없다는 것이 가장 큰 장점이다.

프리미티브 게이트

  • Verilog에서 제공하는 프리미티브 게이트 사용

delay : 선택, 프리미티브를 통과할 때에 발생하는 전달지연 시간
-> 지연 값은 정수 혹은 실수 사용. 미정의시 default 값은 0(zero delay)

  • 프리미티브 인스턴스에서 인스턴스 이름(instance_name)은 선택사항
    -> 시뮬레이션에서 같은 프리미티브를 사용하였을 때 구분하기 위하여 인스턴스 이름을 사용할 수 있다.

  • 인스턴스 배열 범위(instance_array_range)는 선택사항
    -> 다중 프리미티브를 인스턴스할 때 각 인스턴스가 벡터의 분리된 비트로 사례

  • 인스턴스에서 신호연결은 순서에 의한 연결만 가능
  • user-defined-primitives도 여러 입력을 받고 출력은 1개

  • High Z는 회로가 Opne된 것처럼 동작

시스템 함수


Verilog를 지원하는 툴 환경에서 지원

  • 시스템 태스크와 함수는 $ 부호로 시작
  • 텍스트 출력이나 파형 디스플레이 등을 일반적으로 포함


-> ex)

컴파일러 지시어

컴파일러 지시어(compiler directive)는 Verilog HDL 모델의 해
석을 제어하기 위한 방법으로 제공

  • accent grave 문자 (`)로 시작
  • Verilog HDL 구문이 아니므로 문장 끝에 ;이 없다.
  • 모듈이나 Verilog의 소스 파일에 국한되지(bound) 않는다.
  • 컴파일러 지시어를 툴이 만날 때 그 지시어는 다른 지시어에 의하여 수정되거나 제거될 때까지 유효하게 살아 있다.


    -> 지정해주지 않으면 무슨 값이 나올자 알 수가 없다.

0개의 댓글