Monday, January 19, 2015

[verilog] delay 지연

시스템 레벨에서 디지털의 저속 회로에서는 타이밍이나 딜레이에 대해서 딱히 신경쓸일이 없지만 고속회로에서는 타이밍과 딜레이를 맞추기 위해 통신 신호선의 길이를 같게 만드는 등의 일을 하게 된다. 특히 RF 에서는 선의 길이, 방향, 모양, 두께 에 따라서 달라지는 요소들이 많기 때문에 굉장히 어렵다.

그나마 다행인게 칩 레벨에서 verilog로 디지털 설계를 할 때는 타이밍 문제정도가 중요한 요소 중 하나 인데 이 중 딜레이 문제가 있다. 

사용되는 게이트 내부에서 소모하는 시간이 있고 선의 길에 따라 전기속도(매질에 따라 다름, 빛의 속도 아님)에 따라 발생하는 딜레이도 있는데 예전에는 전체속도가 느리기 때문에 이런 문제가 큰 이슈가 아니였지만 지금은 빛의 속도도 카운트하는 시대에 선로의 길이에 대한 딜레이도 펑션에 문제가 발생할 정도로 중요한 이슈가 된다.

흔히 이런 딜레이를 없다고 생각하고 설계를 해서 시뮬레이션을 돌리는 것을 제로지연(zero-delay)라고 한다. 

실제 회로에서는 게이트에 지연을 가지고 있고 시뮬레이션을 위해서 verilog에서도 지연을 지정해 줄 수 있다. 

지연은 3가지로 나눌 수 있다.
상승지연, 하강지연, 턴-오프 지연 이다.


하강 지연은 0,x or z 에서 1로 변화되는 것과 관계 되어 있다.

하강 지연은 1,x or z 에서 0으로 변화되는 것과 관계되어 있다.

턴오프 지연은 어떤값에서 임피던스 값(z)로 게이트 출력이 변화는 것과 관계되어 있다.
만약 게이트 출력이 x로 변했다면, 상승, 하강, 턴-오프 지연 중 가장 작은 값으로 간주한다. 

예)
and #(delay_time) a1(out, i1, i2);

and #(rise_val, fall_val) a1(out, i1, i2);

and #(rise_val, fall_val, turnoff_val) a1(out, i1, i2);

한단계 더 나아가서 지연에 대해 최소/평균/최대값을 지정할 수 있다. 합성 툴에 따라 다르지만 합성시 추가 명령어에 따라 +maxdelays, +typdelays, +mindelay 옵션에 의해 선택된다. (옵션 미지정시 기본값은 평균)

예)
and #(min:typ:max, min:typ:max, min:typ:max) a1(out, i1, i2);

이런 기능이 있다는 것은 시뮬레이션에서 딜레이로 발생할 수 있는 문제를 눈으로 확인하기 위해서 인데 이런 과정은 pre-sim 즉, 제로 딜레이에서 펑션적으로 문제가 되던 부분들이 주로 나타나게 된다. 하지만 post-sim 에서는 딜레이가 포함된 시뮬레이션이기 때문에 이런 문제들에 대해서 크게 생각하지 않아도 되고 pre-sim 에서도 SDF를 통해서 시뮬레이션 하게 되면 라인딜레이를 제외한 게이트 딜레이까지는 체크가 가능하다. 라인 딜레이에 대한 부분도 어느정도 경험을 통해서 예측(사실 한클럭 여유면 대부분 충분함)가능하기 때문에 딱히 문제될게 없다? 정도랄까...(경험이 없어서 다른 문제에 대해서는 잘 모르겠음 ㅠ)

아날로그나 어떤 모델링을 만들면서 사용되면 모를까 일반적인 디지털 시뮬레이션에 딜레이를 자주쓰는 일은 없을 것 같다는 것이 내 결론이다. (만약 잘못된거면 사용되는 예를 한수 가르쳐 주시면 감사드립니다.ㅠㅠ)

사용 방법은 여러개가 있는데
assign #10 out = in1 & in2; // 10 지연 시간뒤 in1 in2 계산 결과 값이 out 적용
assign out = #10 in1 & in2; // in1 in2 계산 결과 값이 10 지연 시간뒤 out 적용

같은 말 처럼 보이지만 다르다.
인터넷에서 예문 퍼옴

begin // Equivalent to intra-assignment delay.
hold = y; // Sample and hold y immediately.
#1; // Delay.
x = hold; // Assignment to x. Overall same as x = #1 y.
end 
begin // Equivalent to delayed assignment.
#1; // Delay.
x = y; // Assign y to x. Overall same as #1 x = y.
end 

하나 더
wire #10 out; // 모든 out 사용된 곳에 10 지연 적용

선언에서 딜레이 적용할 경우 사용된 모든 곳에 동일하게 적용 시킬 수 있다.

끝!

No comments :

Post a Comment