HBE-COMBO II -SE VerilogHDL 실습 Lab#03 Verilog HDL

Slides:



Advertisements
Similar presentations
Ⅰ. 연산자 Ⅱ. 제어 구조. 연산자 : 할당 연산자 - 사용자가 정의한 변수에 임의의 값을 저장하는 기능 strvar = strVar1+ “ Hello ”
Advertisements

변수와 조건문 빛나리 36 호 박승운. 파이썬 쉽게 사용하기 Python IDLE 사용 FILE - New File 로 파일 만들기 Run – Run Module 로 실행하기.
 Verilog HDL 로 표현되 는 논리회로는 “module”~”endmodul e” 안에 표현  모든 문장은 세미콜론 (;) 으로 문장을 끝냄 ◦ 단, “end~” 로 시작하는 예약어에는 세미콜론이 없음  Module 이름은 영문자 와 언더바 (_) 로 시작할.
임진수 이현철. 회로 설계 과정 합성 ?  합성 도구가 주어진 HDL 코드를 Library 에 맞춰 회로로 변경시켜주는 과정  모든 코드가 합성되는 것은 아니다 !
디지털시스템실험 2주차 고려대학교 전기전자전파공학부.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
Verilog HDL 개요 Sun, Hye-Seung.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Chapter 7. 조건문.
제 9 장 구조체와 공용체.
조합 논리회로 설계 및 검증 Sun, Hye-Seung.
제4장 조합논리회로 내용 4.1 조합논리회로 설계 과정 4.2 산술회로 : 가산기(adder)/ 감산기(subtractor)
자료형과 연산자 Sun, Hye-Seung.
디지털논리실습 기본 논리 게이트 부울대수 조합회로.
Verilog HDL 이론.
디지털 시스템 설계(3).
행위수준 모델링 Sun, Hye-Seung.
오브젝트 플립플롭 IT CookBook, VHDL을 이용한 디지털 회로 입문.
Quartus II 사용법 VHDL을 이용한 디지털 시스템 설계.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
순차회로 모델링 Sun, Hye-Seung.
VHDL Design : Barrel Shifter
Chapter 04 C 연산자의 이해.
오브젝트 조합 회로 IT CookBook, VHDL을 이용한 디지털 회로 입문.
Ch2-2. VHDL Basic VHDL lexical element VHDL description
조합논리회로 모델링 Sun, Hye-Seung.
RS 및 D 플립플롭 RS Flip Flop 래치는 어떤 입력 레벨에 의해서 제어되는 데 플립플롭은 클록 입력이라고
Data type and Object 자료형 변환 함수들은 std_logic_arith 패키지에 정의되어 있음.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
WinCE Device Driver 실습 #3
DK-128 FND 실습 아이티즌 기술연구소 김태성 연구원
VHDL Mealy and Moore model
MATLAB
JA A V W. 03.
어서와 C언어는 처음이지 제14장.
Lesson 4. 수식과 연산자.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
플립플롭, 카운터, 레지스터 순서회로 플립플롭 카운터 레지스터.
DK-128 FND 실습 아이티즌 기술연구소
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
연산자 (Operator).
6 레지스터와 카운터.
에어 조건문.
2장. 변수와 타입.
6. 레지스터와 카운터.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
7주차 FPGA 보드 사용법.
Choi Seong Yun 컴퓨터 프로그래밍 기초 #06 : 반복문 Choi Seong Yun
Chapter 02. 자바 기본 문법.
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
7주차 실습 FPGA 보드 사용법.
Fucntion 요약.
DK-128 개발환경 설정 아이티즌 기술연구소
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
2장 PHP 기초 PHP의 시작과 끝을 이해한다. 주석문에 대하여 이해한다. echo 문을 이용하여 화면에 출력하
논리회로 설계 및 실험 4주차.
Chapter 10 데이터 검색1.
TVM ver 최종보고서
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
Numerical Analysis Programming using NRs
8장 선택 논리 II 1. 논리연산자 1.1 논리연산자 : AND (&&) 1.2 논리연산자 : OR (||)
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
 6장. SQL 쿼리.
7주차 실습 FPGA 보드 사용법.
버스와 메모리 전송 버스 시스템 레지스터와 레지스터들 사이의 정보 전송을 위한 경로
Visual Basic .NET 기초문법.
6 객체.
Presentation transcript:

HBE-COMBO II -SE VerilogHDL 실습 Lab#03 Verilog HDL

목차 Verilog HDL 문법 논리 게이트 설계 AND Gate NAND Gate

목차 Verilog HDL 문법 논리 게이트 설계 AND Gate NAND Gate

HDL 기반 설계의 장점 설계 시간의 단축 초기 설계과정에서의 설계오류 수정이 용이 합성에 의한 회로 생성과 설계 변경이 용이 설계의 질 향상 우수하고 광범위한 하드웨어 기술 능력, 상위 수준의 설계 가능 다양한 설계기법의 검색에 의한 최적화 도달 선택적 최적화 기법을 이용한 합성 설계 특정 설계기술이나 공정과 무관한 설계 특정 ASIC 제조업체 및 구현기술과 무관한 설계 가능 동일한 HDL 설계의 다른 라이브러리 이용한 합성 신속한 하드웨어 원형화 (prototyping) 가능

HDL 기반 설계의 장점 낮은 설계 비용 상위레벨 설계도구의 사용에 따른 설계 생산성 향상 설계기간의 단축에 따른 설계비용의 감소 설계자산의 재사용에 의한 설계비용의 감소 표준 HDL 및 사용자의 확대 IEEE 표준인 동시에 미국 정부의 공인 HDL 전세계적으로 설계 및 설계정보 교환의 수단으로 사용이 확대 효율적인 설계관리 HDL 언어의 구조적 설계 (structured design) 기능을 이용한 전체 설계의 기능별 분할 설계 및 설계관리 및 문서화 용이

Verilog HDL의 역사 Verilog HDL 1983년 Gateway Design Automation사에서 하드웨어 기술언어인 HiLo와 C 언어의 특징을 기반으로 개발 1991년 Cadence Design Systems가 Open Verilog International (OVI)라는 조직을 구성하고 Verilog HDL을 공개 1993년 IEEE Working Group이 구성되어 표준화 작업을 진행 1995년 12월 IEEE Std. 1364-1995로 표준화 2001년에 IEEE Std. 1364-2001로 개정 Verilog HDL의 확장 형태인 SystemVerilog가 개발되어 IEEE 표준화를 추진

Verilog HDL 어휘 규칙 여백(white space) 주석(comment) 연산자(operator) 빈칸(space), 탭(tab), 줄바꿈 어휘 토큰들을 분리하기 위해 사용되는 경우를 제외하고는 무시 공백(blank)과 탭은 문자열에서 의미 있게 취급 주석(comment) HDL 소스코드의 설명을 위해 사용되며, 컴파일과정에서 무시됨 단일 라인 주석문; // 로 시작되어 해당 라인의 끝까지 블록 주석문; /* ~ */ 로 표시 블록 주석문은 내포(nested)될 수 없음 연산자(operator) 단항 연산자, 2항 연산자, 3항 연산자

[size_constant]'<base_format> <number_value> Verilog HDL 어휘 규칙 수 표현 (number representation) 정수형(integer) ; 10진수, 16진수, 8진수, 2진수 형식 : [size_constant]: 값의 비트 크기를 나타내는 상수 0이 아닌 unsigned 10진수가 사용되며, 생략될 수 있음 unsized 수 (즉, 단순 10진수 또는 비트 크기가 지정되지 않은 수)는 32비트로 표현됨 상위 비트가 x(unknown) 또는 z(high-impedance)인 unsized unsigned 상수는 그 상수가 사용되는 수식의 비트 크기만큼 확장됨 'base_format : 밑수(base)를 지정하는 문자(d, D, h, H, o, O, b, B) signed를 나타내기 위해 문자 s 또는 S가 함께 사용될 수 있음 number_value : unsigned 숫자를 사용하여 값을 표현 'base_format에 적합한 숫자들로 구성 base_format과 number_value 사이에 + 또는 - 부호 사용 불가 [size_constant]'<base_format> <number_value>

Verilog HDL 어휘 규칙 수 표현 (number representation) 비트 크기와 밑수를 갖지 않는 단순 10진수는 signed 정수로 취급 부호 지정자 없이 밑수만 지정되면 unsigned 정수로 취급 밑수 지정자와 부호 지정자 s가 함께 사용되면 signed 정수로 취급 부호 지정자 s는 비트 패턴에는 영향을 미치지 않으며, 비트 패턴의 해석에만 영향을 미침 음수는 2의 보수(2’s complementary) 형식으로 표현됨 지정된 비트 크기보다 unsigned 수의 크기가 작은 경우 MSB 왼쪽에 0이 삽입 MSB가 x 또는 z이면, x 또는 z가 왼쪽에 삽입 값에 물음표( ? )가 사용되면 z로 취급 첫번째 문자를 제외하고는 밑줄(underscore)이 사용될 수 있으며, 이는 수의 가독성(readability)을 좋게 함

Verilog HDL 어휘 규칙 Number # of Bits Base Dec. Equiv. Stored 10 32 Decimal 10 00....01010 2’b10 2 Binary 2 10 3’d5 3 Decimal 5 101 8’o5 8 Octal 5 00000101 8’ha 8 Hex 10 00001010 3’b5 Invalid! 3’b01x 3 Binary - 01x 12’hx 12 Hex - xxxxxxxxxxxx 8’b0000_0001 8 Binary 1 00000001 8’bx01 8 Binary - xxxxxx01 ’bz Unsized Binary - zz...zz(32bits) 8’HAD 8 Hex 173 10101101 Number # of Bits Base Dec. Equiv. Stored

Verilog HDL 어휘 규칙 식별자(identifier) 키워드(keyword) 객체에 고유의 이름을 지정하기 위해 사용 대소문자를 구별하여 인식 가독성을 위해 밑줄 사용 가능 단순 식별자; 일련의 문자, 숫자, 기호 $, 밑줄 등으로 구성 첫번째 문자는 숫자나 기호 $ 사용 불가, 문자 또는 밑줄만 사용 확장 식별자(escaped identifier); \ (back slash)로 시작되며, 여백(빈칸, 탭, 줄바꿈) 등으로 끝남 프린트 가능한 ASCII 문자들을 식별자에 포함시키는 수단을 제공 키워드(keyword) Verilog 구성 요소를 정의하기 위해 미리 정의된 식별자 확장문자가 포함된 키워드는 키워드로 인식되지 않음

Verilog HDL 어휘 규칙 Verilog keyword (일부) always and assign automatic begin buf bufif0 bufif1 case casex casez cell cmos config deassign default defparam design disable edge else end endcase if ifnone incdir include initial inout input instance integer join large liblist library localparam macromodule medium module nand negedge nmos nor not notif0 release repeat rnmos rpmos rtran rtranif0 rtranif1 scalared showcancelled signed small specify specparam strong0 strong1 supply0 supply1 table task time tran tranif0 tranif1

Verilog HDL 개요 Verilog HDL 논리 합성 assign, initial, if~else, $finish case, for always 논리 합성 initial, $finish $fopen specify $width table Simulation Library

Verilog HDL의 모듈 port 선언 reg 선언 wire 선언 parameter 선언 하위 모듈 호출 module module_name (port_list); endmodule 하위 모듈 호출 always, initial 문 function, task 정의문 assign 문 function, task 호출문 port 선언 reg 선언 wire 선언 parameter 선언 No Semicolon Semicolon

Verilog HDL의 모듈 input inout output wire, reg wire Primitive Module_instance_A Module_instance_B wire, reg always begin . . . end Continuous assignment assign wire_A = C | D; initial Behavior_2 reg reg_A, reg_B, . . . integer int_A, . . . register variables Primitive instantiation Behavior_1 declarations

Verilog HDL 모델링 예 게이트 프리미티브를 이용한 모델링 예 (반가산기 회로) sum = a ^ b Module Name Module Ports module half_add1 (a, b, sum, cout); input a, b; output sum, cout; wire cout_bar; xor (sum, a, b); nand (cout_bar, a, b); not (cout, cout_bar); endmodule Declaration of port modes Declaration of internal signals Half_ Adder sum = a ^ b cout = a & b a b sum cout Instantiation of Primitive gates Verilog keyword

Verilog HDL 모델링 예 행위수준 모델링 (조합논리회로) MUX in0 2 out in1 sel module mux2b_if(in0, in1, sel, out); input [1:0] in0, in1; input sel; output [1:0] out; reg [1:0] out; always @(sel or in0 or in1) begin if (sel ==0) out = in0; else out = in1; end endmodule MUX in0 in1 sel out 2

Verilog HDL 모델링 예 행위수준 모델링 (순차회로) module flip-flop (q, din, clk, rst); input din, clk, rst; output q; reg q; always @(posedge clk or posedge rst) begin if (rst == 1) q <= 0; else q <= din; end endmodule

Verilog HDL 모델링 테스트벤치 모듈 HDL 모델을 시뮬레이션하기 위한 Verilog 모듈 DUT에 인가될 시뮬레이션 입력(stimulus)을 생성하는 구문 시뮬레이션 대상이 되는 모듈(Design Under Test; DUT)의 인스턴스 시뮬레이션 입력에 대한 DUT의 반응(response)을 관찰하는 구문 Stimulus Generator Design Under Test (DUT) Response Monitor

logic zero, or false condition logic one, or true condition Verilog HDL의 논리값 Verilog HDL의 논리값 집합 논리값 의  미 logic zero, or false condition 1 logic one, or true condition x unknown logic value z high-impedance state

Verilog HDL의 자료형 Net 자료형 : 소자간의 물리적인 연결을 추상화 wire, tri, wand, wor, triand, trior, supply0, supply1, tri0, tri1, trireg Default 자료형 ; 1비트의 wire Variable 자료형 : 절차형 할당문 사이의 값의 임시 저장 프로그래밍 언어의 variable과 유사한 개념 reg, integer, real, time, realtime Yes No Comb (No) Seq (Yes) Variable Net 절차형 할당문 연속 할당문 프리미티브 출력 할당 모드 자료형

Net 자료형 net 자료형 논리 게이트나 모듈 등의 하드웨어 요소들 사이의 물리적 연결을 나타내기 위해 사용 연속 할당문(continuous assignment), 게이트 프리미티브 등과 같은 구동자(driver)의 값에 의해 net의 값이 연속적으로 유지됨 값을 저장하지 않음 (단, trireg net는 예외) 구동자가 연결되지 않으면, default 값인 high-impedance (z)가 됨 단, trireg net는 이전에 구동된 값을 유지 default 자료형은 1비트의 wire default 초기값은 z trireg net는 default 초기값으로 x를 가짐

Net 자료형 wire tri wand wor triand trior supply0 supply1 tri0 tri1 자료형 이름 의  미 wire 함축된 논리적 동작이나 기능을 갖지 않는 단순한 연결을 위한 net tri 함축된 논리적 동작이나 기능을 갖지 않는 단순한 연결을 위한 net이며, 하드웨어에서 3상태(tri-state)가 되는 점이 wire와 다름 wand 다중 구동자를 갖는 net이며, ‘wired-and’(즉, open collector logic)의 하드웨어 구현을 모델링하기 위해 사용 wor 다중 구동자를 갖는 net이며, ‘wired-or’(즉, emitter coupled logic)의 하드웨어 구현을 모델링하기 위해 사용 triand wand와 동일하게 다중 구동자를 갖는 net이며, 하드웨어에서 3상태(tri-state)를 갖는 점이 다름 trior wor와 동일하게 다중 구동자를 갖는 net이며, 하드웨어에서 3상태(tri-state)를 갖는 supply0 회로접지(circuit ground)에 연결되는 net supply1 전원(power supply)에 연결되는 net tri0 저항성 pulldown (resistive pulldown)에 의해 접지로 연결되는 net tri1 저항성 pullup (resistive pullup)에 의해 전원으로 연결되는 net trireg 물리적인 net에 저장되는 전하를 모델링하는 net

Net 자료형 Net 자료형 선언의 예 wire w1, w2; // declares two wires, 생략 가능 wire [7:0] bus; // a 8-bit bus wire enable=1'b0; // wire with initial value of 0 wand w3; // a scalar net of type wand tri [15:0] busa; // a three-state 16-bit bus

Net 자료형 wire와 tri 회로 구성요소들 사이의 연결에 사용 wire : 단일 게이트 또는 단일 연속 할당문에 의해 구동되는 net에 사용 tri : 3상태 net에 사용 wire/tri 1 x z

Variable 자료형 variable 자료형 ; reg, integer, real, time, realtime 절차적 할당문(procedural assignment)의 실행에 의해 그 값이 바뀌며, 할당에서부터 다음 할당까지 값을 유지 default 초기값 reg, time, integer 자료형 : x (unknown) real, realtime 자료형 : 0.0 variable이 음의 값을 할당 받는 경우, signed reg, integer, real, realtime 자료형 : 부호를 유지 unsigned reg, time 자료형 : unsigned 값으로 취급

Variable 자료형 reg 절차적 할당문에 의해 값을 받는 객체의 자료형 할당 사이의 값을 유지 하드웨어 레지스터를 모델링하기 위해 사용될 수 있음 edge-sensitive (플립플롭 등)와 level-sensitive (래치 등)의 저장소자들을 모델링할 수 있음 reg는 조합논리회로의 모델링에도 사용되므로, reg가 항상 하드웨어적인 저장소자를 의미하지는 않음 reg a; // a scalar reg reg[3:0] v; // a 4-bit vector reg made up of(from most to // least significant) v[3], v[2], v[1], and v[0] reg signed [3:0] signed_reg; // a 4-bit vector in range -8 to 7 reg [-1:4] b; // a 6-bit vector reg reg [4:0] x, y, z; // declares three 5-bit regs

Variable 자료형 D 플립플롭 2:1 MUX module dff (clk, d, q); input d ,clk; output q; reg q; always @(posedge clk) q <= d; endmodule 2:1 MUX module mux21_if(a, b, sel, out); input [1:0] a, b; input sel; output [1:0] out; reg [1:0] out; always @(a or b or sel) if(sel == 1'b0) out = a; else out = b; endmodule

Variable 자료형 integer 자료형 정수형 값을 취급하며, 절차적 할당문에 의해 값이 변경됨 signed reg로 취급되며, 연산 결과는 2의 보수가 됨 integer a; // integer value

벡터 벡터 범위지정 [msb:lsb] 을 갖는 다중 비트의 net 또는 reg 자료형 signed로 선언되거나 signed로 선언된 포트에 연결되는 경우를 제외하고는 unsigned로 취급 단일 할당문으로 값을 받을 수 있음 reg [7:0] rega; // 8-bit reg wire [15:0] d_out; // 16-bit wire data_type [msb:lsb] identifier;

벡터 parameter variable 또는 net 범주에 속하지 않는 상수값 회로의 비트 크기 또는 지연값을 지정하기 위해 사용 defparam 문 또는 모듈 인스턴스 문의 parameter overriding에 의해 값을 변경시킬 수 있음 자료형과 범위지정을 가질 수 있음 범위가 지정되지 않은 경우, 상수 값에 적합한 크기의 비트 폭을 default로 가짐 parameter msb = 7; // defines msb as a constant value 7 parameter e = 25, f = 9; // defines two constant numbers parameter [31:0] dec_const = 1'b1; // value converted to 32 bits parameter newconst = 3'h4; // implied range of [2:0] data_type [msb:lsb] identifier;

Verilog HDL의 연산자 연산자 기 능 {}, {{}} 결합, 반복 ^ 비트 단위 exclusive or ^  비트 단위 exclusive or +, -, *, /, ** 산술 ^~ 또는 ~^ 비트 단위 등가 % 나머지 &  축약 and >, >=, <, <= 관계 ~& 축약 nand ! 논리 부정 | 축약 or && 논리 and ~|  축약 nor ||  논리 or ^ 축약 xor == 논리 등가 축약 xnor != 논리 부등 << 논리 왼쪽 시프트 ===  case 등가 >> 논리 오른쪽 시프트 !== case 부등 <<< 산술 왼쪽 시프트 ~ 비트 단위 부정 >>> 산술 오른쪽 시프트 & 비트 단위 and ? : 조건 비트 단위 inclusive or or Event or

Verilog HDL의 연산자 실수형 수식에 사용될 수 있는 연산자 연산자 기 능 +, -, *, /, ** 산술 || ||  논리 or +, - 부호 == 논리 등가 >, >=, <, <= 관계 != 논리 부등 ! 논리 부정 ? : 조건 && 논리 and or Event or

Verilog HDL의 연산자 연산자 우선 순위

산술 연산자 피연산자의 비트에 x (unknown)나 z (high-impedance)가 포함된 경우에는 전체 결과 값은 x가 됨 나누기와 나머지 연산자에서 두번째 피연산자가 0인 경우, 결과값은 x가 됨 나머지 연산자의 결과 값은 첫번째 피연산자의 부호를 따름 거듭제곱 연산자에서 다음의 경우에는 결과 값이 정의되지 않음 첫번째 피연산자가 0이고 두 번째 피연산자가 양수가 아닌 경우 첫번째 피연산자가 음수이고 두 번째 피연산자가 정수 값이 아닌 경우 기  호 기  능 + 더하기 -  빼기 *  곱하기 / 나누기(몫) % 나머지(modulo) ** 거듭제곱(power)

산술 연산자 산술 연산자에서의 자료형 해석 자료형 해 석 unsigned net Unsigned signed net  Signed, 2’s complement unsigned reg signed reg integer

산술 연산자 예 integer intA; reg [15:0] regA; reg signed [15:0] regS; intA = -4'd12; regA = intA / 3; // 결과 값은 -4 // intA는 integer 자료형이고, regA는 65532 regA = -4'd12; // regA는 65524 intA = regA / 3; // 결과 값은 21841

관계 연산자 산술 연산자보다 낮은 우선 순위를 가짐 피연산자의 비트에 x (unknown)나 z(high-impedance)가 포함된 경우에는 결과 값은 1비트의 x가 됨 두 피연산자의 비트 수가 다른 경우에는, 비트 수가 작은 피연산자의 MSB 쪽에 0이 채워져 비트 수가 큰 피연산자에 맞추어진 후, 관계를 판단함 피연산자 중 하나가 실수형이면 다른 피연산자가 실수형으로 변환된 후, 비교됨 관계 연산자 식 의 미 a < b  a가 b보다 작다 a > b  a가 b보다 크다 a <= b  a가 b보다 작거나 같다 a >= b  a가 b보다 크거나 같다

관계 연산자 예 // A = 9, B = 4 // D = 4'b1001, E = 4'b1100, F = 4'b1xxx E >= D // 결과 값은 참(1) E < F // 결과 값은 x

등가 연산자 관계 연산자 보다 낮은 우선순위를 가짐 피연산자의 비트끼리 비교 두 피연산자의 비트 수가 다른 경우에는, 비트 수가 작은 피연산자의 MSB 쪽에 0이 채워져 비트 수가 큰 피연산자에 맞추어진 후, 등가를 판단함 case equality와 case inequality 연산자(===, !==)는 대부분의 EDA 툴에서 논리합성이 지원되지 않으므로, 합성을 위한 RTL 수준의 모델링에는 사용하지 않는 것이 좋음 관계 연산자 식 의 미 a === b  a와 b는 같다. (x와 z가 포함된 일치를 판단) a !== b  a와 b는 같지 않다. (x와 z가 포함된 불일치를 판단) a == b a와 b는 같다. (결과가 x가 될 수 있음) a != b a와 b는 같지 않다. (결과가 x가 될 수 있음)

등가연산자 예 // A = 9, B = 4 // D = 4'b1001, E = 4'b1100 // F = 4'b1xxz, G = 4'b1xxz, H = 4'b1xxx A === B // 결과 값은 거짓(0) D != E // 결과 값은 참(1) D == F // 결과 값은 x F === G // 결과 값은 참(1) F === H // 결과 값은 거짓(0) G !== H // 결과 값은 참(1)

논리 연산자 참 또는 거짓의 판단이 모호한 경우에는 결과값은 x 예 // A = 3, B = 0, C = 2'b0x, D = 2'b10인 경우에, A && B // 결과 값은 0 A || B // 결과 값은 1 !A // 결과 값은 0 !B // 결과 값은 1 C && D // 결과 값은 x 논리 연산자 식 의 미 a && b  a와 b의 논리 AND a || b  a와 b의 논리 OR !a a의 부정 (NOT a)

비트 연산자 피연산자의 해당 비트들에 대한 연산을 수행 피연산자의 비트 수가 같지 않으면, 비트 수가 작은 피연산자의 MSB 위치에 0이 채워진 후, 연산됨 비트 and 연산자 비트 or 연산자

비트 연산자 비트 xnor 연산자 비트 xor 연산자 비트 부정 연산자

비트 연산자 예 // D = 4'b1001, E = 4'b1101, F = 4'b10x1 ~D // 결과 값은 4'b0110 D & E // 결과 값은 4'b1001 D | E // 결과 값은 4'b1101 D ^ E // 결과 값은 4'b0100 D ~^ E // 결과 값은 4'b1011 D & F // 결과 값은 4'b10x1

시프트 연산자 예 논리 시프트 연산자 ( <<, >> ) << : 우측 피연산자 값만큼 좌측으로 시프트 후, 비어 있는 비트에 0을 채움 >> : 우측 피연산자 값만큼 우측으로 시프트 후, 비어 있는 비트에 0을 채움 산술 시프트 연산자 ( >>>, <<< ) <<< : 우측 피연산자 값만큼 좌측으로 시프트 후, 비어 있는 비트에 0을 채움 >>> : 우측 피연산자 값만큼 우측으로 시프트 후, 비어 있는 비트에 좌측 피연산자의 MSB를 채움 우측 피연산자 x 또는 z가 포함된 경우, 시프트 연산의 결과 값은 x 항상 unsigned 수 예 // A = 4'b1100 B = A >> 1 // 오른쪽으로 1비트 시프트, 결과 값은 B=4'b0110 C = A << 1 // 왼쪽으로 1비트 시프트, 결과 값은 B=4'b1000

조건 연산자 조건 연산자 expression1이 참(1, 즉 0, x 또는 z가 아닌 값)으로 평가되면 expression2의 값이 좌변의 변수에 할당 expression1이 거짓(0)으로 평가되면 expression3의 값이 좌변의 변수에 결과 값으로 할당 expression1이 x 또는 z이면(즉, 참 또는 거짓을 판단할 수 없는 모호성이 존재하는 경우), expression2와 expression3을 함께 평가하여 비트 단위로 비교된 값이 좌변의 변수에 할당 expression3이 real 형 값이 아니면 결과 값은 비트 단위로 비교되어 결정되며, real 형 값인 경우에는 결과 값은 0이 됨 예 wire [15:0] busa = drive_busa ? data : 16'bz; conditional_expression ::= expression1 ? expression2 : expression3

결합 연산자 예 결합 연산자 중괄호 { }에 의해 묶인 두 개 이상의 표현이 갖는 비트들을 결합 중괄호 { }에 의해 묶인 두 개 이상의 표현이 갖는 비트들을 결합 결합되는 피연산자들은 각각의 크기를 결정할 수 있어야 결합이 가능 unsized 상수는 결합 연산자로 결합시킬 수 없음 예 {a, b[3:0], w, 3'b101} //결합 연산자의 결과 {a, b[3], b[2], b[1], b[0], w, 1'b1, 1'b0, 1'b1}

게이트 프리미티브 gate primitives 인스턴스 구문 #(n1,n2) : 게이트 프리미티브의 지연. default 지연값은 0 n1 : 상승지연, n2 : 하강지연 min(n1, n2) : 출력이 x (unknown)로 변할 때의 지연 instance_name : 생략 가능 포트 연결 : 순서에 의한 매핑만 사용 가능 (이름에 의한 포트 매핑 불가능) 출력 포트가 처음에 오며, 입력 신호들은 임의의 순서로 나열 primitive_gate_name [#(n1,n2)][instance_name](output, input1, ..);

게이트 프리미티브 예 and U1(out1, a, b); // 2입력 and 게이트 nand (out2, a, b); // 인스턴스 이름을 생략한 경우 or U3(out3, a, b, c); // 3입력 or 게이트 nor #(2) U4(out4, a, b); // 2입력 nor 게이트 xor #(3, 4) U5(out5, c, b, a); // 3입력 xor 게이트 xnor U6(out6, a, b); // 2입력 xnor 게이트 nor #2 G5(y5, a0, a1), (y6, a1, a2), (y7, a2, a3); // multiple instantiations

게이트 프리미티브 예) 게이트 프리미티브를 이용한 1비트 전가산기 모델링 a b cin s1 c1 c2 sum cout module full_adder_g(a, b, cin, sum, cout); input a, b, cin; output sum, cout; wire s1, c1, c2; xor (s1, a, b); and (c1, a, b); and G3 (c2, s1, cin); xor G4 (sum, s1, cin); xor G5 (cout, c1, c2); endmodule a b cin s1 c1 c2 sum cout

buf와 not 게이트 프리미티브 예 buf b1(out1, out2, in); not #5 inv(out, in); input output input output

3상태 버퍼 프리미티브 예 3상태 버퍼 프리미티브 포트 연결 : 3개의 지연값 지정 : #(n1, n2, n3) 순서에 의한 매핑만 사용 가능 출력 포트, 데이터 입력 포트, 제어 입력 포트의 순서로 매핑 3개의 지연값 지정 : #(n1, n2, n3) n1 : 상승지연, n2 : 하강지연, n3 : z로 변할 때의 지연 min(n1, n2, n3) : 출력이 x로 변할 때의 지연 2개의 지연값 지정 : #(n1, n2) n1 : 상승지연, n2 : 하강지연 min(n1, n2) : 출력이 x 또는 z로 변할 때의 지연 예 bufif0 bf0(out0, in, control); bufif1 #(10,12,11) bf1(out1, in, control);

3상태 버퍼 프리미티브 L : 0 또는 z가 될 수 있는 unknown H : 1 또는 z가 될 수 있는 unknown bufif1 게이트 bufif0 게이트 data out control data out control L : 0 또는 z가 될 수 있는 unknown H : 1 또는 z가 될 수 있는 unknown

3상태 버퍼 프리미티브 notif1 게이트 notif0 게이트 data out control data out control

게이트 지연과 net 지연 게이트 지연 net 지연 관성지연(inertial delay) 게이트의 입력에서부터 출력까지의 신호 전달지연 (propagation delay) 상승지연, 하강지연, 턴-오프 (turn-off) 지연 defualt 값은 0 net 지연 net를 구동하는 driver의 값이 변하는 시점부터 net의 값이 갱신되는 시점까지 소요되는 시간 관성지연(inertial delay) 지정된 지연 값보다 입력 신호의 변화 폭이 작은 경우에는 입력 신호가 출력에 영향을 미치지 않음 Verilog HDL의 default 지연

게이트 지연과 net 지연 From value: To value: 2개의 지연 값(d1, d2)이 사용된 경우 3개의 지연 값(d1, d2, d3)이 1 d1 x min(d1, d2) min(d1, d2, d3) z d3 d2

게이트 지연과 net 지연 예 module inertial_delay_gate(); reg a, b; and #30(out, a, b); initial begin a = 1'b0; b = 1'b0; #50 a = 1'b1; b = 1'b1; #50 a = 1'b0; #20 b = 1'b0; #50; end endmodule

할당문 할당문 연속 할당문 : net형 객체에 값을 할당 절차형 할당문 : variable형 객체에 값을 할당 assign 문 절차형 할당문 : variable형 객체에 값을 할당 always 블록, initial 블록, task, function 내부의 할당문 blocking 할당문 : 할당기호 = 을 사용 nonblocking 할당문 : 할당기호 <= 을 사용 절차형 연속 할당문 (Procedural Continuous Assignment; PCA) assign - deassign 문, force - release 문 continuous_assign ::= assign [driving_strength] [delay] net_assignments;

좌변 (Left-hand Side; LHS) 할당문 할당문 좌변의 형태 할당문 형태 좌변 (Left-hand Side; LHS) 연속 할당 Net (vector or scalar) Constant bit select of a vector net Constant part select of a vector net Constant indexed part select of a vector net Concatenation of any of the above four LHS 절차형 할당 Variables (vector or scalar) Bit-select of a vector reg, integer, or time variable Constant part select of a vector reg, integer, or time variable Memory word Indexed part select of vector reg, integer, or time variable Concatenation of regs; bit or part selects of regs

할당문 예 연속 할당문 함축적(implicit) 연속 할당문 assign 문을 이용하여 net형 객체에 값을 할당 우변의 값에 변화(event)가 발생했을 때 좌변의 객체에 값의 할당이 일어남 단순한 논리 표현을 이용한 조합논리회로 모델링에 이용 함축적(implicit) 연속 할당문 net 선언문에 연속 할당문을 포함시킨 경우 예 wire mynet = enable & data; wire mynet; assign mynet = enable & data;

할당문 예) 연속 할당문을 이용한 4비트 가산기 module adder (sum_out, carry_out, carry_in, ina, inb); output [3:0] sum_out; output carry_out; input [3:0] ina, inb; input carry_in; assign {carry_out, sum_out} = ina + inb + carry_in; endmodule

할당 지연과 net 지연 예 연속 할당문의 지연값 지정 assign #10 wireA = a & b; net 지연 우변 피연산자 값의 변화에서부터 그 값이 좌변에 할당되기까지의 시간 간격을 지정 예 assign #10 wireA = a & b; net 지연 net 선언문에서 지연 값을 지정 지정된 net 지연이 경과한 후에 할당이 이루어 짐 해당 net를 구동하는 모든 구동자 (게이트 프리미티브, 연속 할당문 등)에 영향을 미침 wire #10 wireA;

할당 지연과 net 지연 관성지연 (inertial delay) Verilog HDL의 default 지연 지정된 지연 값보다 입력 신호의 변화 폭이 작은 경우, 입력 신호의 변화가 출력에 영향을 미치지 않음 관성지연은 게이트 수준 모델링에도 동일하게 적용 관성지연의 적용 과정 ① 우변 수식의 값이 평가된다. ② 평가된 우변의 값이 좌변에 할당 예정된 값과 다르면, 현재 예정된 할당 event가 취소된다. ③ 새로운 우변의 값이 좌변의 현재 값과 동일하면 할당을 위한 event가 예정되지 않는다. ④ 새로운 우변의 값이 좌변의 현재 값과 다르면, 지연이 계산되고 주어진 지연 후에 새로운 할당 event가 일어나도록 예정된다.

절차형 할당문 절차형 할당문 함축적 변수 할당문 reg, integer, real, time, realtime 등 variable에 값을 갱신 지연을 갖지 않으며, 다음 절차형 할당문에 의해 값이 갱신될 때까지 변수에 할당된 값을 유지 always, initial, task, function 등의 프로시저(procedure) 내부에서 사용 문장의 실행에 의해 좌변 variable에 값이 할당되는 소프트웨어적인 특성 우변 수식의 event 발생과는 무관 할당문들의 순서가 시뮬레이션 결과에 영향을 미칠 수 있음 함축적 변수 할당문 variable 선언문에서 variable에 대한 초기 값을 설정 배열에 대한 함축적 변수 할당은 허용되지 않음

절차형 할당문 예 module proc_assignment(a, b, c, out); input a, b; output out; reg out, c; always @(posedge c) begin c = a & b; // blocking assignment out <= c; // nonblocking assignment end endmodule

always 구문 행위수준 모델링 always 구문 조합논리회로와 순차논리회로의 설계, 설계된 회로의 시뮬레이션을 위한 테스트벤치의 작성에 사용 always 구문, initial 구문, task, function 내부에 사용 always 구문 @(sensitivity_list)는 always 문의 실행을 제어 sensitivity_list (감지신호목록)에 나열된 신호들 중 하나 이상에 변화(event)가 발생했을 때 always 내부에 있는 begin-end 블록의 실행이 트리거됨 begin-end 블록은 절차형 문장들로 구성 blocking 할당문 또는 nonblocking 할당문에 따라 실행 방식이 달라짐 시뮬레이션이 진행되는 동안 무한히 반복 실행됨 always [@(sensitivity_list)] begin blocking_or_nonblocking statements; end

always 구문 예) 2입력 OR 게이트 module sample(a, b, out); input a, b; output out; reg out; always @(a or b) begin if(a==1 || b==1) out = 1; // blocking 할당문 else out = 0; // blocking 할당문 end endmodule

always 구문 예) D 플립플롭 module dff(clk, din, qout); input clk, din; output qout; reg qout; always @(posedge clk) qout <= din; // Non-blocking 할당문 endmodule

always 구문 always 구문의 sensitivity_list (감지신호목록) 조합논리회로 모델링 순차회로 모델링 예 일부 신호가 감지신호목록에서 빠지면, 합성 이전의 RTL 시뮬레이션 결과와 합성 후의 시뮬레이션 결과가 다를 수 있음 함축적 감지신호 표현 (@*)을 사용 가능 순차회로 모델링 동기식 셋/리셋을 갖는 경우 : 클록신호만 포함 비동기식 셋/리셋을 갖는 경우 : 클록신호, 셋, 리셋신호를 포함 예 always @(*) // equivalent to @(a or b or c or d or f) y =(a & b) |(c & d) | f;

always 구문 예) 감지신호 목록에 sel이 빠진 경우 module mux21_bad(a, b, sel, out); input [1:0] a, b; input sel; output [1:0] out; reg [1:0] out; always @(a or b) // sel is omitted if(sel ==0) out = a; else out = b; endmodule

initial 구문 initial 구문 시뮬레이션이 실행되는 동안 한번만 실행 절차형 문장들로 구성되며, 문장이 나열된 순서대로 실행 논리합성이 지원되지 않으므로 시뮬레이션을 위한 테스트벤치에 사용 예 initial begin areg = 0; // initialize areg for(index = 0; index < size; index = index + 1) memory[index] = 0; //initialize memory word end initial begin blocking_or_nonblocking statements; end

절차형 할당문 절차형 할당문 reg, integer, time, real, realtime 자료형과 메모리 변수에 값을 갱신 문장이 나열된 순서대로 실행(execute)되어 할당문 좌변의 변수 값을 갱신하는 소프트웨어적 특성 연속 할당 : 피연산자 값에 변화(event)가 발생할 때마다 우변의 식이 평가되고, 그 결과 값이 좌변의 net를 구동(drive)하는 하드웨어적 특성 Blocking 할당문 할당기호 = 을 사용 Nonblocking 할당문 할당기호 <= 을 사용

Blocking 할당문 Blocking 할당문 현재 할당문의 실행이 완료된 이후에 그 다음의 할당문이 실행되는 순차적 흐름을 가짐 예 initial begin rega = 0; // reg형 변수에 대한 할당 regb[3] = 1; // 단일 비트에 대한 할당 regc[3:5] = 7; // 부분 비트에 대한 할당 mema[address] = 8'hff; // 메모리 요소에 대한 할당 {carry, acc} = rega + regb; // 결합에 대한 할당 end reg_lvalue = [delay_or_event_operator] expression;

Blocking 할당문 예 module blk1; output out; reg a, b, clk; initial begin end always clk = #5 ~clk; always @(posedge clk) begin a = b; // a=1 b = a; // b=a=1 endmodule

Nonblocking 할당문 Nonblocking 할당문 나열된 할당문들이 순차적 흐름에 대한 blocking 없이 정해진 할당 스케줄 (assignment scheduling)에 의해 값이 할당 할당문들은 우변이 동시에 평가된 후, 문장의 나열 순서 또는 지정된 지연 값에 따른 할당 스케줄에 의해 좌변의 객체에 값이 갱신 동일 시점에서 변수들의 순서나 상호 의존성에 의해 할당이 이루어져야 하는 경우에 사용 reg_lvalue <= [delay_or_event_operator] expression;

Nonblocking 할당문 예 module non_blk1; output out; reg a, b, clk; initial begin a = 0; b = 1; clk = 0; end always clk = #5 ~clk; always @(posedge clk) begin a <= b; b <= a; endmodule

Nonblocking 할당문 예) blocking 할당문과 nonblocking 할당문이 지연을 갖는 경우 module non_block2; reg a, b, c, d, e, f; //blocking assignments with intra-assignment delay initial begin a = #10 1; // a will be assigned 1 at time 10 b = #2 0; // b will be assigned 0 at time 12 c = #4 1; // c will be assigned 1 at time 16 end //non-blocking assignments with intra-assignment delay d <= #10 1; // d will be assigned 1 at time 10 e <= #2 0; // e will be assigned 0 at time 2 f <= #4 1; // f will be assigned 1 at time 4 endmodule

if 조건문 예 if(index > 0) // IF-1 if(rega > regb) // IF-2 result = rega; else // else of the IF-2 result = regb; if(index > 0) begin // IF-1 if(rega > regb) result = rega; // IF-2 end else result = regb; // else of the IF-1

if 조건문 예) if 조건문을 이용한 2:1 MUX module mux21_if(a, b, sel, out); input [1:0] a, b; input sel; output [1:0] out; reg [1:0] out; always @(a or b or sel) if(sel == 1'b0) // 또는 if(!sel) out = a; else out = b; endmodule

if 조건문 예) 비동기 set/reset을 갖는 D 플립플롭 module dff_sr_async(clk, d, rb, sb, q, qb); input clk, d, rb, sb; output q, qb; reg q; always @(posedge clk or negedge rb or negedge sb) begin if(rb==0) q <= 0; else if(sb==0) q <= 1; else q <= d; end assign qb = ~q; endmodule

case 조건문 case 문 case(expression) case 조건식의 값과 일치하는 case_item의 문장이 실행 각 비트가 0, 1, x, z를 포함하여 정확히 같은 경우에만 일치로 판단 case 문의 조건식과 모든 case_item의 비트 크기는 큰 쪽에 맞추어져야 함 모든 case_item들에 대한 비교에서 일치되는 항이 없는 경우에는 default 항이 실행 default 항이 없으면 변수는 이전에 할당받은 값을 유지 하나의 case 문에서 여러 개의 default를 사용하는 것은 허용되지 않음 case(expression) case_item {, case_item} : statement_or_null; | default [:] statement_or_null; endcase

case 조건문 예) case문을 이용한 2:1 MUX module mux21_case(a, b, sel, out); input [1:0] a, b; input sel; output [1:0] out; reg [1:0] out; always @(a or b or sel) begin case(sel) 0 : out = a; 1 : out = b; endcase end endmodule

case 조건문 예) case문을 이용한 디코더 reg [15:0] rega; reg [9:0] result; always @(rega) begin case(rega) 16'd0: result = 10'b0111111111; 16'd1: result = 10'b1011111111; 16'd2: result = 10'b1101111111; 16'd3: result = 10'b1110111111; 16'd4: result = 10'b1111011111; 16'd5: result = 10'b1111101111; 16'd6: result = 10'b1111110111; 16'd7: result = 10'b1111111011; 16'd8: result = 10'b1111111101; 16'd9: result = 10'b1111111110; default: result = 10'bx; endcase end

case 조건문 예) case문을 이용한 x와 z의 처리 case(select[1:2]) 2'b00 : result = 0; 2'b01 : result = flaga; 2'b0x, 2'b0z : result = flaga ? 'bx : 0; 2'b10 : result = flagb; 2'bx0, 2'bz0 : result = flagb ? 'bx : 0; default : result = 'bx; endcase

case 조건문 don't care를 갖는 case 문 casez 문 : z를 don’t - care로 취급하여 해당 비트를 비교에서 제외 don't – care 조건으로 ? 기호 사용 가능 casex 문 : x와 z를 don’t - care로 취급하여 해당 비트를 비교에서 제외 예 reg [7:0] ir; casez(ir) 8'b1???????: instruction1(ir); 8'b01??????: instruction2(ir); 8'b00010???: instruction3(ir); 8'b000001??: instruction4(ir); endcase

case 조건문 예) casex문을 사용한 3비트 우선순위 인코더 module pri_enc_casex(encode, enc); input [3:0] encode; output [1:0] enc; reg [1:0] enc; always @(encode) begin casex(encode) 4'b1xxx : enc = 2'b11; 4'b01xx : enc = 2'b10; 4'b001x : enc = 2'b01; 4'b0001 : enc = 2'b00; endcase end endmodule

반복문 반복문 forever 문:문장이 무한히 반복적으로 실행 repeat 문:지정된 횟수만큼 문장이 반복 실행 반복 횟수를 나타내는 수식이 x 또는 z로 평가되면 반복 횟수는 0이 되고, 문장은 실행되지 않음 while 문:조건식의 값이 거짓이 될 때까지 문장이 반복 실행 조건식의 초기값이 거짓이면 문장은 실행되지 않음 for 문:반복 횟수를 제어하는 변수에 의해 문장이 반복 실행 forever statement; | repeat(expression) statement; | while(expression) statement; | for(variable_assign); expression; variable_assign) statement;

반복문 예) for문을 이용한 8비트 우선순위 인코더 module enc_for(in, out); input [7:0] in; output [2:0] out; reg [2:0] out; integer i; always @(in) begin : LOOP out=0; for(i = 7; i >= 0; i = i-1) begin if(in[i]) begin out=i; disable LOOP; end endmodule 입력 in[7:0] 출력 out[2:0] 0000_0001 000 0000_0010 001 0000_0100 010 0000_1000 011 0001_0000 100 0010_0000 101 0100_0000 110 1000_0000 111

반복문 예) for문을 이용한 8비트 우선순위 인코더

절차형 할당의 타이밍 제어 절차형 할당의 실행 제어 지연 제어 : event 제어 delay operator : # 특정 절차형 할당문의 실행 순서가 된 시점과 그 문장이 실제 실행되는 시점 사이의 시간 간격을 지정 (문장의 실행을 지연시킴) 지연 값이 x 또는 z인 경우에는 지연이 0으로 처리 음수 지연 값이 지정된 경우에는 2의 보수 unsigned 정수로 해석 예 #10 rega = regb; #d rega = regb; // d is defined as a parameter #((d+e)/2) rega = regb; // delay is average of d and e event 제어 event operator : @ 시뮬레이션 event가 발생될 때까지 문장의 실행을 지연시킴 net나 변수의 값 변화가 순차문의 실행을 트리거하기 위한 event로 사용 가능

절차형 할당의 타이밍 제어 에지 천이 검출 negedge:1에서 0, x, z로 변화, 또는 x, z에서 0으로 변화에서 event 발생 posedge:0에서 x, z, 1로 변화, 또는 x, z에서 1로 변화에서 event 발생 event 발생 수식의 결과가 1비트 이상인 경우에는, 에지 천이는 결과의 LSB에서 검출

절차형 할당의 타이밍 제어 delay_control ::= # delay_value | #( mintypmax_expression ) delay_or_event_control ::= delay_control | event_control | repeat( expression ) event_control event_control ::= @ event_identifier | @( event_expression ) | @* | @(*) event_expression ::= expression | hierarchical_identifier | posedge expression | negedge expression | event_expression or event_expression | event_expression, event_expression

절차형 할당의 타이밍 제어 예) 상승 에지로 동작하는 D 플립플롭 module dff(clk, d, q); input clk, d; output q; reg q; always @(posedge clk) q <= d; endmodule

절차형 할당의 타이밍 제어 event or 연산자 wait 문 다수의 event들은 키워드 or 또는 콤마(,)로 결합 예 always @(posedge clk_a or posedge clk_b or trig) rega = regb; always @(posedge clk_a, posedge clk_b, trig) rega = regb; wait 문 조건을 평가하여 참이면 wait 문에 속하는 절차형 할당문이 실행되며, 조건이 거짓이면 절차형 할당문의 실행이 중지 begin wait(!enable) #10 a = b; #10 c = d; end wait(expression) statement_or_null;

블록문 블록문 두 개 이상의 문장을 그룹으로 묶어 구문적으로 하나의 문장처럼 처리 begin-end 절차형 할당문 블록 문장이 나열된 순서에 의해 순차적으로 실행 시작시간 : 첫번째 문장이 실행될 때 종료시간 : 마지막 문장이 실행될 때 각 절차형 할당문의 실행은 이전 문장의 지연시간에 대해 상대적으로 결정됨 fork-join 병렬문 블록 문장의 나열 순서에 무관하게 동시에 실행 시작시간 : 블록 내의 모든 문장의 시작 시간이 동일 종료시간 : 각 문장의 지연이 고려되어 시간적으로 마지막에 실행되는 문장의 실행이 완료된 시점 각 문장의 지연은 블록에 들어가는 시뮬레이션 시간을 기준으로 결정됨 시뮬레이션 파형 생성에 유용함

블록문 예) begin-end 블록문 parameter d = 50; reg [7:0] r; begin // a waveform controlled by sequential delay #d r = 8'h35; #d r = 8'hE2; #d r = 8'h00; #d r = 8'hF7; #d -> end_wave; //trigger an event called end_wave end

블록문 예) fork-join 등 가 코 드 #250 -> end_wave; fork #50 r = 8'h35; #100 r = 8'hE2; #150 r = 8'h00; #200 r = 8'hF7; #250 -> end_wave; join #250 -> end_wave; 등 가 코 드

모듈 Verilog HDL 모듈의 구성 port 선언 reg 선언 wire 선언 parameter 선언 하위모듈 인스턴스 module module_name (port_list); endmodule 하위모듈 인스턴스 게이트 프리미티브 always 문, initial 문 assign 문 function, task 정의 function, task 호출 port 선언 reg 선언 wire 선언 parameter 선언 머리부 선언부 몸체

모듈 포트 선언 모듈 포트 선언 포트목록에 나열된 포트들은 선언부에서 포트선언을 통해 input, output, inout(양방향)으로 선언 signed와 범위에 대한 정의를 포함한 포트에 관한 모든 다른 속성들이 포트선언에 포함될 수 있음 inout_declaration ::= inout [ net_type ][ signed ][ range ] list_of_port_identifiers input_declaration ::= input [ net_type ][ signed ][ range ] list_of_port_identifiers output_declaration ::= output [ net_type ][ signed ][ range ] ist_of_port_identifiers | output [ reg ][ signed ][ range ] list_of_port_identifiers | output reg [ signed ][ range ] list_of_variable_port_identifiers | output [ output_variable_type ] list_of_port_identifiers | output output_variable_type list_of_variable_port_identifiers list_of_port_identifiers ::= port_identifier { , port_identifier }

모듈 포트 선언 예) 기본적인 모듈 포트 선언 module test(a, b, c, d, e, f, g, h); input [7:0] a, b; // no explicit declaration - net is unsigned input signed [7:0] c, d; // no explicit net declaration - net is signed output [7:0] e, f; // no explicit declaration - net is unsigned output signed [7:0] g, h; // no explicit net declaration - net is signed wire signed [7:0] b; // port b inherits signed attribute from net decl. wire [7:0] c; // net c inherits signed attribute from port reg signed [7:0] f; // port f inherits signed attribute from reg decl. reg [7:0] g; // reg g inherits signed attribute from port

모듈 포트 선언 목록 포트 선언목록 포트 선언목록에서 포트를 선언 포트 선언목록으로 선언된 포트들은 모듈의 선언부에서 재선언되지 않음 예 module test( input [7:0] a, input signed [7:0] b, c, d, output [7:0] e, output signed reg [7:0] f, g, output signed [7:0] h ) ; // illegal to redeclare any ports of the module in the body of the module.

모듈 인스턴스 구조적 모델링 포트순서에 의한 포트 매핑 포트이름에 의한 포트 매핑 .port_name([expression]) 다른 모듈의 인스턴스와 포트 매핑을 통한 모델링 범위 지정을 통한 인스턴스 배열의 생성 가능 모듈 인스턴스 이름은 생략할 수 없음 게이트 프리미티브의 인스턴스 이름은 생략 가능 포트순서에 의한 포트 매핑 모듈의 포트목록에 나열된 포트 순서와 1:1로 대응되어 연결 포트에 연결되는 신호가 없는 경우에는 해당 위치를 빈칸으로 남겨 둔다 포트이름에 의한 포트 매핑 포트 이름과 그 포트에 연결되는 신호 이름을 명시적으로 지정 포트의 비트 선택, 부분 선택, 결합 등을 사용할 수 없음 .port_name([expression])

모듈 인스턴스 module_instantiation ::= module_identifier [ parameter_value_assignment ] module_instance { , module_instance } ; parameter_value_assignment ::= # ( list_of_parameter_assignments ) list_of_parameter_assignments ::= ordered_parameter_assignment { , ordered_parameter_assignment } | named_parameter_assignment { , named_parameter_assignment } ordered_parameter_assignment ::= expression named_parameter_assignment ::= .parameter_identifier ( [ expression ] ) module_instance ::= name_of_instance ( [ list_of_port_connections ] ) name_of_instance ::= module_instance_identifier [ range ] // for instance array list_of_port_connections ::= ordered_port_connection { , ordered_port_connection } | named_port_connection { , named_port_connection } ordered_port_connection ::= { attribute_instance } [ expression ] named_port_connection ::= { attribute_instance } .port_identifier ( [ expression ] )

모듈 인스턴스 예) 순서에 의한 포트 매핑 예) 이름에 의한 포트 매핑 module topmod; wire [4:0] v; wire c, w; modB b1(v[0], v[3], w, v[4]); endmodule 예) 이름에 의한 포트 매핑 wire a,b,c,w; modB b1(.wb(v[3]), .wa(v[0]), .d(v[4]), .c(w));

모듈 인스턴스 예) 1비트 전가산기 회로의 구조적 모델링 a temp_sum b sum cin cout temp_c1 Half //반가산기 모듈 module half_adder(a, b, sum, cout); input a, b; output sum, cout; wire cout_bar; //생략 가능 (1-bit wire) xor U0 (sum, a, b); nand (cout_bar, a, b); // 인스턴스 이름 생략 가능 (gate primitive) not U1 (cout, cout_bar); endmodule Half Adder a b sum cout cin temp_sum temp_c1 temp_c2

모듈 인스턴스 //1비트 전가산기 모듈 module full_adder(a, b, cin, sum, cout); input a, b, cin; output sum, cout; wire temp_sum, temp_c1, temp_c2; //생략 가능 // half_adder 모듈의 instantiation half_adder u0(a, b, temp_sum, temp_c1); // 순서에 의한 포트 연결 half_adder u1(.a(temp_sum), .b(cin), .sum(sum), .cout(temp_c2) ); // 이름에 의한 포트 연결 or u2(cout, temp_c1, temp_c2); // 게이트 프리미티브 인스턴스 endmodule

모듈 인스턴스 // 1비트 full_adder 모듈의 시뮬레이션 testbench module tb_full_adder ; reg a, b, cin; // initial 블록에서 값을 받으므로 reg로 선언 integer k; // full_adder 모듈의 instantiation full_adder U0(a, b, cin, sum, cout); // 시뮬레이션을 위한 파형 생성 initial begin forever for(k = 0; k < 8; k = k+1) begin cin = k/4; b =(k%4)/2; a = k%2; #10; end endmodule

모듈 인스턴스 예) 1비트 전가산기 시뮬레이션 결과

목차 Verilog HDL 문법 논리 게이트 설계 AND Gate NAND Gate

AND Gate 출력은 논리 입력의 곱과 같음. A B X = AB 1

AND Gate 출력 두 입력에 임의의 파형을 넣었을 때의 결과

EX_BASIC_1. AND Gate 프로젝트 생성 Project Navigator 실행 File -> New Project

EX_BASIC_1. AND Gate 프로젝트 생성 프로젝트를 만들고 프로젝트를 실행할 폴더를 생성한다. EX_BASIC_1 HDL 선택 Next button Click

EX_BASIC_1. AND Gate 프로젝트 생성 FPGA Chip Select All Select Spartan3 Select XC3S200 Select P208 Select -4 Select Tool Select XST (VHDL/Verilog) Select ISim(VHDL/Veilog) Select Verilog Select Next button Click

EX_BASIC_1. AND Gate 프로젝트 생성 Finish button Click

EX_BASIC_1. AND Gate 로직 설계 File -> New Click Text File Select

EX_BASIC_1. AND Gate 로직 설계 Source 작성

EX_BASIC_1. AND Gate 로직 설계 Source 저장 HB_AND2.V

EX_BASIC_1. AND Gate 로직 설계 Source 프로젝트에 추가 Project -> Add Source HB_AND2.V 선택

EX_BASIC_1. AND Gate 로직 설계 Source 추가 확인

EX_BASIC_1. AND Gate 컴파일 Synthesize - XST Compile

EX_BASIC_1. AND Gate 컴파일 Implement Design Compile

EX_BASIC_1. AND Gate 컴파일 New Source... Select

EX_BASIC_1. AND Gate 핀 설정 Select Source Type Next button Select Implementation Constraints File 선택 File name : HB_AND2 Next button Select

EX_BASIC_1. AND Gate 핀 설정 Finish button Click

EX_BASIC_1. AND Gate 핀 설정 File -> Open HB_AND2.ucf 파일 선택

EX_BASIC_1. AND Gate 핀 설정 핀 설정에 대한 사항을 왼쪽과 같이 적는다. Save NET “포트이름” LOC = “P핀번호”; 포트 이름 핀 번호 하드웨어 설명 A 63 SW1 X 191 LED1 B 67 SW2  

EX_BASIC_1. AND Gate 컴파일 Implement Design을 실행시켜 다시 컴파일 한다.

EX_BASIC_1. AND Gate 시뮬레이션 Simulation을 선택

EX_BASIC_1. AND Gate 시뮬레이션 Verilog HDL Module 이름을 선택한 다음 마우스 오른쪽 버튼을 클릭하여 New Source...항목 선택한다.

EX_BASIC_1. AND Gate 시뮬레이션 Select Source Type Verilog Test Fixture File name : HB_AND2_TB Next button Click

EX_BASIC_1. AND Gate 시뮬레이션 Next button Click

EX_BASIC_1. AND Gate 시뮬레이션 Finish button Click

EX_BASIC_1. AND Gate 시뮬레이션 기본으로 작성된 Test Fixture 파일 시뮬레이션 조건에 맞도록 파일 수정

EX_BASIC_1. AND Gate 시뮬레이션 시뮬레이션 파일 수정 Save

EX_BASIC_1. AND Gate 시뮬레이션 ISE 시뮬레이션 프로그램인 Isim을 이용하여 시뮬레이션 진행 Isim Simulator -> Run

EX_BASIC_1. AND Gate 시뮬레이션 시뮬레이션 결과 확인 아래 그림과 같이 전체 보기 선택

EX_BASIC_1. AND Gate 프로그래밍 implementation 선택

EX_BASIC_1. AND Gate 프로그래밍 Generate Programming File 을 실행.

EX_BASIC_1. AND Gate 프로그래밍 Manage Configuration Project (iMPACT) 실행

EX_BASIC_1. AND Gate 프로그래밍 Boundary Scan 선택

EX_BASIC_1. AND Gate 프로그래밍 File > Initialize Chain 선택 JTAG 으로 연결된 디바이스 검색

EX_BASIC_1. AND Gate 프로그래밍 FPGA에 프로그래밍할 파일 선택 Hb_and2.bit파일을 선택한다. Open button Click

EX_BASIC_1. AND Gate 프로그래밍 PROM에 프로그래밍할 파일 선택 PROM File을 생성하지 않았고, FPGA에만 다운로딩 하기 때문에 파일 선택을 하지 않는다. Cancel button Click

EX_BASIC_1. AND Gate 프로그래밍 Programming 옵션 선택 Default 설정 OK Button Click

EX_BASIC_1. AND Gate 프로그래밍 칩 모양에 마우스를 놓고 마우스 오른쪽 버튼을 눌러서 Program을 선택한다.

EX_BASIC_1. AND Gate 프로그래밍 프로그램이 완료되었고 제대로 동작했다면 Program Succeeded가 나타난다. 장비에서 동작을 확인하라.

목차 Verilog HDL 문법 논리 게이트 설계 AND Gate NAND Gate

NAND Gate AND 게이트와 NOT 연산을 조합한 결과 A B AB X = /AB 1

NAND Gate 출력 입력에 임의의 파형을 넣었을 때의 결과

EX_BASIC_2. NAND Gate 프로젝트 생성 Project Navigator 실행 File -> New Project

EX_BASIC_2. NAND Gate 프로젝트 생성 프로젝트를 만들고 프로젝트를 실행할 폴더를 생성한다. EX_BASIC_2 HDL 선택 Next button Click

EX_BASIC_2. NAND Gate 프로젝트 생성 FPGA Chip Select All Select Spartan3 Select XC3S200 Select P208 Select -4 Select Tool Select XST (VHDL/Verilog) Select ISim(VHDL/Veilog) Select Verilog Select Next button Click

EX_BASIC_2. NAND Gate 프로젝트 생성 Finish button Click

EX_BASIC_2. NAND Gate 로직 설계 File -> New Click Text File Select

EX_BASIC_2. NAND Gate 로직 설계 Source 작성

EX_BASIC_2. NAND Gate 로직 설계 Source 저장 HB_NAND2.V

EX_BASIC_2. NAND Gate 로직 설계 Source 프로젝트에 추가 Project -> Add Source HB_NAND2.V 선택

EX_BASIC_2. NAND Gate 로직 설계 Source 추가 확인

EX_BASIC_2. NAND Gate 컴파일 Synthesize - XST Compile

EX_BASIC_2. NAND Gate 컴파일 Implement Design Compile

EX_BASIC_2. NAND Gate 컴파일 New Source... Select

EX_BASIC_2. NAND Gate 핀 설정 Select Source Type Implementation Constraints File 선택 File name : HB_NAND2 Next button Select

EX_BASIC_2. NAND Gate 핀 설정 Finish button Click

EX_BASIC_2. NAND Gate 핀 설정 File -> Open HB_NAND2.ucf 파일 선택

EX_BASIC_2. NAND Gate 핀 설정 핀 설정에 대한 사항을 왼쪽과 같이 적는다. Save NET “포트이름” LOC = “P핀번호”; 포트 이름 핀 번호 하드웨어 설명 A 63 SW1 X 191 LED1 B 67 SW2  

EX_BASIC_2. NAND Gate 컴파일 Implement Design을 실행시켜 다시 컴파일 한다.

EX_BASIC_2. NAND Gate 시뮬레이션 Simulation을 선택

EX_BASIC_2. NAND Gate 시뮬레이션 Verilog HDL Module 이름을 선택한 다음 마우스 오른쪽 버튼을 클릭하여 New Source...항목 선택한다.

EX_BASIC_2. NAND Gate 시뮬레이션 Select Source Type Verilog Test Fixture 선택 File name : HB_NAND2_TB Next button Click

EX_BASIC_2. NAND Gate 시뮬레이션 Next button Click

EX_BASIC_2. NAND Gate 시뮬레이션 Finish button Click

EX_BASIC_2. NAND Gate 시뮬레이션 기본으로 작성된 Test Fixture 파일 시뮬레이션 조건에 맞도록 파일 수정

EX_BASIC_2. NAND Gate 시뮬레이션 시뮬레이션 파일 수정 Save

EX_BASIC_2. NAND Gate 시뮬레이션 ISE 시뮬레이션 프로그램인 Isim을 이용하여 시뮬레이션 진행 Isim Simulator -> Run

EX_BASIC_2. NAND Gate 시뮬레이션 시뮬레이션 결과 확인 아래 그림과 같이 전체 보기 선택

EX_BASIC_2. NAND Gate 프로그래밍 implementation 선택

EX_BASIC_2. NAND Gate 프로그래밍 Generate Programming File 을 실행.

EX_BASIC_2. NAND Gate 프로그래밍 Manage Configuration Project (iMPACT) 실행

EX_BASIC_2. NAND Gate 프로그래밍 Boundary Scan 선택

EX_BASIC_2. NAND Gate 프로그래밍 File > Initialize Chain 선택 JTAG 으로 연결된 디바이스 검색

EX_BASIC_2. NAND Gate 프로그래밍 FPGA에 프로그래밍할 파일 선택 Hb_nand2.bit파일을 선택. Open button Click

EX_BASIC_2. NAND Gate 프로그래밍 PROM에 프로그래밍할 파일 선택 PROM File을 생성하지 않았고, FPGA에만 다운로딩 하기 때문에 파일 선택을 하지 않는다. Cancel button Click

EX_BASIC_2. NAND Gate 프로그래밍 Programming 옵션 선택 Default 설정 OK Button Click

EX_BASIC_2. NAND Gate 프로그래밍 칩 모양에 마우스를 놓고 마우스 오른쪽 버튼을 눌러서 Program을 선택한다.

EX_BASIC_2. NAND Gate 프로그래밍 프로그램이 완료되었고 제대로 동작했다면 Program Succeeded가 나타난다. 장비에서 동작을 확인하라.