-
[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