ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SystemVerilog] 데이터 타입 2
    개발/SystemVerilog 2022. 1. 10. 23:33

    logic 타입은 reg와 마찬가지로 0, 1, z, x   4가지의 상태를 저장할 수 있다.

     

    시스템베릴로그는 추가적으로 0, 1 두가지만 저장할 수 있는 2 state variable 타입을 제공한다.

    이러한 타입으로 선언하면 효율적으로 모델링을 할 수 있고, 시뮬레이션 속도가 향상된다.

    또한 합성 가능하다.

    type sign description
    bit unsigned 1bit 변수, 벡터로 확장가능
    byte signed 8bit 정수
    shortint signed 16bit 정수
    int signed 32bit 정수
    longint signed 64bit 정수

     

    위 타입들을 선언하면 초기값은 모두 0이다. 4 state variable은 초기화 하지 않는다면 기본적으로 x 값을 갖는다.

    따라서 2 state variable을 사용하면 시뮬레이션을 시작할 때 초기화하지 않는 실수를 예방할 수 있다.

    bit 타입은 logic 처럼 [msb : lsb] 사용하여 벡터로 선언할 수 있다. 기본적으로 unsigned 이고 signed로 선언하고 싶으면, signed 키워드를 추가하면 된다.

    ex) bit signed [15:0] bus;

     

    나머지 타입들은 기본적으로 signed이다. unsigned로 선언하고 싶으면 위와 마찬가지로 unsigned 키워드를 넣으면 된다. 

    ex) byte unsigned A;

     

    byte, shortint, int, longint 는 모두 bit 타입으로 대체 할 수 있다.

    byte a;		// bit signed [7:0] a;
    
    shortint a;	// bit signed [15:0] a;
    
    int a;		// bit signed [31:0] a;
    
    longint a;	// bit signed [63:0] a;

     

     

     

    만약 4 state variable 변수를 2 state variable 변수에 할당한다면, 

    4 state -> 2 state
    1 1
    0 0
    x 0
    z 0

    위와 같이 변환된다.

    1, 0 은 그대로 그 값이 저장되고,  x / z값은 0으로 변환되어 저장된다.

     

     

     

     

    시스템베릴로그에서는 변수에 값을 할당할 때, 더 간편한 문법을 지원한다.

    // verilog syntax
    reg [5:0] data;
    
    data = 6'hf		// 001111
    data = 6'b0		// 000000
    data = 6'b1		// 000001
    data = 6'bx		// xxxxxx
    data = 6'bz		// zzzzzz
    data = 3'bx		// 000xxx
    
    
    
    // systemverilog syntax
    reg [5:0] data;
    
    data = '0		// 000000
    data = '1		// 111111
    data = 'x		// xxxxxx
    data = 'z		// zzzzzz

    베릴로그에서는 변수와 할당되는 값의 벡터사이즈가 맞지 않을경우 0 padding 또는 truncation을 한다.

    시스템베릴로그는 single bit literal을 지원하여 '<value> 형식으로 할당하는 경우엔 그 값을 반복적으로 padding 하여 할당한다.

     

     

     

    시간과 관련하여 딜레이를 제어할 떄, #<number> 형식에서 추가적으로 time literal을 명시할 수 있게 되었다.

    ex) #10ns, #1us, #3ms

     

    그리고 1step 단위가 추가됐다.

    1step은 timeprecision unit 이다.

    `timescale 1ns/100ps
    
    module test();
    	logic a;
        
        initial begin
        	#20ns	a = 1;		// 20ns 후에 문장실행
            #4.17ns	a = 0;		// time precision값이 100ps이므로 반올림 하여 4.2ns 후에 문장실행
            #1step	a = 1;		// 1step = 100ps 후에 문장 실행
        end
    
    endmodule

     

    `timescale 지시어를 대신하여 

    timeunit, timeprecision 키워드가 추가되었다.

    이렇게 되면 컴파일 순서에 따른 dependency가 없다.

    module test();
    	timeunit 1ns;
    	timeprecision 100ps;
        
    	logic a;
        
        initial begin
        	#20ns	a = 1;		// 20ns 후에 문장실행
            #4.17ns	a = 0;		// time precision값이 100ps이므로 반올림 하여 4.2ns 후에 문장실행
            #1step	a = 1;		// 1step = 100ps 후에 문장 실행
        end
    
    endmodule

    timeunit, timeprecision 선언은 모듈 내부에서 정의되어야 하고 모듈의 제일 첫번째 문장으로 와야한다.

    이는 해당 모듈과 하위 모듈에만 적용된다.

     

     

    '개발 > SystemVerilog' 카테고리의 다른 글

    [SystemVerilog] 연산자  (0) 2022.01.13
    [SystemVerilog] 절차적 할당 2  (0) 2022.01.11
    [SystemVerilog] 절차적 할당 1  (0) 2022.01.11
    [SystemVerilog] 데이터 타입 1  (0) 2022.01.10
    [SystemVerilog] 시스템베릴로그 개요  (0) 2022.01.10
Designed by Tistory.