보통 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이 변경될 수 있도록 해 주어야 한다.
@(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 |