해결된 질문
작성
·
79
0
begin: tpsram_write
@(posedge clk);
for (int i=0;i<DEPTH;i++) begin
we <= 1;
wa <= i;
wd <= 'h10+i;
@(posedge clk);//필요한 이유
end
we <= 0; @(posedge clk);
end
@(posedge clk); for문 마지막과 begin문 마지막에 필요한 이유가 뭔가요?
주석 처리 후 시뮬레이션을 돌려보니 for문에 맞게 wa값과 wd값이 업데이트가 되지 않았습니다.
혹시 system verilog에서 for문과 begin문을 작성하면 @(posedge clk)을 해주는 것이 규칙인가요?
답변 2
0
네 안녕하세요, 답변 남겨드립니다.
for문 마지막에 @(posedge clk)
가 필요한 이유는 문법때문이 아니라, 실제 그러한 동작을 의도했기 때문입니다. @라는것이 이벤트 트리거라서, 그 이벤트가 발생할 때에만 아래 구문을 이어가게 되어있습니다.
- for
루프 내에서 we
, wa
, wd
와 같은 신호를 업데이트한 후, 다음 클럭 사이클에서 이 신호들이 실제로 반영되도록 하기 위해 @(posedge clk)
를 사용합니다. 클럭의 상승 에지에서 신호가 업데이트되므로, 이 시점을 명시적으로 지정해 주어야 합니다.
begin문 마지막에 @(posedge clk)
또한 마찬가지입니다.
- begin
블록이 끝나는 시점에서도 클럭의 상승 에지에서 신호가 안정적으로 반영되도록 하기 위해 @(posedge clk)
를 사용합니다. 이는 블록 내의 모든 신호가 클럭에 동기화되어 업데이트되도록 보장합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
이광언님, 질문 주셔서 감사합니다.
SystemVerilog에서 @(posedge clk);
문장은 시뮬레이션에서 시계를 기반으로 동작이 진행되도록 하기 위한 동기화 포인트입니다. 초기 begin문과 for문의 마지막에 있는 @(posedge clk);
는 각각의 시계 싸이클에 따라 동작을 제어합니다.
@(posedge clk);
을 for문 내 반복 과정에서 추가하면, 매 반복마다 클럭의 상승 에지에서 for문의 내부 블록이 실행됩니다. 이렇게 해야 wa
와 wd
의 값이 매 클럭 싸이클마다 올바르게 갱신됩니다.@(posedge clk);
가 없다면 for문 내부의 모든 할당이 클럭의 영향을 받지 않고 즉시 연속적으로 실행되므로, 원하는 디지털 로직의 동작을 수행하지 않습니다.따라서, SystemVerilog에서는 for문과 begin문 내에서 클럭 신호에 맞춰 동작을 보장하기 위해 @(posedge clk);
을 사용하는 것이 통상적입니다.
이해가 되지 않거나 추가 질문이 있으시다면 언제든지 문의해 주세요.
여기에서 내용을 더 확인하실 수 있습니다.