[Verilog] 생소한 자료형 정리 (2) - variable 자료형

pikamon·2022년 4월 25일
0

Verilog

목록 보기
6/12

Verilog의 자료형에는 두 가지 종류가 있다.

  • net 자료형
    - wire, tri, wand, wor, triand, trior, supply0, supply1, tri0, tri1, trireg
  • variable 자료형
    - reg, integer, real, time, realtime

모듈 혹은 게이트 간의 물리적인 연결을 나타내는 net 자료형과, 절차적 할당문에서 값을 임시로 저장하기 위한 variable 자료형이 있다.

대개 모듈을 설계할 때 wire과 reg, integer만으로 모듈을 설계했었기 때문에, 나머지 자료형에 대한 개념이 부족하여 정리하였다.


1. time

time은 시뮬레이션 시간을 처리하거나 저장하기 위해 사용하는 자료형으로, 64비트 unsigned 정수형 크기를 갖는다.

예제 코드를 작성해보자.

  • test_time.v
module test_time();

	time t_start;
	time t_end;

	initial begin
		t_start = $time;
		#20;
		t_end = $time;

		$display("start = %0t, end = %0t, diff = %0t", t_start, t_end, t_end - t_start);
		$finish;
	end

endmodule

$time은 시간값을 64비트 정수형으로 출력하는데, time 자료형을 이용해 해당 값을 저장한다.

실행하면 아래와 같이 출력된다.

start = 0, end = 20, diff = 20

2. real

real은 interger와 유사하며, 64비트 배정밀도 실수형 값을 저장할 때 사용된다.

예제 코드를 작성해보자.

  • test_real.v
module test_real();

	integer i = 12345;
	real r = 12.345;

	initial begin
		$display("i = %d, r = %f", i, r);
		$finish;
	end

endmodule

integer를 %d로 출력하듯이 real은 %f로 출력하면 된다.

실행하면 아래와 같이 출력된다.

i =       12345, r = 12.345000

3. realtime

realtime은 time과 유사하나 시간값을 실수 형태로 저장할 때 사용된다. real과 동일하게 64비트 배정밀도 크기를 갖는다.

아래 예제를 한 번 보자.

  • test_time.v
`timescale 1ns/10ps

module test_time();

	time t;

	initial begin
		#1    t = $time; $display("T = %0t at time #1   ", t);
		#0.49 t = $time; $display("T = %0t at time #0.49", t);
		#0.50 t = $time; $display("T = %0t at time #0.50", t);
		#0.51 t = $time; $display("T = %0t at time #0.51", t);
		$finish;
	end

endmodule

timescale을 위와 같이 설정하고 delay를 주면서 시간값을 정수형으로 계산해보자.

실행하면 아래와 같이 출력된다.

T = 100 at time #1
T = 100 at time #0.49
T = 200 at time #0.50
T = 300 at time #0.51

두 번째 줄을 보면 delay를 0.49로 줬을 때의 누적 delay는 1.49가 되는데, 소수점 이하 자리가 반올림되어 1.00으로 처리된다. 따라서 t의 값이 100으로 출력된다.

이번엔 time을 realtime으로 바꿔서 실행해보자.

  • test_realtime.v
`timescale 1ns/10ps

module test_realtime();

	realtime t;

	initial begin
		#1    t = $realtime; $display("T = %0t at time #1   ", t);
		#0.49 t = $realtime; $display("T = %0t at time #0.49", t);
		#0.50 t = $realtime; $display("T = %0t at time #0.50", t);
		#0.51 t = $realtime; $display("T = %0t at time #0.51", t);
		$finish;
	end

endmodule

실행하면 아래와 같이 출력된다.

T = 100 at time #1
T = 149 at time #0.49
T = 199 at time #0.50
T = 250 at time #0.51

소수점 이하가 반올림되지 않고 온전히 처리되는 것을 볼 수 있다.

아래는 파형으로 출력한 결과이다.


이 외에도 logic, byte, shortreal 등 여러 가지 자료형이 있는 것 같으니, 필요 시 찾아보면 될 것 같다.

profile
개발자입니당 *^^* 깃허브 https://github.com/pikamonvvs

0개의 댓글