베리로그

From Hidden Wiki
Jump to navigation Jump to search

파일:external/asic.co.in/fsm_3.gif --$display("hello world!");-- --hello world!-- 전자 회로 및 시스템에 쓰이는 하드웨어 기술 언어이다. 당연하지만 베릴로그 HDL이라고도 부를 수 있으나, 이 경우 VHDL과 헷갈리기 때문에 베릴로그라고만 부른다. 회로 설계, 검증, 구현 등 여러 용도로 사용된다.

Ada기반인 VHDL과 달리 C언어와 비슷한 문법을 가진 것이 특징이다. 'if'나 'for', 'while' 같은 제어 구조도 동일하며, 출력 루틴 및 연산자들도 거의 비슷한 것 등 사용자들이 쉽게 접근할 수 있다. 다만, case문의 형태와 블록의 시작과 끝을 중괄호 대신 Begin과 End를 사용하는 것은 Pascal언어와 유사하다.

HDL이 일반 프로그래밍 언어와 크게 다른 점은 시간, 클럭으로 대표되는 이벤트, 아주 작은 프로세스 개념이며, 각각 #, @, fork/join 등의 키워드로 지원한다.

다음과 같이 10의 주기를 가지는 클럭을 만들 수 있다. {{{ initial clk = 0; always #5 clk = ~clk; }}}

8비트 카운터 예 {{{ reg [7:0] cnt; reg resetn;

initial begin

   resetn = 1'b0;
   #10
   resetn = 1'b1;

end

always @(posedge clk or negedge resetn)

   if(!resetn) cnt <= 8'b0;
   else cnt <= cnt+1;

}}}

본래는 Phil Moorby가 모의시험용 언어로 개발하였다. 이후 Cadence Systems에 인수되어 업계표준 HDL로 자리를 잡았다. 이후 95년 IEEE표준이 만들어졌고, 2001년 변경이 있었다(Verilog-2001이라 부름). 그러나 디지털 시스템의 설계에서 검증의 필요성이 커짐에 따라 이를 지원하기 위해 대대적인 확장이 필요하게 되었다. 이를 위해 2005년 SystemVerilog가 IEEE 표준으로 만들어 졌다.

그러나 SystemVerilog는 검증용 테스트벤치 작성시 외엔 실제 업계에서는 잘 쓰이지 않는데,[* VHDL은 사실상 사장되었다.] C에서 쓰이는 enum, class, struct, union등의 data type은 실제 하드웨어 합성시 결과물로 나오게 될 netlist[* 쉽게 말해서 gate-level]를 직관적으로 예측하기 어렵게 하고 툴 간에 문법 해석 차이가 있는 경우 netlist 기반의 시뮬레이션을 토대로 RTL[* 물론 이 경우 SystemVerilog 소스코드에 해당] 디버깅을 하기 상당히 까다로워진다. 물론 Verilog의 wire, reg data type도 소스코드에 선언된 그대로 wire와 register로 합성되는 것은 아니지만 SystemVerilog의 추상화에 비하면 사실상 하드웨어에 매우 가까운 편이라 소스코드에 존재하는 버그를 찾더라도 netlist를 직접 고치는 것이 가능할 정도.

또한 Verilog에서는 for, while의 루프문을 지원하지만 테스트벤치 작성을 위한 경우 말고는 사용을 지양하는 것이 좋다. Verilog는 일반적인 프로그래밍 언어와는 다르게 하드웨어 수준의 구조를 코드로 작성하는 것이기 때문에 루프문의 오용은 하드웨어의 합성 과정에서 문제를 일으킬 가능성이 높다. 루프문 내부에서의 각 루프가 서로 영향을 받지 않는 경우에 한해서만 사용하는 것이 좋다.


분류:프로그래밍 언어