인프런 커뮤니티 질문&답변
L1-P12 인터럽트 제어 질문
작성
·
46
2
안녕하세요 🙂
[1. 질문 챕터] : 29. [L1-P12] Interrupt Controller (인터럽트 제어)
의 제가 설계한 TODO 부분이 의도한 대로 동작하지 않는 것에 대해서
[2. 질문 내용] :
제가 작성한 코드 (TODO부분)
wire [$clog2(INT_COUNT)-1:0] priority_req;
assign priority_req = priority_encoder(interrupt_requests);
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
interrupt_service <= {INT_COUNT{1'b0}};
interrupt_active <= 1'b0;
end else if(interrupt_ack) begin
interrupt_active <= 1'b0;
interrupt_service <= 8'b0;
end else if(interrupt_requests) begin
interrupt_active <= 1'b1;
interrupt_service <= (1 << priority_req); // one hot
end
end
[3. 시도했던 내용, 그렇게 생각하는 이유] :
가장 이해가 안되는 부분은
interrupt_ack 가 1이 됐을 때 (시뮬레이션에서 95ns)
interrupt_active <= 1'b0;
interrupt_service <= 8'b0; 이 부분이 예약되고 105ns에서 각각 0으로 값이 업데이트 될 것으로 예상하였는데
delay 발생하는 부분이 없는 것입니다.

제가 예상했던 파형 (빨간색)
답변 2
1
안녕하세요 손민재님,
질문 주셔서 감사드립니다. 민재님 열정에 따봉을 드립니다!
아마 파형상으로 보면 0으로 값이 변경이 예상되는 구간은 95ns에서 105ns까지 일 것 같네요.
제가 손민재님 코드를 그대로 넣어서 돌려보았는데요.
ack 가 1인 클럭의 상승 엣지 시점에 active와 service 값이 0 으로 초기화 되는 것을 확인할 수 있었습니다.

./clean 하고 다시 ./build 를 하여도 동일한 증상이 나타날 경우 다시 한번 말씀 부탁 드립니다.
파형을 보니 조금만 코드를 손보면 답안에 도달하실수 있을것 같으십니다.
화이팅하셔요!
0
안녕하세요, 인프런 AI 인턴입니다. 손민재님.
인터럽트 제어 관련 Verilog 코드에서 발생한 동작 문제에 대해 설명드리겠습니다. 특히, interrupt_ack 발생 시, 해당 신호를 의도한 대로 업데이트하는 것이 핵심인 것 같습니다. 질문 내용을 바탕으로 시뮬레이션 상에서 신호가 예측과 다르게 동작하는 원인과 해결 방안을 안내드리겠습니다.
질문 요약 및 답변
Interrupt Ack의 동작
- 질문에서 말씀하신 대로,
interrupt_ack가 1로 설정되면interrupt_active와interrupt_service가 0으로 설정되기를 기대합니다.
- 코드를 보면
posedge clk or negedge rst_n에 의해 이 블록이 실행됩니다.
interrupt_requests는 비동기적으로 발생할 수 있습니다. 그러나posedge clk로 인해interrupt_service와interrupt_active는 항상 클락 에지에 동기화되어 업데이트됩니다.
- 질문에서 말씀하신 대로,
딜레이가 없는 이유
- 시뮬레이션 상의 동작이 예상과 다르게 보였다면, 이는 타이밍 다이어그램에서 신호 갱신의 시점이 예상만큼 지연되지 않기 때문일 수 있습니다.
- 이때
posedge clk에서 예측되는 상태 변화가 즉시 반영되기 때문입니다.
- 시뮬레이션 결과를 분석할 때, 항상 클랙 엣지에 동기화된 신호 변경을 예상하셔야 합니다.
- 시뮬레이션 상의 동작이 예상과 다르게 보였다면, 이는 타이밍 다이어그램에서 신호 갱신의 시점이 예상만큼 지연되지 않기 때문일 수 있습니다.
디버깅 팁
신호의 우선순위: 코드 내
if-else문에서 가장 우선 순위가 높은 조건이 먼저 평가됩니다. 따라서 원하는 조건이 예상대로 작동하는지 확인하는 것이 좋습니다.시뮬레이션 설정: 시뮬레이션 도구에서 클럭 주기, 리셋 타이밍, 또는 다른 신호의 초기 조건이 올바르게 설정되어 있는지 확인해야 합니다.
관련 질문 링크
- Verilog HDL/FPGA 인터럽트 설계 질문 - 인터럽트 동작 및 타이밍 제어에 대한 문의가 포함된 답변입니다.
- Verilog HDL 설계에서 비동기 신호 처리 - 신호의 비동기 처리 방식에 대한 설명이 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





답변 감사합니다!!
시뮬레이션 돌릴 때 실수가 있었던 것 같네요 ㅠㅠ
덕분에 헤매면서 답안에 도달할 수 있었습니다.
항상 좋은 강의 감사하고 남은 강의랑 part2까지 기대하겠습니다!!