Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "행위수준 모델링 Sun, Hye-Seung."— Presentation transcript:

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

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

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

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

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

6 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; or b) // sel is omitted if(sel ==0) out = a; else out = b; endmodule 감지신호목록에 sel이 빠진 경우 코드 5.3

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

8 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

9 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

10 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

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

12 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

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

14 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; 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; clk) begin a = b; // a=1 b = a; // b=a=1 endmodule 코드 5.5-(a) 코드 5.5-(b)

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

16 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

17 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

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

19 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

20 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

21 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;]

22 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

23 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; or b or sel) if(sel == 1'b0) // 또는 if(!sel) out = a; else out = b; endmodule if 조건문을 이용한 2:1 멀티플렉서 코드 5.9

24 비동기 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; 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

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

26 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

27 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; or b or sel) begin case(sel) 0 : out = a; 1 : out = b; endcase end endmodule 코드 5.11

28 5.4 case 문 case문을 이용한 디코더 reg [15:0] rega; reg [9:0] result;
begin case(rega) 16'd0: result = 10'b ; 16'd1: result = 10'b ; 16'd2: result = 10'b ; 16'd3: result = 10'b ; 16'd4: result = 10'b ; 16'd5: result = 10'b ; 16'd6: result = 10'b ; 16'd7: result = 10'b ; 16'd8: result = 10'b ; 16'd9: result = 10'b ; default: result = 10'bx; endcase end

29 5.4 case 문 case 문을 이용한 x와 z의 처리 예 case(select[1:2])
2'b : result = 0; 2'b : result = flaga; 2'b0x, 2'b0z : result = flaga ? 'bx : 0; 2'b : 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

30 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

31 casex 문을 이용한 3비트 우선순위 인코더(priority encoder)
module pri_enc_casex(encode, enc); input [3:0] encode; output [1:0] enc; reg [1:0] enc; 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

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

33 case 조건식에 상수 값을 사용한 3비트 우선순위 인코더
module pri_enc_case(encode, enc); input [3:0] encode; output [1:0] enc; reg [1:0] enc; 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

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

35 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; 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

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

37 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; 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

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

39 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; 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

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

41 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 문을 이용한 주기 신호 생성

42 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

43 표 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

44 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

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

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

47 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 선언 clock) -> upedge; or negedge reset) begin if(reset==0) q = 0; else q = din; end endmodule 코드 5.18

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

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

50 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 )

51 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의 값은 같아지지 않음

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

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

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

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

56 절차형 할당의 타이밍 제어 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 clk) b; clk) a = temp; a = clk) b; clk);

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

58 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 등가 코드

59 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 블록 event 제어가 병렬로 처리되며 따라서 절차형 할당문 블록들도 병렬로 실행됨


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

Similar presentations


Ads by Google