Inflearn brand logo image

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

smj5402님의 프로필 이미지
smj5402

작성한 질문수

설계독학's Verilog 마스터 Season 1 (실전 코딩 Test 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)

L1-P12 인터럽트 제어 질문

작성

·

31

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 발생하는 부분이 없는 것입니다.

 

image.png

 

제가 예상했던 파형 (빨간색)

 

 

 

답변 2

1

ETA님의 프로필 이미지
ETA
지식공유자

안녕하세요 손민재님,

질문 주셔서 감사드립니다. 민재님 열정에 따봉을 드립니다!

아마 파형상으로 보면 0으로 값이 변경이 예상되는 구간은 95ns에서 105ns까지 일 것 같네요.

제가 손민재님 코드를 그대로 넣어서 돌려보았는데요.

ack 가 1인 클럭의 상승 엣지 시점에 active와 service 값이 0 으로 초기화 되는 것을 확인할 수 있었습니다.

image.png

./clean 하고 다시 ./build 를 하여도 동일한 증상이 나타날 경우 다시 한번 말씀 부탁 드립니다.

파형을 보니 조금만 코드를 손보면 답안에 도달하실수 있을것 같으십니다.

화이팅하셔요!

smj5402님의 프로필 이미지
smj5402
질문자

답변 감사합니다!!
시뮬레이션 돌릴 때 실수가 있었던 것 같네요 ㅠㅠ
덕분에 헤매면서 답안에 도달할 수 있었습니다.

항상 좋은 강의 감사하고 남은 강의랑 part2까지 기대하겠습니다!!

0

안녕하세요, 인프런 AI 인턴입니다. 손민재님.

인터럽트 제어 관련 Verilog 코드에서 발생한 동작 문제에 대해 설명드리겠습니다. 특히, interrupt_ack 발생 시, 해당 신호를 의도한 대로 업데이트하는 것이 핵심인 것 같습니다. 질문 내용을 바탕으로 시뮬레이션 상에서 신호가 예측과 다르게 동작하는 원인과 해결 방안을 안내드리겠습니다.

질문 요약 및 답변

  1. Interrupt Ack의 동작

    • 질문에서 말씀하신 대로, interrupt_ack가 1로 설정되면 interrupt_activeinterrupt_service가 0으로 설정되기를 기대합니다.
    • 코드를 보면 posedge clk or negedge rst_n에 의해 이 블록이 실행됩니다.
    • interrupt_requests는 비동기적으로 발생할 수 있습니다. 그러나 posedge clk로 인해 interrupt_serviceinterrupt_active는 항상 클락 에지에 동기화되어 업데이트됩니다.
  2. 딜레이가 없는 이유

    • 시뮬레이션 상의 동작이 예상과 다르게 보였다면, 이는 타이밍 다이어그램에서 신호 갱신의 시점이 예상만큼 지연되지 않기 때문일 수 있습니다.
    • 이때 posedge clk에서 예측되는 상태 변화가 즉시 반영되기 때문입니다.
    • 시뮬레이션 결과를 분석할 때, 항상 클랙 엣지에 동기화된 신호 변경을 예상하셔야 합니다.

디버깅 팁

  • 신호의 우선순위: 코드 내 if-else 문에서 가장 우선 순위가 높은 조건이 먼저 평가됩니다. 따라서 원하는 조건이 예상대로 작동하는지 확인하는 것이 좋습니다.

  • 시뮬레이션 설정: 시뮬레이션 도구에서 클럭 주기, 리셋 타이밍, 또는 다른 신호의 초기 조건이 올바르게 설정되어 있는지 확인해야 합니다.

관련 질문 링크

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

smj5402님의 프로필 이미지
smj5402

작성한 질문수

질문하기