[FPGA]

verilog에서 'timescale'이란 어떤 의미인가?

Neo Park 2012. 12. 4. 09:54

 

Verilog언어로 '시간 지연'을 주기 위하여 다음과 같이 코딩합니다.

assign #5 foo = tiger ;


우리가 자주 쓰는 문장이지만, 이 문장을 가만히 보면 단위가 없습니다. '5'의 의미는 무었일까요?


이 것은 마치 우리가 시간 약속을 정하면서 "친구야 5 있다가 보자." 라고 이야기 하는 것과 같습니다.

여기서 '5'는 5ns가 될 수도 있지만, 5us, 5ms 심지어는 5sec가 될 수도 있습니다. 이 문장 자체 만으로는 알 수 없습니다.

이 때 등장하는 것이 바로 `timescale 문입니다.

보통 Verilog 코드의 맨 위에 아래와 같이 선언합니다.

`timescale 1ns/10ps

여기서 슬래쉬('/')의 앞에 있는 '1ns'가 바로 단위입니다.

이 값을 '1ns'라고 선언하면 그 파일 내의 모든 시간 단위는 1ns가 되기 때문에,

위의 assign문에서도 '5'는 5ns가 되는 것입니다.


그렇다면 슬래쉬('/')의 뒤에 있는 '10ps'는 무었일까요? 바로 해상도(precision)입니다.

5ns 보다 좀 더 정밀하게 적은 다음 예문 들을 보겠습니다.

1. assign #5.5 foo = tiger ;
2. assign #5.55 foo = tiger ;
3. assign #5.555 foo = tiger ;
4. assign #5.5555 foo = tiger ;

좀 전에서 보았듯이 단위가 1ns이므로, 위의 예에서 1번은 5.5ns 딜레이가 먹습니다.

그리고, 2번은 5.55ns 가 딜레이 되죠.

그러면 3번은 5.555ns, 4번은 5.5555ns의 딜레이가 먹어야 맞겠지만 사실은 그렇지 않습니다.

해상도(precision) 10ps이기 때문에 3번과 4번은 위에서 기술한 대로 딜레이가 먹지 않습니다.

만약, 4번의 해상도가 필요하다면 timescale문을 다음과 같이 기술해야 할 것입니다.

`timescale 1ns/100fs


여기서 fs는 [펨토세컨드]로써 ps[피코세컨드]의 일천분의 일인 단위 입니다.

그러면 timescale을 설정하기 위해 고려해야 할 사항은 무었일 까요? 제 경험에 비추어서 추천을 드려 보겠습니다.

 


1. 프로젝트에서 사용하시는 모든 소스코드의 `timescale을 통일하십시요!

(1) 소스 코드 마다 timescale이 다르면 정말로 혼동될 것입니다.
(2) 특히 외부 IP를 들여온 경우에 간혹 이상한(?) timescale을 사용하는 경우도 있으니 확인 해야 합니다.
(3) 소스코드들이 있는 곳의 맨 상위 디렉토리에서 아래 명령어를 사용하여 확인해 보세요.

grep -r --include="*.v" "timescale" *

이 명령을 하면, 모든 서브 디렉토리에서 *.v 파일을 찾아 grep 명령으로 "timescale" 구문이 있는 줄을 화면상에 표시해 줍니다.



2. 대략 `timescale 1ns/10ps가 무난합니다.

(1) 요즘의 FPGA나 ASIC의 성능을 고려하면 시간 단위는 1ns가 적당해 보입니다.
(2) 간혹 해상도(precision)를 1ns로 하는 경우도 있고, 혹은 1fs로 하는 경우도 보았습니다.
-> 해상도를 1ns로 하면 코드내에서 절대로 소수점 시간을 사용하면 안됩니다.
   소숫점 사용했다는 자체가 해상도를 위반한 것이기 때문입니다.


-> 해상도를 1fs등으로 너무 낮추면 시뮬레이션 시간이 기하 급수적으로 늘어 납니다.
   시뮬레이터의 입장에서 생각해 보면, 다루어야 할 시간의 데이터가 무지하게 커져서 계산 시간이 늘어 날 것 같기는 합니다.


결론: '모든' verilog 소스코드의 맨 윗줄에 `timescale 1ns/10ps 라고 적으세요.

물론, 제 추천이니까 상황이 다르거나 더 좋은 방법이 있으시다면, 최종 결정은 디자이너의 몫일 것입니다.

언제부터인가 시뮬레이션 시간이 이상하게 오래 걸린다고 생각되신다면,

위의 grep 명령어를 써서 지금 프로젝트의 timescale 값들을 한 번 확인해 보는 것도 좋은 방법 일 것 같습니다.


이해를 돕는 연습문제(?)를 하나 내어 봅니다.

`timescale 10ns/10ps라면 assign #5 foo = tiger ;에서 딜레이는 얼만큼 먹을 까요?

답: 50ns 입니다.