본문 바로가기

IT

[verilog] `timescale 1ns/10ps 의미

이것도 검색으로 펌질, 여타 설명이 필요없는 간결한 자료

`timescale 1ns/10ps

앞에 숫자는 해당 파일내에서 쓰이는 숫자들의 단위를 나타냄..즉 #2 이렇게 쓰여있다면 2ns를 나타냄

뒤의 숫자는 시뮬레이터에서 많이 쓰일 것 같은데 코딩에서는 별 효과가..무튼 소수점을 허용하려면 어디까지 해야할까를 나타내야 하는데 그 때 쓰이는 최소 단위

설명은 아래 참고.


[출처] [verilog] timescale에 대하여|작성자 j0hnch01

assign #5 foo = tiger ;

이 문장을 가만히 보면 단위가 없습니다.  '5'의 의미는 무었일까요?
...

여기서 '5'는 5ns가 될 수도 있지만, 5us5ms 심지어는 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을 통일하십시요!

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 입니다.