보통 RTL로 testbench를 작성할 때,
@(posedge CLK)의 구문을 사용하여
clock의 rising edge를 기다린 후 input을 인가하는 경우가 있다.

다음은 이러한 경우의 예인데,
이 예에서 PUSH task가 호출되면
PUSH task는
한 CLK cycle동안, push를 set해주고 wdata에 data를 인가해주는 역할을 한다.

task PUSH;
    input    [63:0]     data;
begin
    @(posedge CLK);     // no.1 clock edge
    push = 1'b1;
    wdata = data;
    @(posedge CLK);     // no.2 clock edge
    push = 1'b0;
    wdata = 64'h0;
end
endtask

하지만 이렇게 task를 작성하여 testbench로 사용하는 경우 문제점이 발생할 수 있다.
의도와는 달리 

여기에서 push signal은 CLK이 올라가는 동시에 1'b1로 올라가는 것을 뜻하게 된다.

이는 간단한 실험으로 직접 확인해 볼 수 있는데
push signal을 input으로 하는 간단한 CLK에 동기화된 positive-edge F/F에서
output 데이터를 확인해보면, no.1 clock edge에서 F/F의 output이 1'b1로 변하는 것을 확인할 수 있다.

즉, 의도는 CLK이 한번 올라간(no.1 clock edge) 다음 push를 1'b1로 올리고자 하였을지라도
이 구문에서는 push가 1'b1, wdata가 data로 올라가 있는 상태에서 CLK이 올라가는(no.1 clock edge) 상황으로 인지하게 된다.


이러한 상황을 방지하기 위해서는

task PUSH;
    input    [63:0]     data;
begin
    @(posedge CLK);     // no.1 clock edge
#1
    push = 1'b1;
    wdata = data;
    @(posedge CLK);     // no.2 clock edge
#1
    push = 1'b0;
    wdata = 64'h0;
end
endtask

각각의 @(posedge CLK)구문 뒤에 적절한 delay를 주어서
의도한 대로 push와 wdata signal이 변경될 수 있도록 해 주어야 한다.

'RTL' 카테고리의 다른 글

Clock Control  (0) 2011.02.10
AXI narrow write operation  (0) 2010.11.24
SystemVerilog Syntax vi Plug-in  (0) 2010.06.14
Verilog Language Reference Manual  (0) 2010.04.21
File I/O  (2) 2010.04.21
Posted by sunshowers
,