Top Banner
한국기술교육대학교 장영조
51

한국기술교육대학교 장영조 - KOREATECH · 2016. 10. 31. · 설계의기본단위 모듈구성 한국기술교육대학교전기전자통신공학부 4 modulemodule_name(port_list);

Jan 30, 2021

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • 한국기술교육대학교장영조

  • 2한국기술교육대학교 전기전자통신공학부

  • 1. Velilog HDL 개요2. Verilog 첫걸음3. Velilog 어휘규칙4. 모듈5. 데이터형6. 연산자7. 인스턴스8. 시스템 태스크와 함수9. 컴파일러 지시어

    3한국기술교육대학교 전기전자통신공학부

  • 설계의 기본단위

    모듈구성

    4한국기술교육대학교 전기전자통신공학부

    module module_name (port_list);

    port 선언reg 선언wire 선언parameter 선언

    하위모듈 호출always, initial 문function, task 정의문assign 문function, task 호출문

    endmodule

    semicolon

    no semicolon

    모듈정의

    모듈 items

  • 한국기술교육대학교 전기전자통신공학부 5

    // 암시적 내부 연결( implicit internal connection )

    module module_name (port_name, port_name, ... );

    module_items

    endmodule

    // 명시적 내부 연결 (explicit internal connection)

    module module_name (.port_name (signal_name ),

    .port_name (signal_name ), ... );

    module_items

    endmodule

  • code 1.4.1-1 ex1.v, 모듈 정의의 암시적 연결

    // 등가 비교기

    module ex1 ( a1, b1, out1);input [3:0] a1, b1;outputout1;

    assign out1 = ( a1 >= b1 ); // continuous assignmentendmodule

    한국기술교육대학교 전기전자통신공학부 6

    code 1.4.1-2 ex2.v, 모듈 정의에 포트 선언 목록을 포함한 암시적 연결

    // 2 input MUX with 2 bit widthsmodule ex2 ( input wire [1:0] i0, i1,

    input wire sel,output wire [1:0] out2 );

    wire t0, t1;assign out2 = {t1, t0}; // concatenationassign t1 = sel ? i1[1] : i0[1];assign t0 = sel ? i1[0] : i0[0];

    endmodule

  • module items module_port_declarations data_type_declarations module_instances primitive_instances procedural_blocks continuous_assignments task_definitions function_definitions

    모듈 item의 기술 순서는 무관 concurrent, parallel

    한국기술교육대학교 전기전자통신공학부 7

  • 포트선언 형식

    포트 방향 input : 스칼라(scalar)나 벡터(vector)의 입력 포트 선언 output : 스칼라나 벡터의 출력 포트 선언 inout : 스칼라나 벡터의 양방향 포트 선언

    data type : 선택적, 실수형 불가 signed : 선택적, 부호있는 수를 나타냄 port size : 선택적, 포트크기 범위 [msb:lsb]

    한국기술교육대학교 전기전자통신공학부 8

    port_direction data_type signed [port_size] port_name, port_name, .. ;

  • 예제 1.4.2 포트 선언 예

    input a1, a2, en; // 3개의 스칼라 1 비트 포트

    input signed [7:0] a, b; // 2개의 8 비트 signed 값을 갖는 포트

    output reg signed [16:0] res; // 데이터형과 signed 속성을 갖는 포트

    output reg [11:0] cnt1; // little endian 표기 방식

    inout [0:15] data_bus; // big endian 표기 방식

    input [15:12] addr; // msb:lsb는 정수 값

    parameter BW = 32;

    input [BW-1:0] addr1; // 상수 표현식 사용 가능

    parameter SIZE = 4096;

    input [log2(SIZE)-1:0] addr2; // 상수 함수를 선언에서 호출 가능

    한국기술교육대학교 전기전자통신공학부 9

  • 1. Velilog HDL 개요2. Verilog 첫걸음3. Velilog 어휘규칙4. 모듈5. 데이터형6. 연산자7. 인스턴스8. 시스템 태스크와 함수9. 컴파일러 지시어

    10한국기술교육대학교 전기전자통신공학부

  • net 설계 부분의 사이에서 물리적인 연결을 만들 때 사용하는 개념 net는 net의 구동자(driver)의 값과 strength level이나 혹은 net의

    capacitance, 혹은 그 자신의 값을 가지지 않은 것을 그대로 반영 한 개의 net를 구동하는 여러 개의 구동자가 있을 경우에는 최종값을 결

    정하는 resolution 함수 필요

    variable type 프로그래밍 데이터의 임시적 저장소로 사용되므로 레지스터(register) 데

    이터형이라고도 한다. initial 블록, always 블록, 태스크나 function과 같은 프로시듀어의 내부에

    서만 값을 할당받을 수 있다. 논리값만 저장할 수 있으며 논리 strength는 저장할 수 없다. 변수는 시뮬레이션의 시작에는 비초기화(un-initialized)되고, 값이 할당

    되기 전까지는 논리 X의 값을 유지한다.

    한국기술교육대학교 전기전자통신공학부 11

  • 선언 형식

    delay : 선택사항, net 데이터형에서만 사용 size : [msb : lsb]로 나타내는 비트자리의 크기, 정수, 정수 파라미터, 정

    수 상수로 나타나는 수식 사용 array_size : [first_address : last_address] 형태로 표현, strength : (strength1, strength0)이나 (strength0, strength1)의 형태 decay_time : trireg net의 구동자가 turn-off된 후 논리 X값으로 방전하

    기 전에 charge를 저장할 수 있는 시간 값 규정. (rise_delay, fall_delay, decay_ time)의 형식으로 표현

    12한국기술교육대학교 전기전자통신공학부

    register_type [size] variable_name , variable_name , ...;

    register_type [size] memory_name [array_size];

    net_type [size] #(delay) net_name [array_size], ...;

    net_type(drive_stren) [size] #(delay) net_name = cont_assignment;

    trireg (cap_stren) [size] #(delay,decay_time) net_name, ...;

    parameter const_name = value, const_name = value, ... ;

    event event_name, event_name, ... ;

  • 종류

    사용 프로시듀어 블록내 절차형 할당에서 좌변 변수로 사용 할당과 할당 사이의 값을 유지 reg 변수가 하드웨어적인 저장장소를 의미하는 것은 아님

    13한국기술교육대학교 전기전자통신공학부

    키워드 기능

    reg

    integer

    time

    real

    realtime

    임의 비트 크기의 unsignedvariable

    32비트 signedvariable

    64비트 unsignedvariable

    배정도 부동소수점 variable

    배정도 부동소수점 variable

  • 예제 1.5.1 레지스터 변수 선언 예

    reg d, e, f; // 3개의 스칼라(1 비트) 변수

    reg signed [12:0] a1, a2; // 2개의 13 비트 signed 변수

    reg [7:0] A[0:3][0:15]; // 8비트의 2차원 배열 변수

    integer i, j; // 2개의 signed 정수 변수

    real r1, r2; // 2개의 배정도(double-precision) 실수 변수

    reg clk = 0, rst = 1; // 초기값을 가지는 2개의 reg 변수

    realtime rtime; // 실수값을 가지는 time 변수

    time save_stime; // time 변수

    initial

    save_stime = $time; // $time은 현재 시뮬레이션 시간을 반환하는 시스템 함수

    14한국기술교육대학교 전기전자통신공학부

  • code 1.5.1-1mydff.v, 저장장소가 합성되는

    reg형

    module mydff (clk, d, q);

    input d, clk;

    output q;

    reg q;

    always @(posedge clk)

    q

  • 종류

    사용 어떤 소자의 출력에 의해 구동되는 신호 입력(input) 포트나 입출력 포트로 선언되는 신호 연속할당문의 좌변(LHS, Left Hand Side) 신호로 사용 연속할당문의 우변(RHS, Right Hand Side) 구동자가 연결되지 않으면,

    default 값인 high-impedance(z) 값이 됨. default 자료형 : 1 비트의 wire default 초기값 : z, 단 trireg는 x

    한국기술교육대학교 전기전자통신공학부 16

    키워드 기능

    wire, tri

    wor, trior

    wand, triand

    tri0

    tri1

    supply0

    supply1

    trireg

    단순 연결을 위한 와이어

    wired outputs or together

    wired outputs and together

    저항성으로 3상일 때 풀 다운, 접지에 연결

    저항성으로 3상일 때 풀 업, 전원에 연결

    상수 논리값 0(supply strength), 회로접지에 사용

    상수 논리값 1(supply strength), 전원에 연결되는 net

    3상일 때 마지막 값 저장(capacitance strength),전하 모델링

  • 각 구성 성분의 연결 데이터 형

    17한국기술교육대학교 전기전자통신공학부

    input outputinout

    wire

    wire,regwire

    wire,reg

    wire

    alwaysbegin...end

    initialbegin...endassign wire_a=c&d;

    reg reg_a, reg_b,...integer int_i, ...

    primitive instance

    continuousassignment

    module_instance1 module_instance2

    declarations register variables

    behavior1

    behavior2

    wire

    wire,reg

    wire

    wire wire

    wirewire

    wire,regwire wire,reg

  • 예제 1.5.2 net 데이터 선언 예

    wire d, e, f; // 3개의 1 비트 스칼라 net

    tri1 [7:0] dbus; // 3 상태일 때 pull-up인 8 비트 net

    wire [1:0] sel = 2'b00; // 초기값을 가지는 와이어, 초기값은 시뮬레이션용

    wire signed [1:11] res; // 12 비트 signed net

    wire [7:0] A[0:15][0:256]; // 8 비트 와이어의 2차원 배열

    wire #(2.4,1.8) ripple; // rise 및 fall delay를 가지는 net

    wire [0:15] (strong1, pull0) sum = a + b;

    // strength를 가진 16 비트 net 선언과 연속 할당으로 값을 전달

    trireg (small) #(0,0,35) ram_bit; // smallcapacitance와 rise, falldelay,decay를가진net

    wand t3; // wand 형의 스칼라 net

    한국기술교육대학교 전기전자통신공학부 18

  • 2개 net 신호 연결시의 진리표

    19한국기술교육대학교 전기전자통신공학부

    wire/tri 0 1 x z

    0 0 x x 0

    1 x 1 x 1

    x x x x x

    z 0 1 x z

    wand/triand 0 1 x z

    0 0 0 0 0

    1 0 1 x 1

    x 0 x x x

    z 0 1 x z

    wor/trior 0 1 x z

    0 0 1 x 0

    1 1 1 1 1

    x x 1 x x

    z 0 1 x z

    tri0 0 1 x z

    0 0 x x 0

    1 x 1 x 1

    x x x x x

    z 0 1 x 0

    tri1 0 1 x z

    0 0 x x 0

    1 x 1 x 1

    x x x x x

    z 0 1 x 1

  • 키워드 기 능

    parameter정수, 실수, time, 지연 시간, ASCII 스트링을 저장하는 실행 시간(run-time)

    상수. 파라미터 값은 각 모듈에서 재 정의될 수 있다.

    localparam 정수, 실수, time, 지연 시간, ASCII 스트링을 저장하는 지역(local) 상수

    specparam 정수, 실수, time, 지연 시간, ASCII 스트링을 저장하는 특정 블록 상수

    genvargenerate loop 내에서 사용되는 임시 변수로 그 외의 장소에서는 사용할

    수 없으며 시뮬레이션에서도 읽혀지지 않는다.

    event논리값이나 데이터 저장소를 가지지 않는 순간적인 flag로 한 모듈 내에

    서 concurrent activities의 동기화를 위해 사용된다.

    한국기술교육대학교 전기전자통신공학부 20

  • 예제 1.5.3 그 외 데이터형 선언 예

    parameter [2:0] s1 = 3'b001, // 3 개의 3 비트 상수 선언s2 = 3'b010,s3 = 3'b100;

    parameter integer period = 50; // 정수 상수localparam signed val = -8; // unsized signed 상수, 초기값으로 크기 결정event hs_rdy, hs_sent; // 2개의 event 데이터형

    한국기술교육대학교 전기전자통신공학부 21

    예제 1.5.4 파라미터 선언 예

    parameter msb = 15; // msb를 상수 15로 정의parameter a = 15, b = 180; // 2개의 상수 정의parameter r1 = 25.7; // 실수 파라미터 정의parameter size = 8, mask = size - 1;parameter p_delay = (r + f) / 2; // 상수 수식 정의parameter signed [3:0] sel = 0; // 벡터 상수 정의와 초기값 할당parameter real r2 = 3.41e8;parameter p1 = 16'h7a5;parameter [31:0] f_const = 1'b1; // 32 비트로 변환parameter s_const = 3'h4; // [2:0]의 암시적 사이즈

  • code 1.5.3-1 myxnor.v, 파라미터 정의

    module myxnor (y_out, a, b);parameter size=8, delay=15;output [size-1:0] y_out;input [size-1:0] a, b;wire [size-1:0] #delay y_out = a ~^ b; // bit-wise xnor with delayendmodule

    한국기술교육대학교 전기전자통신공학부 22

    code 1.5.3-2 my_param.v, 파라미터 사용 예

    module my_param;wire [7:0] y1_out;wire [3:0] y2_out;reg [7:0] b1, c1;reg [3:0] b2, c2;

    myxnor G1 (y1_out, b1, c1); // use default parametersmyxnor #(4, 5) G2 (y2_out, b2, c2); // overrides default parameters

    endmodule

  • net나 reg 형의 다중 비트 선언 선언 형식

    한국기술교육대학교 전기전자통신공학부 23

    data-type [MSB : LSB] signal-name

    예제 1.5.5 벡터 사용 예

    wire [7:0] bus;wire [31:0] busA, busB; // 32 비트 벡터, MSB=31reg [0:40] addr; // 41 비트 벡터, MSB=0busA[7]; // 벡터 부분 사용 예busB[2:0]; // 벡터 sliceaddr[0:1];

  • 동일한 데이터의 1차원 혹은 2차원 정의 벡터는 단일 객체이나 배열은 다중객체(object) 배열로 선언될 수 있는 데이터 : reg, net, integer, time 선언형식

    배열 전체 또는 일부분은 단일 할당문에 의해 값을 할당 받을 수 없으며또한 수식에 사용될 수 없다. 배열을 구성하는 요소에만 단일 할당문으로 값을 할당받을 수 있다.

    한국기술교육대학교 전기전자통신공학부 24

    data-type array_name [subscript]

  • 한국기술교육대학교 전기전자통신공학부 25

    배열 사용 예

    reg [7:0] mema[0:255]; // 256개의 8비트 메모리 레지스터, memareg memb[7:0][0:255]; // 1비트 레지스터의 2차원 배열wire w_array[3:0][7:0]; // 1 비트 와이어의 2차원 배열integer id[1:64]; // 64개 정수의 1차원 배열time t_hist[1:1000]; // 1000개 time의 1차원 배열

    mema = 0; // 오류 구문 - 전체 배열에 쓰기 불가memb[1] = 0; // 오류 구문 - 배열 다중요소, [1][0]..[1][255] 에 쓰기 불가memb[1][12:31] = 0; // 오류 구문 – 배열 다중요소, [1][12], [1][13], .. , [1][31]쓰기 불가mema[1] = 0; // mema의 두번째 원소에 8비트 값, 0 할당memb[1][0] = 0; // memb[1][0] 원소에 1비트 값, 0 할당id[4] = 33559; // 정수배열 원소에 10진수 할당t_hist[t_index] = $time; // 정수인덱스, t_index로 접근된 원소에 현재 시뮬레이션 시간 할당

    예 : 배열요소에 의한 할당

  • 1. Velilog HDL 개요2. Verilog 첫걸음3. Velilog 어휘규칙4. 모듈5. 데이터형6. 연산자7. 인스턴스8. 시스템 태스크와 함수9. 컴파일러 지시어

    26한국기술교육대학교 전기전자통신공학부

  • 27한국기술교육대학교 전기전자통신공학부

    연산자 종류 연산자 기호 설명 오퍼랜드 개수

    arithmetic

    +-*/

    %**

    (+)부호, 덧셈(-)부호, 뺄셈곱셈나눗셈나머지(modulus)지수

    1, 21, 22222

    shift>>>>=

  • 피연산자의 비트에 x 나 z 가 포함된 경우, 전체 결과 값은 x

    나누기와 나머지 연산자에서 두 번째 피연산자가 0인 경우, 결과값은 x

    나머지 연산자의 결과 값은 첫번째 피연산자의 부호를 따름

    거듭제곱 연산자에서 다음의 경우에는 결과 값이 정의되지 않음

    첫번째 피연산자가 0이고 두 번째 피연산자가 양수가 아닌 경우

    첫번째 피연산자가 음수이고 두 번째 피연산자가 정수 값이 아닌 경우

    한국기술교육대학교 전기전자통신공학부 28

    기 호 기 능

    + 더하기

    - 빼기

    * 곱하기

    / 나누기(몫)

    % 나머지(modulo)

    ** 거듭제곱(power)

    오퍼랜드 자료형 해 석

    unsigned net Unsigned

    signed net Signed, 2’s complement

    unsigned reg Unsigned

    signed reg Signed, 2’s complement

    integer Signed, 2’s complement

    time Unsigned

    real, realtime Signed, floating-point

  • 산술연산자의 동작

    + m + n Add n to m

    - m - n Subtract n from m

    - -m Negate m (2의 보수)

    * m * n Multiply m by n

    / m / n Divide m by n

    % m % n Modulus of m / n, 나머지

    ** m ** n mn, 지수

    한국기술교육대학교 전기전자통신공학부 29

    예제 1.6.1 산술 연산자 사용 예

    -d10 / 5 // (10의 2의 보수)/5 = (232-10)/5

    5 / 0 // 5/0 = x

    (-7) % (+4) = -3 // 나머지, 왼쪽 오퍼랜드의 부호를 따른다.

    (+7) % (-2) = +1

    // 정수, 레지스터 연산 예

    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

    intA = -4'd12 / 3; // 1431655761, -4d'12= 232-12

    regA = -12 / 3; // -4, -12는 integer 자료형, regA는 65532

    regS = -12 / 3; // -4, regS는 signed reg

    regS = -4'sd12 / 3; // 1, -4'sd12는 4이므로 4/3=1

  • 이동연산자의 동작

    m >> n 논리, 우측 n 자리 이동, MSB 빈자리 0 fill

    >> n 산술, 우측 n 자리 이동, MSB 빈자리 MSB로 fill

    한국기술교육대학교 전기전자통신공학부 30

    예제 1.6.2 이동 연산자 동작 예

    // a a >> 2 a >>> 2 a

  • 관계 연산자의 동작

    < m < n m less than n? 결과는 1 비트 true(1)/false(0)

    > m > n m greater than n? 결과는 1/0

    = n m greater than or equal to n? 결과는 1/0

    한국기술교육대학교 전기전자통신공학부 31

    예제 1.6.3 관계 연산자 사용 예

    // a = 8, b = 20

    // x = 4'b1000, y = 5'b01000, z = 4'1xxx

    a < b // true a > b // false a = b // false

    x < y // 0 x >= z // x x >= y // 1 y-1 < x // 1

    오퍼랜드의 비트가 x 혹은 z의 값을 포함하면 결과 값은 1 비트의 x 두 오퍼랜드의 비트 수가 다른 경우에는 비트 수가 작은 오퍼랜드의

    MSB 쪽에 0이 채워져 비트 수가 큰 오퍼랜드에 맞추어 판단 오퍼랜드 중 하나가 실수형이면 다른 오퍼랜드도 실수형으로 변환된

    후 비교

  • 등가연산자의 동작

    // 등가 연산자 - 논리값 0과 1을 비교

    == m == n m is equal to n? 결과는 1 비트 true(1)/false(0)

    != m != n m is not equal to n? 결과는 1/0

    // 동일(identity) 연산자 - 0, 1, x 및 z 값 비교

    === m === n m is identical to n? 결과는 1/0

    !== m !== n m is not identical to n? 결과는 1/0

    한국기술교육대학교 전기전자통신공학부 32

    예제 1.6.4 등가 연산자 사용 예

    // X=4'b1010, Y=4'b1101, Z=4'b1xxz, M=4'b1xxz

    X == Y // 0 X == Z // x

    M == Z // x M === Z // 1

    code 1.6-1 TB_eq1.v, 테스트벤치

    module TB_eq1;

    wire [3:0] X, Y, Z, M;

    assign X = 4'b1010;

    assign Y = 4'b1101;

    assign Z = 4'b1xxz;

    assign M = 4'b1xxz;

    initial

    #4 $display (X==Y, X==Z, M===Z, M==Z); // 0x1x

    endmodule

  • 비트단위 연산자의 동작

    ~ ~m m의 각 비트를 반전, 단일오퍼랜드

    & m & n m과 n의 각 자리에 대하여 and

    | m | n m과 n의 각 자리에 대하여 or

    ^ m ^ n m과 n의 각 자리에 대하여 xor

    ~^ m ~^ n m과 n의 각 자리에 대하여 xnor

    ^~ m ^~ n m과 n의 각 자리에 대하여 xnor

    한국기술교육대학교 전기전자통신공학부 33

    예제 1.6.5 비트 단위 연산자 사용 예

    // X = 4'b1110, Y = 4'b1000, Z = 4'b01xx

    ~ X // Negation, 결과는 4'b0001

    X & Y // Bitwise and, 결과는 4'b1000

    X | Y // Bitwise or, 결과는 4'b1110

    X ^ Y // Bitwise xor, 결과는 4'b0110

    X ^~ Y // Bitwise xnor, 결과는 4'b1001

    Y | Z // Bitwise xor, 결과는 4'b11xx

    // 비트 단위 연산자의 할당 예

    wire [3:0] a, b, c;

    assign c = a | b; // 4 비트 단위 연속할당

    // 아래 4개의 각 비트 할당문과 동일

    assign c[3] = a[3] | b[3];

    assign c[2] = a[2] | b[2];

    assign c[1] = a[1] | b[1];

    assign c[0] = a[0]| b[0];

    and, or, not, xor와 같은 논리적 연산을 비트단위별로 수행 오퍼랜드의 비트 수와 동일한 비트 수의 결과, 병렬합성 연산자를 구현하는 하드웨어는 기본적인 논리 게이트

  • 단일 오퍼랜드에 동작, 벡터 입력에 대하여 1비트의 결과 입력수가 여러 개인 단일 게이트 합성

    한국기술교육대학교 전기전자통신공학부 34

    축소연산자의 동작

    & &m m의 모든 비트를 and, 1 비트 결과

    ~& ~&m m의 모든 비트를 nand, 1 비트 결과

    | |m m의 모든 비트를 or, 1 비트 결과

    ~| ~|m m의 모든 비트를 nor, 1 비트 결과

    ^ ^m m의 모든 비트를 xor, 1 비트 결과

    ~^ ~^m m의 모든 비트를 xnor, 1 비트 결과

    ^~ ^~m m의 모든 비트를 xnor, 1 비트 결과 예제 1.6.6 축소 연산자 사용 예

    wire [3:0] a = 4'b0101;

    wire x1, x2, y1, y2, y3 ;

    // 다음 두 연산의 결과 x1과 x2는 동일

    assign x1 = & a; // reduction, 0 & 1 & 0 & 1 = 0

    assign x2 = a[3] & a[2] & a[1] & a[0]; // bitwise AND

    assign y1 = | a; // 0 | 1 | 0 | 1 = 1

    assign y2 = ^ a; // 0 ^ 1 ^ 0 ^ 1 = 0

    assign y3 = ^~ a; // ~( 0 ^ 1 ^ 0 ^ 1) = 1

  • true(1) 혹은 false(0)의 1비트 평가 결과 if, case 문 등의 조건식 판단에 주로 사용

    한국기술교육대학교 전기전자통신공학부 35

    논리연산자의 동작

    ! !m m이 참이면 0 아니면 1, 1 비트 결과

    && m && n m과 m이 동시에 참이면 1, 1 비트 결과

    || m || n m과 m이 하나라도 참이면 1, 1 비트 결과

    예제 1.6.7 논리 연산자 사용 예

    A = 5; B = 0; C = 3'b101; D = 3'bx01

    A && B // false(0)

    (A == 5) && ( B == 0) // true(1)

    !B // 1

    C && D // x

    A || C // 1

    논리 및 비트 단위 연산자 비교

    a b a&b a|b a&&b a||b

    0 1 0 1 0 (false) 1 (true)

    000 000 000 000 0 (false) 0 (false)

    000 101 000 101 0 (false) 1 (true)

    111 010 010 111 1 (true) 1 (true)

  • 스칼라 혹은 벡터의 구성요소를 결합하여 보다 큰 벡터 생성

    한국기술교육대학교 전기전자통신공학부 36

    결합연산자의 동작

    { } {m,n} m과 n을 결합하여 보다 큰 벡터 생성, MSB는 m

    {{ }} {n{m}} m을 n번 반복 결합

    예제 1.6.9 결합 연산자 사용 예

    // a = 1'b1 b =3'b101 c = 2'b01assign x1 = { b, c }; // 결과 x1은 5'b10101assign y1 = { a, b, 4'b0111 }; // 결과 y1은 8'b11010111assign z1 = { a, b[1:0], c[1] }; // 결과 z1은 4'b1010// 반복 연산자, { { } } 사용 예assign x2 = { 8{a} }; // 결과 x2는 8'b1111_1111assign y2 = { 2{a}, 2{b} }; // 결과 y2는 8'b1110_1101assign z2 = { 3{a}, b, 2{c} }; // 결과 z2는 10'b11_1101_0101assign byte = { 4{2'b10} }; // 8'b1010_1010 생성assign hword = { {8{byte[7]} }, byte }; // 16 비트생성, 부호확장

    // 1111_1111_1010_1010

  • 예제 1.6.10 결합연산자를 사용한 비트길이 조절

    wire [7:0] a, b;wire [7:0] sum8;wire [8:0] sum9;assign sum8 = a + b; // 캐리 버림assign sum9 = a + b; // sum9[8]에 캐리 저장assign {cout, sum8} = a + b; // cout에 캐리 저장

    한국기술교육대학교 전기전자통신공학부 37

    예제 1.6.11 결합연산자를 사용한 비트 결합

    wire a1, b1;wire [3:0] a4;wire [7:0] b8, c8, d8;assign b8 = {a4, a4};assign c8 = {a1, b1, a4, 2'b10};assign d8 = {b8[3:0], c8[7:4]};

    예제 1.6.12 결합 연산자를 사용한 이동 연산 구현

    wire [7:0] a;wire [7:0] rot, shl, sha1, sha2;assign rot = {a[2:0], a[7:3]}; // 3 비트 우 순환 이동assign shl = {3'b000, a[7:3]}; // 3 비트 우 이동, MSB는 0으로 채움assign sha1 ={a[7], a[7], a[7], a[7:3]); // 3 비트 우 이동,

    // MSB는 부호 비트로 채움, 산술 이동assign sha2 ={4{a[7]), a[7:4]}; // 4 비트 우 이동, 부호 채움

  • 3개의 오퍼랜드, RHS의 값을 평가하여 좌측변수에 전달

    한국기술교육대학교 전기전자통신공학부 38

    조건연산자의 동작

    ? : sel ? m : n sel이 참이면 m을 선택하고 아니면 n을 선택

    예제 1.6.13 조건 연산자 사용 예

    assign out1 = sel ? in1 : in0 ; // 2-to-1 MUX

    assign out2 = ( a >= 3) ? (sel ? x : y) : (sel ? m : n); //nested

    assign rco = (cnt == 7) ? 1'b1 : 1'b0; // counter ripple out

    assign sum[11:0] = en ? ({{2{n[9]}}, n[9:0]} + res[11:0]) : 0 ;

    assign eq = (~i1 & ~i0) ? 1'b1 : // 진리표 모델링

    (~i1 & i0) ? 1'b0 :

    (i1 & ~i0) ? 1'b0 :

    1'b1;

    assign max2 = (a>b) ? a : b; // a,b 중 최대값 반환

    assign max3 = (a>b) ? ((a>c) ? a : c) : ((b>c) ? b : c ) ; // a,b,c 최대값

    i1 i0 eq

    0 00 11 01 1

    1001

  • 연산자의 평가 순위

    39한국기술교육대학교 전기전자통신공학부

    연산자 기호 우선순위

    unary ! ~ + - (unary)높은 순위

    낮은 순위

    arithmetic

    **

    * / %

    + - (binary)

    shift >> >> > 1 // a+b 연산한 결과에 대하여 >> 1 연산

    a + (b >> 1) // b>>1 연산한 결과에 대하여 a와 덧셈

    a - 1 < b // a-1 연산한 결과와 b 비교

    a - (1 < b ) // a에 (1 < b)의 비교 결과를 뺄셈

    !x != y && z + x | y // ((!x) != y) && ( (z + x) | y )

  • 1. Velilog HDL 개요2. Verilog 첫걸음3. Velilog 어휘규칙4. 모듈5. 데이터형6. 연산자7. 인스턴스8. 시스템 태스크와 함수9. 컴파일러 지시어

    40한국기술교육대학교 전기전자통신공학부

  • 구조적 모델링에서 하위 모듈이나 프리미티브 게이트를 포함하는 연결과정

    포트 순서에 의한 연결 : 모듈정의시 사용한 포트 목록의 순서와 동일하게 신호 연결 연결하지 않아도 되는 포트는 두 개의 콤마 , , 사용 포트 정의시 사용한 순서와 신호의 크기가 일치하도록 유의

    포트 이름에 의한 연결 : 포트 이름과 신호 이름을 같이 표현, 순서에 무관 연결이 필요하지 않는 포트는 신호 이름을 빈칸 ( )으로 남겨둔다.

    41한국기술교육대학교 전기전자통신공학부

    모듈인스턴스구문

    포트 순서 연결 (portorderconnections)

    module_name instance_name[instance_array_range] (signal, signal, ... );

    포트 이름 연결 (portname connections)

    module_name instance_name[instance_array_range] (.port_name(signal), (.port_name(signal), ...);

    명시적 파라미터 재정의(explicit parameter redefinition)

    defparamheirarchy_path.parameter_name= value;

    묵시적 파라미터 재정의(implicit parameter redefinition)

    module_name#(value) instance_name(signals);

  • 파라미터 (parameter)를 포함한 인스턴스 명시적 파라미터 재정의 파라미터의 계층적 이름(hierarchical name)을 가진 defparam 문을 사용

    묵시적 파라미터 재정의 모듈 사례화 시 #(value)의 형태로 사용. 모듈 내에서 여러 개의 파라미터가 선언되었을 때는 파라미터의 선언 순서대

    로 값 지정

    한국기술교육대학교 전기전자통신공학부 42

  • 예제 1.7.1 파라미터를 사용한 모듈 인스턴스 예

    module dff1 (q, qb, data, clk);

    outputq, qb;

    input data, clk;

    parameterdelay = 2; //default 지연 파라미터 선언

    dff_udp #(delay) (q, data, clk); // 사용자 정의 프리미티브

    not (qb, q); // 프리미티브 게이트 인스턴스

    endmodule

    module reg4 (q, d, clk);

    output [3:0] q;

    input [3:0] d;

    input clk;

    wire [3:0] q, d;

    dff1 u1 (q[0], , d[0], clk); // 순서 연결, qb는 개방(open)

    dff1 u2 (.clk(clk), .q(q[1]), .data(d[1])); // 이름 연결

    dff1 u3 (q[2], ,d[2], clk);

    defparamu3.delay = 3.2; // 명시적 파라미터 재정의

    dff1 #(2) u4 (q[3], , d[3], clk); // 암시적 파라미터 재정의

    endmodule

    한국기술교육대학교 전기전자통신공학부 43

  • 예제 1.7.2 인스턴스 배열 예

    module tribuf8 (y, a, en);

    output [7:0] y;

    input [7:0] a;

    input en;

    wire [7:0] y, a;

    bufif1 u[7:0] (y, a, en);

    // Verilog 3상 프리미티브 버퍼의 배열, 배열 크기는 8

    // 벡터의 각 비트는 서로 다른 프리미티브 인스턴스에 연결

    endmodule

    module tribuf32 (out, in, en);

    output [31:0] out;

    input [31:0] in;

    input en;

    wire [31:0] out, in;

    tribuf8 i[3:0] (out, in, en); // 8 비트 3상 버퍼 배열, 배열 크기는 4

    // 각 인스턴스는 32 비트 벡터의 8 비트 부분 크기로 연결됨

    // 스칼라 en 신호는 모든 인스턴스에 동시 연결

    endmodule한국기술교육대학교 전기전자통신공학부 44

  • Verilog에서 제공하는 프리미티브 게이트 사용

    delay : 선택, 프리미티브를 통과할 때에 발생하는 전달지연 시간 지연 값은 정수 혹은 실수 사용. 미정의시 default 값은 0(zero delay)

    프리미티브 인스턴스에서 인스턴스 이름(instance_name)은 선택사항 시뮬레이션에서 같은 프리미티브를 사용하였을 때 구분하기 위하여 인스턴스

    이름을 사용할 수 있다.

    인스턴스 배열 범위(instance_array_range)는 선택사항 다중 프리미티브를 인스턴스할 때 각 인스턴스가 벡터의 분리된 비트로 사례

    45한국기술교육대학교 전기전자통신공학부

    프리미티브 인스턴스 구문

    gate_type(drive_strength)#(delay) instance_name[instance_array_range] (terminal, terminal, ... );

    switch_type #(delay) instance_name [instance_array_range] (terminal, terminal, ... );

  • Verilog의 프리미티브 게이트

    인스턴스에서 신호연결은 순서에 의한 연결만 가능

    46한국기술교육대학교 전기전자통신공학부

    게이트 종류 연결 순서

    and

    or

    xor

    nand

    nor

    xnor

    (1_output, 1-or-more_inputs)

    buf not (1-or-more_outputs, 1_input)

    bufif0

    bufif1

    notif0

    notif1(1_output, 1_input, 1_control)

    pullup pulldown (1_output)

    user-defined-primitives (1_output, 1-or-more_inputs)

  • 프리미티브 게이트의 진리표

    한국기술교육대학교 전기전자통신공학부 47

    and 0 1 x z

    0 0 0 0 0

    1 0 1 x x

    x 0 x x x

    z 0 x x x

    nor 0 1 x z

    0 1 0 x x

    1 0 0 0 0

    x x 0 x x

    z x 0 x x

    xnor 0 1 x z

    0 1 0 x x

    1 0 1 x x

    x x x x x

    z x x x x

    not

    입력 출력

    0 1

    1 0

    x x

    z x

    buf

    입력 출력

    0 0

    1 1

    x x

    z x

    xor 0 1 x z

    0 0 1 x x

    1 1 0 x x

    x x x x x

    z x x x x

  • 4가지 프리미티브 3상 버퍼/not

    한국기술교육대학교 전기전자통신공학부 48

    data out

    control

    data out

    control

    bufif1control

    0 1 x z

    data

    0 z 0 L L

    1 z 1 H H

    x z x x x

    z z x x x

    bufif0control

    0 1 x z

    data

    0 0 z L L

    1 1 z H H

    x x z x x

    z x z x x

    data out

    control

    data out

    control

    notif1control

    0 1 x z

    data

    0 z 1 H H

    1 z 0 L L

    x z x x x

    z z x x x

    notif0control

    0 1 x z

    data

    0 1 z H H

    1 0 z L L

    x x z x x

    z x z x x

  • 지연시간 표현

    한국기술교육대학교 전기전자통신공학부 49

    프리미티브 지연 시간 구문

    #delay or #(delay)

    // 출력 천이에서의 단일 지연 시간

    #(delay, delay)

    // (rising, falling) 천이에 대한 지연 시간

    #(delay, delay, delay)

    // (rising, falling, turn_off) 천이 지연 시간

    #(min_delay:typ_delay:max_delay)

    // 출력 천이에 대한 지연 시간의 (최소:평균:최대) 지연 값

    #(min_delay:typ_delay:max_delay, min_delay:typ_delay:max_delay)

    // (rising, falling) 천이에 대한 (최소:평균:최대) 지연 값

    #(min_delay:typ_delay:max_delay, min_delay:typ_delay:max_delay,

    min_delay:typ_delay:max_delay)

    // (rising, falling, turn-off) 천이에 대한 (최소:평균:최대) 지연 값

  • 예제 1.7.3 프리미티브 인스턴스 예

    and i1 (out1, in1, in2); // zero delay, 인스턴스 이름

    and #5 (o1, i1, i2, i3, i4); // 단일 게이트 지연 시간

    not #(2,3) u7(out2, in); // (상승,하강) 지연 시간

    wire [3:0] ndy, nd1, nd2;

    nand #5 u_nd[0:3](ndy, nd1, nd2) // nand 배열 : 배열 원소수=4

    wire [31:0] y, a;

    buf #2.7 b1[31:0] (y, a); // 버퍼 배열 : 배열 원소수= 32

    한국기술교육대학교 전기전자통신공학부 50

  • 프리미티브를 사용한 전가산기 모델링

    한국기술교육대학교 전기전자통신공학부 51

    code 1.7.2-1fa_s.v, 프리미티브를 사용한

    전가산기 모델링 예

    module fa_s(x, y, ci, s, co);

    input x, y, ci;

    output s, co;

    wire w1, w2, w3;

    and #10 (w2, x, y);

    xor #(6, 8) (w1, x, y);

    and U3 (w3, w1, ci);

    xor #(6:7:8, 7:8:10) U4 (s, w1, ci);

    or U5 (co, w2, w3);

    endmodule

    w1

    xyci

    s

    w2 w3co