{{위키데이터 속성 추적}}
{{Infobox programming language
| name = 베릴로그<br />Verilog
| logo = 
| logo caption = 
| screenshot = 
| screenshot caption = 
| file ext = .v, [[헤더 파일|.vh]]
| paradigm = [[구조적 프로그래밍|구조적]]
| released = {{시작 날짜|1984}}
| designer = 
| developer = 
| discontinued = [[SystemVerilog]]에 병합
| latest release version = IEEE 1364-2005
| latest release date = {{시작 날짜와 나이|df=yes|2005|11|9}}
| latest preview version = 
| latest preview date = <!-- {{시작 날짜와 나이|YYYY|MM|DD}} -->
| typing = [[자료형 체계|Static]], [[Weak typing|weak]]
| implementations = 
| dialects = [[Verilog-AMS]]
| influenced by = [[파스칼]], [[에이다]], [[C (프로그래밍 언어)|C]], [[포트란]]
| influenced = [[SystemVerilog]]
| programming language = 
| platform = 
| operating system = 
| license = 
| website = 
| wikibooks = Programmable Logic/Verilog
}}
IEEE 1364로 표준화된 '''베릴로그'''(Verilog)는 전자 회로 및 시스템에 사용되는 [[하드웨어 기술 언어]]로, 회로 설계, 검증, 구현 등 여러 용도로 사용할 수 있다.

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

== 예제 ==
[[hello world 프로그램]]은 아래와 같다.:
<syntaxhighlight lang="verilog">
module main;
  initial
    begin
      $display("Hello world!");
      $finish;
    end
endmodule
</syntaxhighlight>

다음은, 두 개의 [[플립플롭]]을 이용한 예제이다.:
<syntaxhighlight lang="verilog">
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
</syntaxhighlight>

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

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

다음은 [[계수기|카운터]] 예제이다.:
<syntaxhighlight lang="verilog">
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
</syntaxhighlight>

다음은 지연(delay) 예제이다.:
<syntaxhighlight lang="verilog">
...
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
</syntaxhighlight>

== 외부 링크 ==
* {{서적 인용|url=https://ieeexplore.ieee.org/document/1620780|doi=10.1109/IEEESTD.2006.99495|isbn=978-0-7381-4851-9|title=IEEE Standard for Verilog Hardware Description Language }} – The official standard for Verilog 2005 (not free).
* [http://www.verilog.com/IEEEVerilog.html IEEE P1364] – Working group for Verilog (inactive).

{{IEEE 표준}}
{{전거 통제}}
{{토막글|프로그래밍 언어}}

[[분류:하드웨어 기술 언어]]
[[분류:IEC 표준]]
[[분류:코드 예시에 관한 문서]]
[[분류:구조적 프로그래밍 언어]]