행위수준 모델링 Sun, Hye-Seung.

Slides:



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

변수와 조건문 빛나리 36 호 박승운. 파이썬 쉽게 사용하기 Python IDLE 사용 FILE - New File 로 파일 만들기 Run – Run Module 로 실행하기.
13 강 논리회로 2 과목 전자계산기 구조 강사 이 민 욱. 13 강 논리회로  논리회로 1. 부울 대수 (Boolean Algebra) 에서 사용하는 기본 연산자 ① 논리부정 : NOT ( ` ) 논리부정은 F = NOT A 의 표현을 F =A` 로 표현 ② 논리곱.
임진수 이현철. 회로 설계 과정 합성 ?  합성 도구가 주어진 HDL 코드를 Library 에 맞춰 회로로 변경시켜주는 과정  모든 코드가 합성되는 것은 아니다 !
HBE-COMBO II -SE VerilogHDL 실습 Lab#03 Verilog HDL
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
C 5장. 제어문 #include <stdio.h> int main(void) { int num;
5장. 순차 논리 회로 Lecture #5.
래치(latch) S R Q Q 1 기본적인 플립플롭(basic flip flop)으로 1비트의 정보를 저장할 수 있는 소자
UNIT 15 Timer & Watch Dog 로봇 SW 교육원 조용수.
Chapter 7. 조건문.
제 9 장 구조체와 공용체.
조합 논리회로 설계 및 검증 Sun, Hye-Seung.
자료형과 연산자 Sun, Hye-Seung.
Chapter09 JavaScript 구구단표 만들기
디지털논리실습 기본 논리 게이트 부울대수 조합회로.
Multiplexer 설계.
Verilog HDL 이론.
디지털 시스템 설계(3).
오브젝트 플립플롭 IT CookBook, VHDL을 이용한 디지털 회로 입문.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
순차회로 모델링 Sun, Hye-Seung.
VHDL Design : Barrel Shifter
오브젝트 조합 회로 IT CookBook, VHDL을 이용한 디지털 회로 입문.
조합논리회로 모델링 Sun, Hye-Seung.
RS 및 D 플립플롭 RS Flip Flop 래치는 어떤 입력 레벨에 의해서 제어되는 데 플립플롭은 클록 입력이라고
JK 및 T 플립플롭 JK Flip-Flop JK 플립플롭은 디지털 시스템에서 가장 많이 사용되고 있는 플립플롭으로
Data type and Object 자료형 변환 함수들은 std_logic_arith 패키지에 정의되어 있음.
고급 선택 제어문과 반복문 Chapter 9 C에서의 다중 선택 제어문 선 검사 반복 구조와 for 문
23장. 구조체와 사용자 정의 자료형 2.
Part 07 제어 구조 ©우균, 창병모 © 우균, 창병모.
디지털논리실습.
3. while문 반복문의 종류 while 문 while( 조건식 )        문장;.
VHDL Mealy and Moore model
MATLAB
JA A V W. 03.
C 언어 교육 02 주차 – scanf & 반복문과 조건문 교육부장 조하정.
어서와 C언어는 처음이지 제14장.
6장 순차회로 시스템 상태표와 상태도 래치와 플립플롭 순차 시스템의 해석.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
플립플롭, 카운터, 레지스터 순서회로 플립플롭 카운터 레지스터.
7장. 다양한 형태의 반복문. 7장. 다양한 형태의 반복문 7-1 반복문이란? 반복문의 기능 세 가지 형태의 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 7-1 반복문이란? 반복문의 기능 특정 영역을 특정 조건이 만족하는 동안에 반복.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
오브젝트 순서회로 IT CookBook, VHDL을 이용한 디지털 회로 입문.
연산자 (Operator).
논리회로 설계 및 실험 5주차.
6 레지스터와 카운터.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
6. 레지스터와 카운터.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
Choi Seong Yun 컴퓨터 프로그래밍 기초 #06 : 반복문 Choi Seong Yun
Chapter 03. 주석문과 제어문.
제 5장 제어문 Hello!! C 언어 강성호 김학배 최우영.
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
Control Flow 요약.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
[ 단원 04 ] 반복과 배열.
제 6 장 함수(functions).
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
7장. 다양한 형태의 반복문. 7장. 다양한 형태의 반복문 7-1 반복문이란? 반복문의 기능 세 가지 형태의 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 7-1 반복문이란? 반복문의 기능 특정 영역을 특정 조건이 만족하는 동안에 반복.
논리회로 설계 및 실험 4주차.
Chapter 10 데이터 검색1.
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
9 브라우저 객체 모델.
8장 선택 논리 II 1. 논리연산자 1.1 논리연산자 : AND (&&) 1.2 논리연산자 : OR (||)
제어문Control Statements
 6장. SQL 쿼리.
아날로그 신호를 디지털 신호로 변환하는 A/D 변환기 A/D 변환 시 고려하여 할 샘플링 주파수 D/A 변환기
버스와 메모리 전송 버스 시스템 레지스터와 레지스터들 사이의 정보 전송을 위한 경로
디 코 더 n비트의 2진 코드를 입력으로 받아들여 최대 2n개의 서로 다른 정보로 바꿔 주는 조합 회로
Presentation transcript:

행위수준 모델링 Sun, Hye-Seung

5.1.1 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

5.1.1 always 구문 2입력 OR 게이트 코드 5.1 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 2입력 OR 게이트 코드 5.1

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

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

5.1.1 always 구문 감지신호목록에 sel이 빠진 경우 코드 5.3 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 감지신호목록에 sel이 빠진 경우 코드 5.3

5.1.1 always 구문 always 구문이 테스트벤치에 사용되는 경우 시뮬레이션 시간의 진행에 관련된 제어가 포함되어야 함 그렇지 않으면 zero-delay 무한 루프(infinite loop)가 발생되어 교착 상태 (deadlock)에 빠지게 되어 시뮬레이션이 진행되지 않음 always clk = ~clk; // zero-delay infinite loop always #20 clk = ~clk; // 주기가 40ns인 신호 clk를 생성

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

5.1.2 initial 구문 시뮬레이션 입력벡터 생성 initial begin din = 6'b000000; // initialize at time zero #10 din = 6'b011001; // first pattern #10 din = 6'b011011; // second pattern #10 din = 6'b011000; // third pattern #10 din = 6'b001000; // last pattern end

5.1.2 initial 구문 주기 신호의 생성 코드 5.4 module behave; reg a, b; initial begin // 초기값 지정 a = 1'b1; b = 1'b0; end always #50 a = ~a; #100 b = ~b; endmodule 코드 5.4

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

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

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

5.2.2 Nonblocking 할당문 코드 5.5-(a) 코드 5.5-(b) 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 module 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; // a=1 b = a; // b=a=1 endmodule 코드 5.5-(a) 코드 5.5-(b)

Nonblocking 할당문의 시뮬레이션 결과

5.2.2 Nonblocking 할당문 코드 5.6 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 코드 5.6

5.2.2 Nonblocking 할당문 module non_block3; reg a, b, c, d, e, f; //blocking assignments with delay initial begin #10 a = 1; // a will be assigned 1 at time 10 #2 b = 0; // b will be assigned 0 at time 12 #4 c = 1; // c will be assigned 1 at time 16 end //non-blocking assignments with delay #10 d <= 1; // d will be assigned 1 at time 10 #2 e <= 0; // e will be assigned 0 at time 12 #4 f <= 1; // f will be assigned 1 at time 16 endmodule

5.2.2 Nonblocking 할당문 non_block2의 시뮬레이션 결과 non_block3의 시뮬레이션 결과

5.2.2 Nonblocking 할당문 Nonblocking 할당문의 내부 지연 코드 5.7 module multiple2; reg a; initial a = 1; initial begin a <= #4 1; // schedules a = 1 at time 4 a <= #4 0; // schedules a = 0 at time 4 #20 $stop; // At time 4, a = 0 end endmodule 코드 5.7

Nonblocking 할당문의 내부 지연을 이용한 주기 신호의 생성 module multiple; reg r1; reg [2:0] i; initial begin r1 = 0; for(i = 0; i <= 5; i = i+1) r1 <= #(i*10) i[0]; end endmodule 코드 5.8

5.3 if 조건문 if 조건문 조건식이 참 (0이 아닌 알려진 값 )이면, statement_true 부분 실행 조건식이 거짓 (0, x, z)이면, statement_false 부분 실행 else 부분이 없으면, 변수는 이전에 할당 받은 값을 유지 (latch 동작) if 문의 내포(nested) (즉, if 문 내부에 또 다른 if 문이 있는 경우) if 문 내부에 하나 이상의 else 문장이 생략되는 경우, 내부의 else 문은 이전의 가장 가까운 if와 결합됨 들여쓰기 또는 begin – end로 명확하게 표현 if(expression) statement_true; [else statement_false;]

5.3 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

5.3 if 조건문 코드 5.9 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 조건문을 이용한 2:1 멀티플렉서 코드 5.9

비동기 set/reset을 갖는 D 플립플롭 5.3 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 코드 5.10

5.3 if 조건문 코드 5.10의 시뮬레이션 결과

5.4 case 문 case 문 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

5.4 case 문 코드 5.11 case문을 이용한 2:1 멀티플렉서 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 코드 5.11

5.4 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

5.4 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 문을 이용한 x와 z의 검출 예 case(sig) 1'bz: $display("signal is floating"); 1'bx: $display("signal is unknown"); default: $display("signal is %b", sig); endcase

5.4 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

casex 문을 이용한 3비트 우선순위 인코더(priority encoder) 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 코드 5.12

5.4 case 문 코드 5.12의 시뮬레이션 결과

case 조건식에 상수 값을 사용한 3비트 우선순위 인코더 module pri_enc_case(encode, enc); input [3:0] encode; output [1:0] enc; reg [1:0] enc; always @(encode) begin case(1) encode[3]: enc = 2'b11; encode[2]: enc = 2'b10; encode[1]: enc = 2'b01; encode[0]: enc = 2'b00; default : $display("Error: One of the bits expected ON"); endcase end endmodule 코드 5.13

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

repeat 문을 이용한 shift-add 방식의 승산기 5.5 반복문 repeat 문을 이용한 shift-add 방식의 승산기 module multiplier_8b(opa, opb, result); parameter SIZE = 8, LongSize = 2*SIZE; input [SIZE-1:0] opa, opb; output [LongSize-1:0] result; reg [LongSize-1:0] result, shift_opa, shift_opb; always @(opa or opb) begin shift_opa = opa; // multiplicand shift_opb = opb; // multiplier result = 0; repeat(SIZE) begin if(shift_opb[0]) result = result + shift_opa; shift_opa = shift_opa << 1; shift_opb = shift_opb >> 1; end endmodule 코드 5.14

5.5 반복문 코드 5.14의 시뮬레이션 결과

5.5 반복문 코드 5.15 8비트 입력 rega에 포함된 1을 계수하는 회로 module cnt_one(rega, count); input [7:0] rega; output [3:0] count; reg [7:0] temp_reg; reg [3:0] count; always @(rega) begin count = 0; temp_reg = rega; while(temp_reg) begin if(temp_reg[0]) count = count + 1; temp_reg = temp_reg >> 1; end endmodule 코드 5.15

5.5 반복문 코드 5.15의 시뮬레이션 결과

for 문을 이용한 8비트 우선순위 인코더(priority encoder) 5.5 반복문 for 문을 이용한 8비트 우선순위 인코더(priority encoder) 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 8비트 우선순위 인코더 코드 5.16

5.5 반복문 코드 5.16의 시뮬레이션 결과

5.5 반복문 module tb_dff ; forever 문을 이용한 주기 신호 생성 reg clk, d; dff U1 (clk, d, q); initial begin clk = 1'b0; forever #10 clk = ~clk; end d = 1'b0; forever begin #15 d = 1'b1; #20 d = 1'b0; #30 d = 1'b1; endmodule forever 문을 이용한 주기 신호 생성

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

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

5.6 절차형 할당의 타이밍 제어 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

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

5.6 절차형 할당의 타이밍 제어 named event event 자료형으로 선언된 식별자 임의의 특정한 시간에 발생될 수 있음 지속 시간을 갖지 않음 event 제어 구문을 이용해서 event의 발생을 감지할 수 있음 event list_of_event_identifiers; // event 선언 -> event_identifier; // event trigger

5.6 절차형 할당의 타이밍 제어 코드 5.18 named event를 이용한 D 플립플롭 module ff_event(clock, reset, din, q); input reset, clock, din; output q; reg q; event upedge; // event 선언 always @(posedge clock) -> upedge; always @(upedge or negedge reset) begin if(reset==0) q = 0; else q = din; end endmodule 코드 5.18

5.6 절차형 할당의 타이밍 제어 코드 5.18의 시뮬레이션 결과

5.6 절차형 할당의 타이밍 제어 event or 연산자 다수의 event들은 키워드 or 또는 콤마(,)로 결합 wait 문 always @(posedge clk_a or posedge clk_b or trig) rega = regb; always @(posedge clk_a, posedge clk_b, trig) rega = regb; wait(expression) statement_or_null; begin wait(!enable) #10 a = b; #10 c = d; end

5.6 절차형 할당의 타이밍 제어 intra-assignment 타이밍 제어 지연과 event 제어가 순차 할당문 안에 포함 우변의 수식에 대한 평가를 먼저 실행한 후, 좌변의 객체에 새로운 값이 할당되는 시점을 지정된 지연만큼 지연시킴 blocking_assignment ::= variable_lvalue = [ delay_or_event_control ] expression nonblocking_assignment ::= variable_lvalue <= [ delay_or_event_control ] expression delay_control ::= # delay_value | #( mintypmax_expression ) delay_or_event_control ::= delay_control | event_control | repeat( expression ) event_control event_control ::= @ event_identifier | @( event_expression ) | @* | @(*)

5.6 절차형 할당의 타이밍 제어 fork #5 a = b; #5 b = a; join // result will be a=b fork와 join 사이의 두 개의 할당문은 우변의 a와 b 두 값 모두 동일 시뮬레이션 시간에 평가되고 좌변에 할당되며, 따라서 fork-join 구문이 실행되면 race condition이 발생되어 a와 b의 값이 같아짐. fork a = #5 b; // intra-assignment delay b = #5 a; // intra-assignment delay join // data swap 우변의 a와 b의 값이 먼저 평가되고, 평가된 값은 지정된 시간만큼 지연된 이후에 좌변의 변수에 할당되며, 따라서 fork-join 구문의 실행이 완료되면 a와 b의 값은 같아지지 않음

5.6 절차형 할당의 타이밍 제어 module fork_join(); reg a, b, c, d; initial begin end always @(a or b or c or d) begin fork #20 a = b; #20 b = a; join c = #20 d; d = #20 c; endmodule

5.6 절차형 할당의 타이밍 제어 fork // data shift a = @(posedge clk) b; b = @(posedge clk) c; join a <= repeat(5) @(posedge clk) data;

5.6 절차형 할당의 타이밍 제어 코드 5.19 코드 5.20 module intra_delay1(clk, d, out); input clk, d; output out; reg out; always @(*) out = repeat(3) @(posedge clk) d; endmodule 코드 5.19 등가 코드 module intra_delay1_eq(clk, d, out); input clk, d; output out; reg out,temp; always @(*) begin temp = d; @(posedge clk); @(posedge clk) out = temp; end endmodule 코드 5.20

5.6 절차형 할당의 타이밍 제어 코드 5.19의 시뮬레이션 결과

절차형 할당의 타이밍 제어 Equivalent model of Intra-assignment timing control With intra-assignment construct Without intra-assignment construct a = #5 b; begin     temp = b;     #5 a = temp; end a = @(posedge clk) b;     @(posedge clk) a = temp; a = repeat(3) @(posedge clk) b;     @(posedge clk);

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

5.7 블록문 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 #50 r = 8'h35; #100 r = 8'hE2; #150 r = 8'h00; #200 r = 8'hF7; #250 -> end_wave; join fork #250 -> end_wave; #200 r = 8'hF7; #150 r = 8'h00; #100 r = 8'hE2; #50 r = 8'h35; join 등가 코드

5.7 블록문 fork @enable_a begin #ta wa = 0; #ta wa = 1; end @enable_b begin #tb wb = 1; #tb wb = 0; join event 제어가 fork-join 블록 안에 있으므로, @enable_a와 @enable_b의 event 제어가 병렬로 처리되며 따라서 절차형 할당문 블록들도 병렬로 실행됨