6. 게이트 지연(Gate Delay)

포스팅 이전에 먼저 해두는 말.

아무래도 책 페이지가 많기도 하고, 포스팅 하는 본인이 펼쳐진 페이지 보고 공부하는 느낌이 현재는 강한지라...

지금 당장이라도 여기서 다룰 내용은 아니지만 그렇다고 변명 아닌 변명을 해봅니다.

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------[Gate Delay]전공 교재 p80

 디지털 회로에서 쉽게 간과하는 것이 있는데, 실제 회로에서는 딜레이가 있다는 것이죠. 그렇기 때문에, 엔지니어가 직접 구현한 회로와 다소 차이가 발생할 수 있는데, 우리는 이를 Verilog에서 따로 지연(Delay)를 지정할 수 있다는 것입니다.

 Input -> Output에서의 지연은 세 가지 형태가 존재하는데, 기술하는 것을 보면 쉽게 파악할 수 있을 것입니다.

 

1. 상승 지연

) 다른 값(0, x or z)에서 1로 게이트 출력이 변화하는 것을 칭한다.

2. 하강 지연

) 다른 값에서 0으로 게이트 출력이 변화하는 것을 칭한다.

3. Turn-Off 지연

) 어떤 값에서 하이 임피던스 값(z)으로 출력이 변화하는 것을 칭한다. 

 

정의만 최대한 간결하게 하고 이후 필자가 10장으로 넘어갔을 때 다른 포스팅에서 다시 다룰 예정입니다.

ex) +mindelays, +typedelays, +maxdelays 등

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

지금 다루고자 하는 것은 시뮬레이션에서 과연 어떠한 출력을 갖고 나오는 것인지를 보려고 합니다.

다음과 같은 논리식이 있다고 가정해보죠.

다만 and gate와 or gate가 각각 5와 4의 단위시간을 갖는다고 가정을 해보고요.

Out = ( a · b ) + c

다음 모듈을 구현한 블록은 다음과 같을 것입니다.

 

이전에 하던 Verilog와 같이 그대로 기술을 하면 되지만 지연시간을 입력할 필요가 있습니다.

각 게이트를 지날 때마다 #(time)을 입력할 필요가 있다는 것이죠.

 

ex) and #(10) and1(o, a, b) : and1라는 이름의 and gate가 10 단위시간의 딜레이를 갖는다.

 

이제 이를 Verilog로 구현해볼게요.

 

 


module	D(
input	a, b, c,
output	out
);

wire	e;

and	#(5) a1(e, a, b);
or	#(4) o1(out, e, c);

endmodule

module	tb;

reg	A, B, C;
wire	Output;

D	D1(
	.a(A),
	.b(B),
	.c(C),
	.out(Output)
	);

initial	begin

A = 1'b0; B = 1'b0; C = 1'b0;
#10
A = 1'b1; B = 1'b1; C = 1'b1;
#10
A = 1'b1; B = 1'b0; C = 1'b0;
#10
$finish;

end

endmodule

 

교재와 조금 다른 부분으로는 테스트 벤치(교재에서는 stimulus로 되어있음) 부분인데 이 부분은 추후 수정이 용이하게 포트 선언하는 방식을 바꾼 것이며, 그 이외로는 다른게 없어요.

이에 대한 시뮬레이션을 gtkwave 파일로 추출해 파형을 보면 다음과 같은 그래프를 볼 수 있고, 이는 교재와 동일해요.

 

시간을 좀 길게 잡아서 그래프가 많이 길어졌네요. 만일 실습을 진행하고자 한다면 #10 부분을 좀 줄여서 타협을 보시는게 나을거 같습니다.

 

우선 A,B,C는 딜레이가 없기 때문에 값을 인식한 즉시 변화하는 것을 관찰할 수가 있습니다.

하지만 우리가 조정을 했던 e(AND 게이트)와 Output(OR 게이트)는 계산 결과가 뒤로 밀린 것을 확인할 수 있는데요.

e는 15 sec, Output은 14 sec로 각각 단위 시간 5, 4 만큼 지연된 것을 확인할 수 있습니다.

그렇다면 한 가지 궁금한 것은, 최종적으로 Output이 나오기 위해서는 인풋 e가 필요한데 '왜 첫 계산 결과에서는 이를 고려하지 않고 4초만 딜레이가 됐느냐'가 이번 포스팅의 존재 이유입니다.

 

답은 생각해보면 간단합니다.

 

최종적으로 사용하는 게이트가 OR 게이트이기 때문이죠.

OR gate는 우리가 진리표를 보면 알 수 있듯이, 인풋 하나가 1을 가진다면 다른 신호 값과 상관없이 바로 결과를 출력을 할 수 있습니다.

이를 OR 게이트가 아닌 AND 게이트로 구성을 했다면 Output은 14 sec가 아닌 e의 결과가 나온 후, 즉 15 sec에서 4 sec가 딜레이 된 시기(19sec)에 나오겠죠.

OR 게이트에서도 이를 확인하고 싶다면, C의 값을 0으로 두면 될 것 같아요.(이는 시뮬레이션 돌려보지 않았습니다.)

OR 게이트는 0이 먼저 나왔을 시 결과를 뽑아낼 수는 없으니깐요.

 

위 포스팅의 시뮬레이션 자체는 간단하기 때문에 위 코드를 기반으로 해서 딜레이 값 바꾸고 초기값 바꾸면서 진행하다 보면 쉽게 이해할 수 있을거 같네요.