Verilog 란, Simulation 기반의 IC design language

필자가 정의하는 Verilog 는,
Simulation 기반의 IC design language 입니다.

공식적으로는, HDL ( hardware description language ) 이고,
verilog와 VHDL 이 IEEE standard로 되어 있습니다.

hardware와 language 라는 단어는 수긍이 가는데,
design 같은 단어가 아니고, 왜 description 일까요?

이유는, Verilog의 시작과 목표가 hardware simulation 이었기 때문입니다.

Verilog 역사를 살펴보면, 다음과 같습니다.
  • 1983년 Gateway Design Automation사, verilog 소개
  • 1985년 Verilog XL simulator 출시
  • 1990년 Cadence design system사, Gateway Design Automation사 인수
  • 1991년 Candence가 OVI(Open Verilog International)를 조직, verilog 공개
  • 1995년 IEEE 1364-1995 표준 제정
  • 2001년 IEEE 1364-2001 표준 제정
  • 2002년 IEEE 1364.1-2002 표준 제정
  • 2005년 IEEE 1364-2005 표준, SystemVerilog(IEEE 1800-2005) 확장
  • 2009년 IEEE 1800-2009 SystemVerilog revision
  • 2017년 IEEE 1800-2017 SystemVerilog revision

1983년, 모의시험용(simulation)용으로 소개/발표했고,
1985년에 Verilog XL simulator가 첫 출시 되었습니다.

시작이 simulation 입니다.

결국, Hardware Description Language는,

(존재하고 있는) hardware를 language(text)로 표현(기술)한다는 의미입니다.



1980년대는 그림과 기호로 hardware를 설계하던 때입니다.
computing power가 낮고 memory 비용이 비싸,
그림형태의 data를 처리하기 어려운 때이기도 하죠.

1byte, 1byte가 아깝던 그 시절에, 그림 data를 다루기는 매우 곤란하지요.
회로를 text 형태로 변환/처리 하는 시도가 당연한 겁니다.
더 이전이었다면, text가 아닌 2진 코드형식이 되었을 겁니다.

또한, verilog에는 modeling 이라는 용어가 있습니다.
컴퓨팅 환경에서 모델링은, 실제로 존재하는 사물을 data화 하는 것을 뜻합니다.
이역시, verilog가 simulation 임을 내포하고 있습니다.

물론, 모델링의 개념이 확장되어, 현실에 존재하지 않아도,
머리속에 상상한 것을 data화 하여, 그 실체를 만들어 갈 때에도
모델링 용어를 사용하게 됩니다.

즉, 현실에 존재하지 않아도, hardware를 표현할 방법이 마련된 것이고,
이를 바탕으로 hardware 설계에 응용이 가능하게 된 것입니다.

verilog language를 공부하거나, IEEE standard 문서를 볼때,
이해되지 않거나, 와 닿지 않는 용어들은, simulation의 시각에서 보고,
hardware 측면에서 이해해야 쉽습니다.

실제로, ieee1364-2005 standard 문서를 보면, simulation 이라는 단어는 350여회
나오지만 synthesis(compile,설계 회로 합성) 은 단 3회 나옵니다.
abstract(초록), introduction 에 2회, standard 문서의 license 범위, 주석에 1회.

즉, IEEE1364-2005의 standard 문서자체가 simulation을 설명하고 있습니다.

물론, verilog로 synthesis를 위한 표준도 존재합니다.



language 로서 특징은 알려진 대로, C language와 비슷합니다.
그렇지만, C 뿐만 아니라, 타 language의 영향도 받고, C 보다 발전된 부분도 있습니다.
1980년대는 많은 language들이 개발되던 시기이기도 했습니다.

일반적으로 얘기할때, Verilog는 ~2005 까지이며,
그 이후 SystemVerilog와 구분합니다.

verilog가 C language 에 해당한다면, SystemVerilog는 C++ 에 해당합니다.
C 의 문법을 C++에서 쓰듯이, SystemVerilog에서도 Verilog 문법을 사용할 수 있습니다.

하지만, SystemVerilog 고유의 문법을 사용하면, Verilog로 synthesis(compile)안됩니다.
또한, SystemVerilog 문법위주로 작성한 것은, Verilog로 downgrade 하기가 힘듭니다.
마치 C++의 class style을 C 로 바꾸는 것이 골 아픈 것과 비슷합니다.

결정적으로, SystemVerilog 의 language 로서 추상화 level 이 높기 때문에,
결과물(회로, hardware) 과 소스를 연동하여 직관적으로 알아보기 힘듭니다.

즉 , synthesis 된 hardware를 소스에 비추어 봤을때, 어느 부분이 어떤 소스,
어느 문장에 해당하는지 알아보기 힘들고, debugging 난이도가 올라가게 됩니다.

하위 호환문제도 있어서, 사용을 주저하는 경우도 꽤 되는 것 같습니다.

가끔, verilog의 특징으로 객체지향(OOP)를 얘기하시는 분이 계신데,
SystemVerilog에 국한해서 그렇다고 볼수 있습니다.

Verilog가 Instantiation, instance 라는 용어를 사용하기는 하지만,
그것은, (소스)코드 가 실체를 가진 hardware로 구현되고,
또한 hardware의 parallel한 특성으로 인해, 같은 소스코드라고 하더라도
가져와 쓸 때마다, 별개의 실체를 가진 hardware가 다수 만들어기 때문입니다.

실체를 가진 object 이기 때문이지, OOP의 개념을 가진 것은 아닙니다.



Verilog에서, Modeling은 hardware를 표현하는 방법을 말합니다.
단순히 말해서, (hardware의) 코딩 이라고 이해하셔도 됩니다.

특히, 코딩한 것 중 실제 hardware 에 해당하는 부분을 뭐라고 하는가?
RTL(Register Transfer Level) 이라고 합니다.

또한, 구어적으로 실제 synthesis(compile) 된 결과물을 지칭하기도 합니다.
이 RTL은 워낙 구어적으로 쓰여서, 개발자에 따라 조금씩 의미가 다르긴 하지만,
전부 실제 hardware라는 공통점을 가지고 있습니다.

즉, hardware/회로화 되는 source code 부분이나 영역, 실제 synthesis 된 결과물등
simulation 관련부분이나 군더더기를 제외한, 실제 hardware부분이 RTL 입니다.

Verilog는 문법 자체는 쉽습니다. 그러나, 진정한 용법과 의미를 알기는 힘듭니다.
hardware 를 알아야 하고, 기계와의 대화 를 할줄 알아야 하고, language 도 알아야 합니다.

현업의 verilog개발자들도, 사용은 하되, 그 의미는 정확히 모르는 경우도 많습니다.
필자 역시, 그랬습니다. 이렇게 해야 되고, 저렇게 하면 안되고....
되고 안되고는 아는데, 왜 그런지는 설명은 못하고 감으로만 아는 것이지요.

누구나 다 아는 대기업 강사분들도 의미를 몰라서 제대로 설명을 못하더군요
심지어 필수로 알려줘야 할 async, strobe 차이점, race, array inout, X 조건,
sensitivity list, non-blocking....

배우는 입장에서는 모르겠지만, 아는 입장에서 보면, 참 그렇더군요.
알려줘야 할 필수 지식과 정보가 별로 없는데, 대체 무슨 정보전달인지?

앞으로 verilog language 에 대해, 조금씩 올리도록 하겠습니다.

댓글 쓰기

0 댓글