-
[Verilog][기초문법] 데이터 형개발/Verilog 2022. 1. 3. 23:27
베릴로그는 디지털회로를 설계하기 위한 언어로서 회로의 상태를 표현하기 위해 4가지의 값을 지원한다.
논리값 의미 0 논리적 0, 거짓 1 논리적 1, 참 x 알 수 없는 논리값 z 하이 임피던스, 플로팅 x 는 unknown 또는 don`t care 로 취급할 수 있다.
또한 신호강도를 모델링하기 위한 키워드들을 지원한다.
실제로 쓰이는건 못봤다. 아마 트랜지스터 레벨에서 모델링을 할 때 쓰이는것 같다.
신호강도 형태 supply driving strong driving pull driving large storage weak driving medium storage small storage highz high impedance 아래에서 위로 갈 수록 신호강도가 세지며 서로 다른 강도를 갖는 신호가 충돌할 경우, 강도가 센 신호가 우세하다.
하지만 같은 강도를 갖는 신호끼리 충돌하면 결과는 알 수 없다. (x 값으로 나온다.)
베릴로그에서 가장 중요한 자료형은 wire , reg 이다.
아래 2가지의 자료형을 갖고 디지털회로를 설계한다.
wire a; // net type reg b; // variable type
wire 는 net type 변수 키워드이다.
넷 타입이라 하면 회로에서 게이트나 블럭을 연결하는 선이다.
wire 자체는 어떤 값을 저장하지 못한다.
net type 에는 wand, tri, triand 등의 변수형도 있지만 어지간하면 wire를 사용한다.
reg 는 register 변수이다. 실제로 값을 저장할 수 있는 타입이다.
cpu 내부에 있는 레지스터와는 다른 것이다. 베릴로그에서는 단순히 값을 저장하는 변수의 역할만 한다.
reg 변수는 처음 선언되고 값을 할당하지 않으면, x 값으로 초기화가 된다. 디지털회로에서 x 값은 예측불가능한 결과를 낳으므로 반드시 reg 변수들은 리셋을 하여 0 또는 1의 값으로 만들어야한다.
wire / reg 변수들은 벡터형으로 선언할 수 있다.
wire [31:0] a; // 32비트 wire 변수 wire [0:7] b; // 8비트 wire 변수 reg c; // 1비트 reg 변수 reg [7:0] d; // 8비트 reg 변수
형식은 wire / reg [msb : lsb] <name>; 으로 선언한다.
베릴로그도 다른 언어들과 마찬가지로 배열의 인덱스는 0부터 시작한다.
숫자가 크건 작건, [ : ]안에서 왼쪽에 있는 숫자가 msb이고, 오른쪽에 있는 숫자는 lsb가 된다.
a의 msb는 32 이지만, b의 msb는 0이다.
벡터형으로 선언하지 않으면 기본적으로 1비트의 크기를 갖는 변수로 선언된다.
벡터로 선언된 변수들은 일부분만 선택 가능하다.
wire [31:0] a; // 32비트 wire 변수 a[0] // a의 첫번째 1bit a[10:4] // a의 다섯번째 부터 11번째 bit reg [127:0] bus1; // 128비트 변수 little endian reg [0:127] bus2; // 128비트 변수 little endian reg [7:0] byte1; // 8bit 변수 reg [7:0] byte2; // 8bit 변수 byte1 = bus1[127-:8] // byte1 = bus[127:120] byte1 = bus1[0+:8] // byte1 = bus[7:0] byte2 = bus2[127-:8] // byte2 = bus2[120:127] byte2 = bus2[0+:8] // byte2 = bus2[0:7]
가변벡터로 부분적으로 선택하는 것도 가능하다.
[시작비트+: 비트 폭] : 시작비트부터 비트 폭 만큼 선택 증가
[시작비트-: 비트 폭] : 시작비트부터 비트 폭 만큼 선택 감소
변수의 little endian / big endian 여부에 따라서 부분벡터가 다르게 할당된다.
다른 언어처럼 정수형, 실수형 변수 지원한다.
또한 시뮬레이션을 위해서 시간을 저장하는 time 변수도 지원한다.
integer counter = 1; real real_number = 3.3; time current_time; initial current_time = $time;
$time 은 현재 시뮬레이션 시간을 리턴하는 시스템함수다.
real_number에 저장된 값을 counter에 할당하면 정수가 되어 3이 저장된다.
파라미터로 모듈 안에서 상수값을 정의 할 수 있다.
파라미터는 모듈을 인스턴스 할 때 변경할 수 있어서 유연한 설계를 할 수 있다.
parameter RED = 0 parameter GREEN = 1, BLUE = 2; parameter signed [7:0] WIDTH
'개발 > Verilog' 카테고리의 다른 글
[Verilog][기초문법] task, function (0) 2022.01.09 [Verilog][기초문법] generation 구문 사용법 (0) 2022.01.08 [Verilog][기초문법] 조건문, 분기문 (0) 2022.01.08 [Verilog][기초문법] 모듈, 포트 (0) 2022.01.05