베릴로그
Verilog패러다임 | 구조화 |
---|---|
처음 등장한 | (1984년 |
안정된 릴리스 | IEEE 1364-2005/2005년 11월 , 전( |
타이핑 분야 | 정전기, 약기 |
파일 이름 확장자 | .v, .vh |
사투리 | |
Verilog-AMS | |
영향을 받다 | |
Pascal, Ada, C, Fortran | |
영향받은 | |
시스템 Verilog | |
IEEE 1364로 표준화된 Verilog는 전자 시스템 모델링에 사용되는 하드웨어 기술 언어(HDL)입니다.이는 추상화의 레지스터 전송 수준에서 디지털 회선의 설계 및 검증에 가장 일반적으로 사용됩니다.또한 아날로그 회로와 혼합 신호 회로의 검증 및 유전 [1]회로의 설계에도 사용됩니다.2009년에 Verilog 표준(IEEE 1364-2005)이 SystemVerilog 표준으로 통합되어 IEEE 표준 1800-2009가 작성되었습니다.그 이후로 Verilog는 공식적으로 SystemVerilog 언어의 일부가 되었습니다.현재 버전은 IEEE 표준 1800-2017입니다.[2]
개요
Verilog 등의 하드웨어 기술 언어는 전파 시간과 신호 강도(감도)를 기술하는 방법을 포함하고 있기 때문에 소프트웨어 프로그래밍 언어와 유사합니다.할당 연산자에는 차단 할당(=)과 비연결(<=)의 두 가지 유형이 있습니다.비블로킹 할당을 통해 설계자는 임시 스토리지 변수를 선언하고 사용할 필요 없이 상태 시스템 업데이트를 설명할 수 있습니다.이러한 개념은 Verilog의 언어 의미론의 일부이기 때문에, 설계자들은 비교적 작고 간결한 형태로 큰 회로에 대한 설명을 빠르게 쓸 수 있었다.Verilog가 도입(1984년)되었을 때, Verilog는 이미 그래픽 도식 캡처 소프트웨어와 특별히 작성된 소프트웨어 프로그램을 사용하여 전자 회로를 문서화하고 시뮬레이션하고 있던 회로 설계자들에게 엄청난 생산성 향상을 보여주었습니다.
Verilog의 설계자들은 이미 엔지니어링 소프트웨어 개발에 널리 사용되고 있는 C 프로그래밍 언어와 유사한 구문을 가진 언어를 원했다.C와 마찬가지로 Verilog는 대소문자를 구분하고 기본적인 프리프로세서를 갖추고 있습니다(단, ANSI C/C++보다 복잡하지 않습니다).제어 흐름 키워드(if/else, for, while, case 등)는 동등하며 연산자 precedence는 C와 호환됩니다.구문적인 차이에는 변수 선언에 필요한 비트 폭, 절차 블록의 구분(Verilog는 물결 괄호 {} 대신 시작/끝을 사용) 및 기타 많은 사소한 차이점이 포함됩니다.Verilog에서는 변수의 크기가 일정해야 합니다.C에서 이러한 크기는 변수의 '유형'에서 유추됩니다(예를 들어 정수 유형은 8비트일 수 있습니다).
Verilog 설계는 모듈 계층으로 구성됩니다.모듈은 설계 계층을 캡슐화하고 선언된 입력, 출력 및 양방향 포트 세트를 통해 다른 모듈과 통신합니다.모듈 내부에는 net/variable 선언(와이어, reg, 정수 등), 동시 및 시퀀셜스테이트먼트 블록 및 기타 모듈의 인스턴스(서브계층)의 임의의 조합을 포함할 수 있습니다.순차문은 시작/종료 블록 내에 배치되어 블록 내에서 순차적으로 실행됩니다.그러나 블록 자체는 동시에 실행되므로 Verilog는 데이터 흐름 언어가 됩니다.
Verilog의 '와이어' 개념은 신호 값(4-상태: "1, 0, 부동, 정의되지 않음")과 신호 강도(강, 약 등)로 구성됩니다.이 시스템은 여러 소스가 공통 네트워크를 구동하는 공유 신호 라인의 추상적 모델링을 가능하게 합니다.와이어에 드라이버가 여러 개 있는 경우 와이어의 (읽을 수 있는) 값은 소스 드라이버의 기능과 그 강도에 따라 결정됩니다.
Verilog 언어의 스테이트먼트 서브셋은 합성할 수 있습니다.RTL(register-transfer level)로 알려진 합성 가능한 코딩 스타일에 적합한 Verilog 모듈은 합성 소프트웨어에 의해 물리적으로 구현될 수 있습니다.합성 소프트웨어는 알고리즘에 의해 (추상) Verilog 소스를 넷리스트로 변환합니다.넷리스트는 특정 FPGA 또는 VLSI 테크놀로지에서 이용 가능한 기본적인 로직 프리미티브(AND, OR, NOT, 플립 플랍 등)만으로 구성된 논리적으로 동등한 기술입니다.넷리스트에 대한 추가 조작은 최종적으로 회선 제작 청사진(ASIC용 포토 마스크 세트나 FPGA용 비트스트림 파일 등)으로 이어집니다.
역사
시작
Verilog는 1983년 말부터 1984년 [3]초 사이에 Prabhu Goel, Phil Moorby, Chi-Lai Huang 및 Douglas Warmke에 의해 만들어졌습니다.황치라이는 앞서 S.Y.H. Su 교수가 [4]박사과정을 위해 개발한 언어인 하드웨어 기술 LALSD를 연구한 바 있다.당시 독점적이었던 이 프로세스에 대한 권리 보유자는 "자동 통합 설계 시스템"이었습니다(1985년에 게이트웨이 설계 자동화로 이름이 변경됨).Gateway Design Automation은 1990년에 Cadence Design Systems에 인수되었습니다.이제 Cadence는 향후 10년간 (Verilog 논리 시뮬레이터의) 사실상의 표준이 될 Gateway의 Verilog와 HDL 시뮬레이터인 Verilog-XL에 대한 완전한 독점권을 갖게 되었습니다.원래 Verilog는 시뮬레이션을 설명하고 허용하기 위한 목적으로만 사용되었습니다. 언어가 널리 사용된 후 물리적으로 실현 가능한 구조(게이트 등)에 대한 언어의 하위 집합의 자동 합성이 개발되었습니다.
Verilog는 "검증"과 "논리"[5]의 합성어이다.
베릴로그-95
당시 VHDL의 성공률이 높아짐에 따라 Cadence는 개방형 표준화에 사용할 수 있는 언어를 만들기로 결정했습니다.케이던스는 베릴로그를 OVI(Open Verilog International)(현재는 Accellera로 알려져 있음) 조직 아래 퍼블릭 도메인으로 옮겼다.Verilog는 나중에 IEEE에 제출되어 IEEE Standard 1364-1995(일반적으로 Verilog-95)가 되었습니다.
같은 시간대에 Cadence는 아날로그 시뮬레이터 Spectre 뒤에 표준 지원을 배치하기 위해 Verilog-A의 개발을 시작했습니다.Verilog-A는 독립형 언어를 의도한 것이 아니며 Verilog-95를 포함하는 Verilog-AMS의 서브셋입니다.
2001년 베릴로그
사용자가 원래 Verilog 표준에서 발견한 결함을 커버하기 위해 Verilog-95의 확장 버전이 IEEE에 다시 제출되었습니다.이러한 확장은 Verilog-2001로 알려진 IEEE 표준 1364-2001이 되었습니다.
Verilog-2001은 Verilog-95에서 대폭 업그레이드된 것입니다.첫째, (2의 보완) 서명된 그물 및 변수에 대한 명시적 지원을 추가한다.이전에 코드 작성자는 어색한 비트 레벨 조작을 사용하여 서명된 연산을 수행해야 했습니다(예를 들어 단순한 8비트 덧셈의 실행 비트는 정확한 값을 결정하기 위해 부울 대수에 대한 명시적인 설명이 필요했습니다).Verilog-2001 에서의 같은 함수는 삽입 연산자(+, -, /, *, >>) 중 하나에 의해 보다 간결하게 기술할 수 있습니다.VHDL의 generate-endgenerate와 유사한 generate-endgenerate 구성을 사용하면 Verilog-2001은 일반적인 의사결정 연산자(case-if-else)를 통해 인스턴스 및 스테이트먼트의 인스턴스화를 제어할 수 있습니다.Verilog-2001은 generate-endgenerate를 사용하여 인스턴스 배열을 인스턴스화할 수 있으며 개별 인스턴스의 연결을 제어할 수 있습니다.파일 I/O는 몇 가지 새로운 시스템 태스크에 의해 개선되었습니다.마지막으로 코드 가독성을 개선하기 위해 몇 가지 구문 추가가 도입되었습니다(예: 항상 @*, 명명된 매개 변수 재정의, C-스타일 함수/태스크/모듈 헤더 선언).
Verilog-2001은 대부분의 상용 EDA 소프트웨어 패키지에서 지원되는 Verilog 버전입니다.
2005년 베릴로그
SystemVerilog와 혼동하지 않도록 Verilog 2005(IEEE Standard 1364-2005)는 사소한 수정, 사양 설명 및 몇 가지 새로운 언어 기능(uwire 키워드 등)으로 구성되어 있습니다.
Verilog 표준의 다른 부분인 Verilog-AMS는 아날로그 및 혼합 신호 모델링을 기존의 Verilog와 통합하려고 합니다.
시스템 Verilog
OpenVera와 같은 하드웨어 검증 언어 및 Verisity의 e언어의 등장으로 Co-Design Automation Inc(Synopsys가 인수)의 Superlog 개발이 촉진되었습니다.Superlog와 Vera의 재단은 Accellera에 기부되어 나중에 IEEE 표준 P1800-2005: SystemVerilog가 되었습니다.
SystemVerilog는 Verilog-2005의 슈퍼셋으로 설계 검증 및 설계 모델링에 도움이 되는 많은 신기능을 갖추고 있습니다.2009년 현재 SystemVerilog 및 Verilog 언어 표준은 SystemVerilog 2009로 통합되었습니다(IEEEE 표준 1800-2009).현재 버전은 IEEE 표준 1800-2017입니다.[6]
예
다음으로 2개의 플립플랍의 간단한 예를 제시하겠습니다.
모듈 톱레벨(시계,리셋); 입력 시계; 입력 리셋; 조정하다 플롭 1; 조정하다 플롭2; 항상 @ (엣지 리셋 또는 엣지 시계) 한다면 (리셋) 시작한다. 플롭 1 <=> 0; 플롭2 <=> 1; 끝. 또 다른 시작한다. 플롭 1 <=> 플롭2; 플롭2 <=> 플롭 1; 끝. 엔드 모듈
그<=
Verilog의 연산자는 일반적인 절차 언어가 아닌 하드웨어 기술 언어라는 또 다른 측면입니다.이를 "비블로킹" 할당이라고 합니다.이 액션은 always 블록이 실행될 때까지 등록되지 않습니다.즉, 할당 순서는 무관하며 같은 결과가 됩니다.flop1과 flop2는 클럭마다 값을 바꿉니다.
다른 할당 연산자=
는 블로킹 할당이라고 불립니다.언제=
할당이 사용되며 로직을 위해 타깃 변수가 즉시 업데이트됩니다.위의 예에서 는 다음 명령어를 사용했습니까?=
대신 블로킹 연산자<=
, flop1 및 flop2는 스왑되지 않습니다.대신, 기존 프로그래밍에서와 같이 컴파일러는 단순히 flop1을 flop2와 동일하게 설정하는 것을 이해한다(그리고 그 후에 flop2를 flop1과 동일하게 설정하는 용장 로직을 무시한다).
카운터 회로의 예를 다음에 나타냅니다.
모듈 Div20x (rst, 째깍째깍 소리를 내다, 설정, 두부, 세어보세요, tc); // TITLE '20으로 카운터 나누기(활성화 // CEP 활성화는 클럭 활성화만 가능 // CET 활성화는 클럭 활성화이며 // TC 출력을 활성화합니다. // Verilog 언어를 사용하는 카운터 파라미터 크기 = 5; 파라미터 길이 = 20; 입력 rst; // 이러한 입력/출력은 다음을 나타냅니다. 입력 째깍째깍 소리를 내다; // 모듈에 대한 연결. 입력 설정; 입력 두부; 산출량 [크기-1:0] 세어보세요; 산출량 tc; 조정하다 [크기-1:0] 세어보세요; // 신호 할당 // 항상 내 //(또는 초기) 차단 // reg 유형이어야 합니다. 전선을 치다 tc; // 기타 신호는 와이어 유형입니다. // 아래 항상 있는 문은 병렬입니다. // 실행문 // 신호가 전송될 때마다 실행됩니다. // rst 또는 clk가 낮음에서 높음으로 전환됩니다. 항상 @ (엣지 째깍째깍 소리를 내다 또는 엣지 rst) 한다면 (rst) // 이로 인해 cntr이 리셋됩니다. 세어보세요 <=> {크기{1b0}}; 또 다른 한다면 (설정 & & 두부) // 양쪽 True를 활성화합니다. 시작한다. 한다면 (세어보세요 == 길이-1) 세어보세요 <=> {크기{1b0}}; 또 다른 세어보세요 <=> 세어보세요 + 1'b1'; 끝. // tc 값이 연속적으로 할당됩니다. // 식의 값 할당하다 tc = (설정 & & (세어보세요 == 길이-1)); 엔드 모듈
지연의 예:
... 조정하다 a, b, c, d; 전선을 치다 e; ... 항상 @(b 또는 e) 시작한다. a = b & e; b = a b; #5 c = b; d = #6 c ^ e; 끝.
위의 always 조항은 목록의 엔티티(b 또는 e) 중 하나가 변경될 때마다 실행되는 다른 사용 방법을 보여 줍니다.이들 중 하나가 변경되면a에는 즉시 새로운 값이 할당되며 블로킹 할당에 의해 b에는 나중에 새로운 값이 할당됩니다(a의 새로운 값을 고려).5시간 단위 지연 후 c에 b의 값을 할당하고 c^e의 값을 보이지 않는 스토어에 넣는다.그런 다음 6개의 시간 단위가 더해진 후, d는 숨겨져 있던 값이 할당됩니다.
공정(초기 또는 항상 블럭) 내에서 구동되는 신호는 reg 유형이어야 합니다.프로세스 외부에서 구동되는 신호는 와이어 유형이어야 합니다.키워드 reg가 반드시 하드웨어 레지스터를 의미하는 것은 아닙니다.
상수의 정의
Verilog 상수의 정의는 너비 매개변수의 추가를 지원합니다.기본 구문은 다음과 같습니다.
<폭(비트 단위)><베이스 문자><번호>
예:
- 12'h123 – 16진수 123 (12비트 사용)
- 20'd44 – Decimal 44 (20비트– 0 내선번호는 자동 사용)
- 4'b1010 – Binary 1010 (4비트 사용)
- 6'o77 – Octal 77 (6비트 사용)
합성 가능한 구조
Verilog는 HDL(하드웨어 기술 언어)로 널리 알려져 있습니다.Verilog에는 $display와 같이 실제 하드웨어에 아날로그가 없는 문장이 몇 개 있습니다.따라서 하드웨어 기술에는 많은 언어를 사용할 수 없습니다.이는 일반적으로 베릴로그 언어의 정의를 적절히 재특성화할 필요가 있음을 시사하는 것으로 보인다.그러나 여기에 제시된 예는 실제 게이트에 직접 매핑된 언어의 고전적(및 제한된) 하위 집합입니다.
// Mux 예제: 같은 작업을 수행하는 세 가지 방법이 있습니다. // 첫 번째 예에서는 연속 할당을 사용합니다. 전선을 치다 나가.; 할당하다 나가. = 셀 ? a : b; // 두 번째 예에서는 프로시저를 사용합니다. // 같은 일을 할 수 있습니다. 조정하다 나가.; 항상 @(a 또는 b 또는 셀) 시작한다. 사례.(셀) 1b0: 나가. = b; 1'b1': 나가. = a; 엔드 케이스 끝. // 마지막으로 - if/else를 사용할 수 있습니다. // 절차 구조. 조정하다 나가.; 항상 @(a 또는 b 또는 셀) 한다면 (셀) 나가. = a; 또 다른 나가. = b;
다음 대상 구조는 투명 래치입니다. 게이트 신호가 "패스스루"로 설정되면 입력이 출력으로 전달되고 게이트 신호가 "보류"로 전환될 때 입력을 캡처하여 저장합니다.게이트가 "보류"로 설정되어 있는 동안에는 입력 신호에 관계없이 출력이 안정적인 상태로 유지됩니다.아래의 예에서 게이트의 "통과" 수준은 if 절의 값이 참일 때, 즉 게이트 = 1이 됩니다.이는 "게이트가 참일 경우 din이 latch_out에 연속적으로 공급됩니다."라고 읽힙니다.if구가 false이면 latch_out의 마지막 값은 그대로 유지되며 din 값과는 무관합니다.
// 트랜스페어런트래치의 예시 조정하다 래치 아웃; 항상 @(게이트 또는 쨍그랑 소리를 내다) 한다면(게이트) 래치 아웃 = 쨍그랑 소리를 내다; // 패스스루 상태 // 그 외는 여기에서는 필수가 아닙니다.변수 // 게이트가 작동 중일 때 latch_out은 din 값을 따릅니다. // 높음.게이트가 로우 상태가 되면 latch_out은 일정하게 유지됩니다.
플립 플랍은 다음으로 중요한 템플릿입니다.Verilog에서는 D-flop이 가장 단순하며 다음과 같이 모델링할 수 있습니다.
조정하다 q; 항상 @(엣지 째깍째깍 소리를 내다) q <=> d;
이 예에서 유의해야 할 중요한 것은 논블로킹 할당의 사용입니다.기본 경험적 규칙은 always 구 내에 posedge 또는 negedge 문이 있는 경우 <=를 사용하는 것입니다.
D-flop의 변형은 비동기 리셋을 사용하는 것입니다.리셋 스테이트가 스테이트먼트 내의 첫 번째 if구가 되는 규칙이 있습니다.
조정하다 q; 항상 @(엣지 째깍째깍 소리를 내다 또는 엣지 리셋) 한다면(리셋) q <=> 0; 또 다른 q <=> d;
다음 변종에는 비동기 리셋과 비동기 세트 조건이 모두 포함되어 있습니다.다시 한 번 규칙이 적용됩니다.즉, 리셋 조건 뒤에 세트 조건이 이어집니다.
조정하다 q; 항상 @(엣지 째깍째깍 소리를 내다 또는 엣지 리셋 또는 엣지 세트) 한다면(리셋) q <=> 0; 또 다른 한다면(세트) q <=> 1; 또 다른 q <=> d;
참고: 이 모델을 사용하여 Set/Reset 플립 플랍을 모델링하면 시뮬레이션 오류가 발생할 수 있습니다.다음 이벤트 테스트 시퀀스를 고려합니다. 1) 리셋이 하이로 가고 2) clk가 하이로 가고 3) set go high 4) clk가 하이로 가고 5) 리셋이 로우로 가고 6)가 로우로 설정됩니다.설정 및 보류 위반이 없다고 가정합니다.
이 예에서는 reset의 상승 에지가 발생하면 always @ 문이 먼저 실행되어 q 값이 0이 됩니다.다음 번에는 항상 블록이 실행되면 clk의 상승 에지가 되어 q가 0으로 유지됩니다.그 후 항상 블록은 설정이 높으면 실행됩니다.리셋은 높기 때문에 강제로 q를 0으로 유지합니다.이 상태는 실제 플립 플랍에 따라 정확하거나 정확하지 않을 수 있습니다.단, 이 모델의 주된 문제는 이것이 아닙니다.리셋이 로우로 되어도, 그 세트는 하이인 것에 주의해 주세요.실제 플립 플랍에서는 출력이 1이 됩니다.그러나 이 모델에서는 항상 블록이 레벨이 아닌 설정 및 리셋의 상승 에지에 의해 트리거되기 때문에 발생하지 않습니다.설정/재설정 플립 플랍에 대해 다른 접근법이 필요할 수 있습니다.
마지막 기본 변형은 입력에 공급되는 멀티플렉스를 사용하여 D-플롭을 구현하는 것입니다.mux에는 d입력 및 flop 자체로부터의 피드백이 있습니다.이를 통해 게이트 로드 기능을 사용할 수 있습니다.
// EXPLICIT 피드백 경로를 가진 기본 구조 항상 @(엣지 째깍째깍 소리를 내다) 한다면(게이트) q <=> d; 또 다른 q <=> q; // 명시적 피드백 경로 // 더 일반적인 구조는 피드백이 존재한다고 가정합니다. // 이것은 안전한 가정입니다.이것은, 이 방법으로, // 하드웨어 컴파일러가 해석합니다.이 구조 // 래치처럼 보입니다.차이점은 // ''@(posedge clk)'' 및 비호환 '''<='' // 항상 @(엣지 째깍째깍 소리를 내다) 한다면(게이트) q <=> d; // "mux"는 "mux"입니다.
이 설명에 기재되어 있는 「초기」블록은 없습니다.이 구조에서는 FPGA와 ASIC 합성 툴이 분할되어 있습니다.FPGA 도구는 "reset" 신호를 사용하는 대신 reg 값이 설정되는 초기 블록을 허용합니다.ASIC 합성 툴은 이러한 스테이트먼트를 지원하지 않습니다.그 이유는 FPGA의 초기 상태가 FPGA의 메모리 테이블에 다운로드되기 때문입니다.ASIC는 실제 하드웨어 구현입니다.
초기 및 상시
Verilog 프로세스를 선언하는 방법은 두 가지가 있습니다.always 키워드와 initial 키워드는 다음과 같습니다.always 키워드는 프리 실행 프로세스를 나타냅니다.initial 키워드는 프로세스가 정확히 한 번 실행됨을 나타냅니다.두 구성 모두 시뮬레이터 시간 0에 실행을 시작하여 블록이 끝날 때까지 실행됩니다.항상 블록이 끝에 도달하면 다시 스케줄이 설정됩니다.초기 블록이 항상 블록보다 먼저 실행된다고 믿는 것은 일반적인 오해입니다.실제로 첫 번째 블록은 처음 완료된 후 종료되는 always-block의 특수한 케이스로 생각하는 것이 좋습니다.
//예: 초기의 시작한다. a = 1; // 시간 0에 reg a에 값 할당 #1; // 1시간 단위 대기 b = a; // reg a의 값을 reg b에 할당합니다. 끝. 항상 @(a 또는 b) // a 또는 b CHANGE 언제든지 프로세스 실행 시작한다. 한다면 (a) c = b; 또 다른 d = ~b; 끝. // 이 블록을 완료하고 이제 맨 위로 돌아갑니다(즉, @ event-control). 항상 @(엣지 a)// reg a의 변화가 낮거나 높을 때마다 실행 a <=> b;
이러한 2개의 키워드의 일반적인 용도는 다음과 같습니다만, 그 외의 중요한 용도는 2개 있습니다.그 중 가장 일반적인 것은 @(...) 감도 리스트가 없는 always 키워드입니다.다음과 같이 항상 사용할 수 있습니다.
항상 시작한다. // 항상 시간 0에 실행을 시작하고 NEVER stop 째깍째깍 소리를 내다 = 0; // clk를 0으로 설정 #1; // 1시간 단위 대기 째깍째깍 소리를 내다 = 1; // clk를 1로 설정 #1; // 1시간 단위 대기 끝. // 계속 실행 - 처음부터 계속 진행
always 키워드는 C 언어 컨스트럭트와 동일하게 동작합니다(단, (1) {..}은(는) 영원히 실행된다는 의미입니다.
또 다른 중요한 예외는 initial 키워드와 forever 키워드를 함께 사용하는 것입니다.
다음 예시는 위의 예시와 기능적으로 동일합니다.
초기의 영원히. // 시간 0에 시작하여 시작/끝을 영원히 반복합니다. 시작한다. 째깍째깍 소리를 내다 = 0; // clk를 0으로 설정 #1; // 1시간 단위 대기 째깍째깍 소리를 내다 = 1; // clk를 1로 설정 #1; // 1시간 단위 대기 끝.
포크/조인
포크/조인 쌍은 Verilog에서 병렬 프로세스를 생성하기 위해 사용됩니다.포크/조인 쌍 간의 모든 문(또는 블록)은 포크에 도달하는 실행 흐름과 동시에 실행을 시작합니다.포크와 조인 사이의 최장 실행 스테이트먼트 또는 블록이 완료되면 조인 후에도 실행이 계속됩니다.
초기의 포크 $write(쓰기)("A"); // 문자 A 인쇄 $write(쓰기)('B'); // 문자 B 인쇄 시작한다. #1; // 1시간 단위 대기 $write(쓰기)('C'); // 문자 C 인쇄 끝. 합류하다
상기의 기술 방법에서는, 「ABC」또는 「BAC」의 시퀀스를 인쇄할 수 있습니다.첫 번째 $write와 두 번째 $write 사이의 시뮬레이션 순서는 시뮬레이터 구현에 따라 다르며, 시뮬레이터에 의해 의도적으로 무작위화될 수 있습니다.이를 통해 시뮬레이션은 의도적인 비결정적 행동뿐만 아니라 우발적인 경주 조건을 모두 포함할 수 있습니다.
VHDL은 Verilog와 [7]같은 여러 프로세스를 동적으로 생성할 수 없습니다.
레이스 조건
Verilog 내에서 실행 순서가 항상 보장되는 것은 아닙니다.이것은 고전적인 예로 가장 잘 설명할 수 있다.아래의 코드 조각에 대해 생각해 보십시오.
초기의 a = 0; 초기의 b = a; 초기의 시작한다. #1; $표시("값 a=%d b=%d",a,b); 끝.
a와 b의 값에는 어떤 것이 출력됩니까?초기 블록의 실행 순서에 따라 0과 0이 될 수도 있고 0과 다른 임의의 초기화되지 않은 값이 될 수도 있습니다.$display 문은 #1 지연으로 인해 두 할당 블록이 모두 완료된 후 항상 실행됩니다.
연산자
주의: 이러한 연산자는 우선순위로 표시되지 않습니다.
오퍼레이터 타입 | 연산자 기호 | 작업이 수행되었습니다. |
---|---|---|
비트 단위 | ~ | 비트 단위 없음(1's complete) |
& | 비트 AND | |
비트 단위 OR | ||
^ | 비트 단위 XOR | |
~^ 또는 ^~ | 비트 단위 XNOR | |
논리 | ! | 것은 아니다. |
& & | 그리고. | |
또는 | ||
축소 | & | 삭감 AND |
~& | 환원 NAND | |
삭감 OR | ||
~ | 감소 NOR | |
^ | XOR의 삭감 | |
~^ 또는 ^~ | XNOR 저감 | |
산술 | + | 추가 |
- | 뺄셈 | |
- | 2의 보충 | |
* | 곱셈 | |
/ | 나누기 | |
** | 지수화(*Verilog-2001) | |
관계형 | > | 보다 크다 |
< > | 보다 적은 | |
>= | 이상 | |
<=> | 이하 | |
== | 논리적 동등성(비트 값 1'bX는 비교에서 제외됨) | |
!= | 논리적 부등식(비트 값 1'bX는 비교에서 제외됨) | |
=== | 4스테이트 논리등호(비트값 1'bX는 리터럴로 간주) | |
!== | 4스테이트 논리 부등식(비트값 1'bX는 리터럴로 간주) | |
시프트 | >> | 논리적 우측 이동 |
<< > | 논리 좌회전 | |
>>> | 산술적 우측 시프트(*Verilog-2001) | |
<<<< > | 산술 좌회전(*Verilog-2001) | |
연결 | {, } | 연결 |
레플리케이션 | {n{m}}} | n회 반복 값 m |
조건부 | ? : | 조건부 |
4값 논리
IEEE 1364 표준에서는 4가지 상태의 4가지 값 로직(0, 1, Z(고임피던스) 및 X(불명한 로직 값)를 정의합니다.경쟁 VHDL의 경우 9레벨의 [8]IEEE 1164로 다중값 로직 전용 표준이 존재합니다.
시스템 태스크
시뮬레이션 중에 간단한 I/O 및 다양한 설계 측정 기능을 처리하는 시스템 작업을 사용할 수 있습니다.모든 시스템 태스크에는 사용자 태스크 및 기능과 구별하기 위해 $가 앞에 붙습니다.이 섹션에서는 가장 자주 사용되는 작업의 간단한 목록을 보여 줍니다.그것은 결코 포괄적인 목록이 아니다.
- $display – 한 줄에 이어 자동 줄 바꿈을 스크리닝합니다.
- $write – 줄 바꿈 없이 행을 스크리닝합니다.
- $swrite – 줄 바꿈 없이 행을 변경할 수 있습니다.
- $sscanf: 변수에서 형식 지정 문자열을 읽습니다.(*Verilog-2001)
- $fopen – 파일(읽기 또는 쓰기)에 대한 핸들을 엽니다.
- $fdisplay – 파일에서 한 줄씩 인쇄한 후 자동으로 새 줄을 인쇄합니다.
- $fwrite – 줄 바꿈 없이 줄을 제출할 때 사용합니다.
- $fscanf: 파일에서 형식 지정 문자열을 읽습니다.(*Verilog-2001)
- $fclose – 열려 있는 파일 핸들을 닫고 놓습니다.
- $readmemh: 16진수 파일 내용을 메모리 배열로 읽습니다.
- $readmemb – 이진 파일 내용을 메모리 배열로 읽습니다.
- $monitor – 값이 변경되면 나열된 모든 변수를 출력합니다.
- $time – 현재 시뮬레이션 시간의 값.
- $dumpfile : VCD(Value Change Dump) 형식의 출력 파일명을 선언합니다.
- $dumpvars: 변수를 켜고 덤프합니다.
- $dumpports: 변수를 켜고 Extended-VCD 형식으로 덤프합니다.
- $random: 랜덤 값을 반환합니다.
프로그램 언어 인터페이스(PLI)
PLI는 프로그래머에게 Verilog에서 C언어로 작성된 프로그램 함수로 제어를 이전하는 메커니즘을 제공합니다.PLI를 완전히 대체하는 새로운 Verilog Procedural Interface를 위해 IEEE 규격 1364-2005에서는 공식적으로 권장되지 않습니다.
PLI(현재의 VPI)를 사용하면 Verilog는 테스트 하니스, 마이크로 컨트롤러의 명령어 세트 시뮬레이터, 디버거 등 C 언어로 작성된 다른 프로그램과 연계할 수 있습니다.예를 들어 C 함수를 제공합니다.tf_putlongp()
그리고.tf_getlongp()
현재 Verilog 태스크 또는 함수의 인수를 각각 쓰고 읽는 데 사용됩니다.
시뮬레이션 소프트웨어
Verilog 시뮬레이터에 대한 자세한 내용은 Verilog 시뮬레이터 목록을 참조하십시오.
「 」를 참조해 주세요.
추가 자료
유사 언어
- VHDL
- SystemC - HDL 이벤트 구동 시멘틱스를 제공하는 C++ 라이브러리
- 시스템 Verilog
- OpenVera
- e(검증 언어)
- 속성 사양 언어
- Scala 위에 구축된 오픈 소스 언어인 Chisel
Verilog 제너레이터
레퍼런스
- ^ Nielsen AA, Der BS, Shin J, Vaidyanathan P, Paralanov V, Strychalski EA, Ross D, Densmore D, Voigt CA (2016). "Genetic circuit design automation". Science. 352 (6281): aac7341. doi:10.1126/science.aac7341. PMID 27034378.
- ^ 1800-2vhhu017: SystemVerilog용 IEEE 표준—통합 하드웨어 설계, 사양 및 검증 언어
- ^ "Verilog's inventor nabs EDA's Kaufman award". EE Times. 7 November 2005.
- ^ Huang, Chi-Lai; Su, S.Y.H. "Approaches for Computer-Aided Logic System Design Using Hardware Description Language". Proceedings of International Computer Symposium 1980, Taipei, Taiwan, December 1980. pp. 772–79O. OCLC 696254754.
- ^ "Oral History of Philip Raymond "Phil" Moorby" (PDF). Computer History Museum. 22 April 2013. pp. 23–25.
- ^ 1800-2017 - SystemVerilog IEEE 표준 - 통합 하드웨어 설계, 사양 및 검증 언어
- ^ Cummings, Clifford E. (2003). "SystemVerilog – Is This The Merging of Verilog & VHDL?" (PDF). SNUG Boston 2003.
- ^ Miller, D. Michael; Thornton, Mitchell A. (2008). Multiple valued logic: concepts and representations. Synthesis Lectures on Digital Circuits and Systems. Vol. 12. Morgan & Claypool. ISBN 978-1-59829-190-2.
- 메모들
- 1364-2005 — IEEE Standard for Verilog Hardware Description Language. 2006. doi:10.1109/IEEESTD.2006.99495. ISBN 0-7381-4850-4.
- 1364-2001 — IEEE Standard Verilog Hardware Description Language. 2001. doi:10.1109/IEEESTD.2001.93352. ISBN 0-7381-2826-0.
- 61691-4-2004 — IEC/IEEE Behavioural Languages — Part 4: Verilog Hardware Description Language (Adoption of IEEE Std 1364-2001). 2004. doi:10.1109/IEEESTD.2004.95753. ISBN 2-8318-7675-3.
- 1364-1995 — IEEE Standard Hardware Description Language Based on the Verilog(R) Hardware Description Language. 1996. doi:10.1109/IEEESTD.1996.81542. ISBN 978-0-7381-3065-1.
- Thomas, Donald E.; Moorby, Phillip R. (2013). The Verilog® Hardware Description Language (3rd ed.). Springer. ISBN 978-1475724646.
- Cornell ECE576 합성 구조를 설명하는 코스
- Bergeron, Janick (2012). Writing Testbenches: Functional Verification of HDL Models (2nd ed.). Springer. ISBN 978-1-4615-0302-6. (HDL Testbench 성경)
외부 링크
표준 개발
- IEEE Standard for Verilog Hardware Description Language. doi:10.1109/IEEESTD.2006.99495. ISBN 978-0-7381-4851-9. – Verilog 2005 공식 표준 (무료 아님)
- IEEE P1364: Verilog 작업 그룹(비액티브).
- IEEE P1800 – SystemVerilog 작업 그룹 (상기 대체)
- Verilog 구문: Backus-Naur 형식의 구문 설명.이것은 IEEE-1364 규격보다 앞선 것입니다.
- Verilog-AMS – Accelera 혼합 신호 확장을 Verilog로
언어 확장자
- Verilog AUTOs - 업계 IP가 Verilog 코드 유지보수를 단순화하기 위해 사용하는 오픈소스 메타 코멘트입니다.