베릴로그

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

IEEE 1364로 표준화된 Verilog(베릴로그)는 전자 회로 및 시스템에 사용되는 하드웨어 기술 언어로, 회로 설계, 검증, 구현 등 여러 용도로 사용할 수 있다.

C 언어와 비슷한 문법을 가져서 사용자들이 쉽게 접근할 수 있도록 만들어졌다. ‘if’나 ‘while’과 같은 제어 구조도 동일하며, 출력 루틴 및 연산자들도 거의 비슷하다. 다만 C 언어와 달리, 블록의 시작과 끝을 중괄호 기호를 사용하지 않고, 대신에 Begin과 End를 사용하여 구분하고, HDL의 특징인 시간에 대한 개념이 포함되었다는 것 등의 일반적인 프로그램과의 다른 점도 존재한다.

예제[편집]

hello world 프로그램은 아래와 같다.:

module main;
  initial
    begin
      $display("Hello world!");
      $finish;
    end
endmodule

다음은, 두 개의 플립플롭을 이용한 예제이다.:

module toplevel(clock,reset);
  input clock;
  input reset;
 
  reg flop1;
  reg flop2;
 
  always @ (posedge reset or posedge clock)
    if (reset)
      begin
        flop1 <= 0;
        flop2 <= 1;
      end
    else
      begin
        flop1 <= flop2;
        flop2 <= flop1;
      end
endmodule

베릴로그에서 할당 연산자 "<=" 는 일반적인 언어와는 다른 기능을 수행한다. 이것은 ‘논블로킹’(non-blocking)으로 불리며, 클럭(clock)이 발생할 때, 병렬로 동시에 실행된다는 것을 의미한다. 따라서 이 예제에서 flop1과 flop2는 다음의 ‘클록 주기’(clock cycle) 마다 동시에 서로 바뀌게 될 것이다.

또 다른 할당 연산자 "=" 는 ‘블로킹’(blocking)이라 불리며, ‘클럭’(clock)이 발생할 때, 순차적으로 대입되며 위의 할당이 아래의 할당에 영향을 순차적으로 주게 된다는 것을 의미한다. 만일 위 예에서, "<=" 이 "=" 로 바뀌어 진다면, flop1과 flop2는 서로 변경되지 않고 그 값을 유지하게 될 것이다.

다음은 카운터 예제이다.:

module Div20x (rst, clk, cet, cep, count, tc);
// TITLE 'Divide-by-20 Counter with enables'
// enable CEP is a clock enable only
// enable CET is a clock enable and
// enables the TC output
// a counter using the Verilog language
 
parameter size = 5;
parameter length = 20;
 
input rst; // These inputs/outputs represent
input clk; // connections to the module.
input cet;
input cep;
 
output [size-1:0] count;
output tc;
 
reg [size-1:0] count; // Signals assigned
                      // within an always
                      // (or initial)block
                      // must be of type reg
 
wire tc; // Other signals are of type wire
 
// The always statement below is a parallel
// execution statement that
// executes any time the signals
// rst or clk transition from low to high
 
always @ (posedge clk or posedge rst)
  if (rst) // This causes reset of the cntr
    count <= {size{1'b0}};
  else
  if (cet && cep) // Enables both  true
    begin
      if (count == length-1)
        count <= {size{1'b0}};
      else
        count <= count + 1'b1;
    end
 
// the value of tc is continuously assigned
// the value of the expression
assign tc = (cet && (count == length-1));
 
endmodule

다음은 지연(delay) 예제이다.:

...
reg a, b, c, d;
wire e;
...
always @(b or e)
  begin
    a = b & e;
    b = a | b;
    #5 c = b;
    d = #6 c ^ e;
  end

바깥 고리[편집]