Inflearn brand logo image

인프런 커뮤니티 질문&답변

이광언님의 프로필 이미지
이광언

작성한 질문수

디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기

[과제2] Port를 확장하여 High-speed를 위한 Dual-port + Two-port RAM 설계하기

TPSRAM,DPSRAM TB코드 문법 질문

해결된 질문

작성

·

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문의 내부 블록이 실행됩니다. 이렇게 해야 wawd의 값이 매 클럭 싸이클마다 올바르게 갱신됩니다.
  • 만약 @(posedge clk);가 없다면 for문 내부의 모든 할당이 클럭의 영향을 받지 않고 즉시 연속적으로 실행되므로, 원하는 디지털 로직의 동작을 수행하지 않습니다.

따라서, SystemVerilog에서는 for문과 begin문 내에서 클럭 신호에 맞춰 동작을 보장하기 위해 @(posedge clk);을 사용하는 것이 통상적입니다.

이해가 되지 않거나 추가 질문이 있으시다면 언제든지 문의해 주세요.

여기에서 내용을 더 확인하실 수 있습니다.

이광언님의 프로필 이미지
이광언

작성한 질문수

질문하기