• 카테고리

    질문 & 답변
  • 세부 분야

    반도체

  • 해결 여부

    미해결

17장 코드 설명

23.09.21 17:47 작성 조회수 240

2

안녕하세요 맛비님! 강의 잘 듣고 있습니다! 다름이 아니라 verilog 문법 강의를 막 듣고 이 강의를 바로 수강해서인지 .. 살짝 어려운 감이 없지 않아 있지만 그래도 재밌게 듣고 있습니다! 하지만,, 질문거리는 많네용..

 

16~17장의 FSM 관련해서 질문을 드리려고 합니다!

 

  1. 17장에서

     

    always @(*)

    begin

     

    n_state = S_IDLE; // To prevent Latch.

    case(c_state)

     

    S_IDLE: if(i_run)

     

    n_state = S_RUN;

     

    S_RUN : if(is_done)

     

    n_state = S_DONE

    ;

     

    else

     

    n_state = S_RUN;

     

    S_DONE: n_state = S_IDLE;

     

    endcase

     

    end

굵게 표시된 부분을 추가하셨는데 제가 알기로는 if 구문에서 else를 정의하지 않으면 이전 상태를 계속 유지하는 걸로 알고 있는데, 그럼 여기서 else를 정의하지 않으면 S_RUN 상태를 계속 유지하니까 굳이 else를 추가할 필요가 없지 않나요?

 

  1.  

    // Step 4. Registering (Capture) number of Count

reg [6:0] num_cnt;

always @(posedge clk or negedge reset_n) begin

if(!reset_n) begin

num_cnt <= 0;

end else if (i_run) begin

num_cnt <= i_num_cnt;

end else if (o_done) begin

num_cnt <= 0;

end

end

 

17장에서 이 코드를 설명하실 때 굵게 표시한 부분을 '사용자가 i_num_cnt 를 쭉 100으로 유지 못하는 경우를 방지하기 위해 이렇게 코드를 작성했다' 라고 하셨는데 사실 이 부분이 이해가 잘 안 돼서.. 혹시 어떤 상황인지 좀 더 자세하게 설명 가능할까요??

 

 

  1. 그리고 17장 코드 step 4,5에서 굳이 내부 F/F를 만들어서 input을 담는 이유가 궁금합니다. 제가 생각하기엔 F/F를 만들면 그만큼 delay가 생기게 되고 이는 손해라고 생각이 들어서요

num_cnt, cnt_always를 말씀 드린겁니다!

 

  1. 17장 DUT step5 코드 중에서 마지막에 else를 쓰지 않으셨던데 이유가 뭔지 알 수 있을까요??

     

    이때는 is_done, o_running 이외에 경우가 없어서 그런가요?

 

  1. 마지막으로 맛비님의 코딩 스타일을 알고싶습니다. 솔직히 counter 까지는 verilog 문법을 공부하면서 설계해봤던 모듈이고 직관적으로 이렇게 설계하면 되겠다! 라는 생각이 들었는데

     

    FSM을 설계할 땐 step1,2 이런 식으로 code를 짜기 까지 어떤 생각의 흐름으로 coding 하셨는지가 궁금합니다!

 

읽어주셔서 감사하고 긴 글이지만 꼭 답변 부탁드리겠습니다 ㅜㅠㅜㅠ 감사합니다!!

 

 

 

답변 2

·

답변을 작성해보세요.

1

안녕하세요 :)

AI 인턴이, 열심히 달아놓았는데요. 답변 드릴께요.

  1. Combinational 구문에서 full state 로 조건을 구성하지 못하면 latch 가 발생하게 됩니다. 말씀해주신 것처럼 유지한다는 표현이 곧 latch 를 의미하겠죠. 자세한건 다음 링크 참고 부탁드립니다. https://thinkpiece.tistory.com/184

  2. i_num_cnt 는 외부에 있죠. 그래서 동작중에 변할 수 있음을 말한거에요. (외부꺼니, 유지한다는 rule 이 있지 않는한 보장이 안되죠) 그래서 num_cnt 라는 우리 모듈 안쪽의 변수에 저장해놓고 사용하자는 뜻입니다. 해당 내용은 제 마음대로 한거고요. 헌재님이 빼도 되겠다 하시면 빼셔도 됩니다. 스펙은 설계자가 정하는거죠?

  3. 해당 질문은 trade off 관계의 질문임으로, 헌재님께서 빼도 된다 생각하시면 빼시면 됩니다.

  4. step5 의 코드는 sequatial logic 입니다. 앞선 1번은 combinational logic 이라고 했죠. (두개 차이는 제 강의에서 다룬적이 있어서 복습부탁드립니다) sequatial logic full state 로 해놓지 않아도 latch 가 발생하지 않고, 값을 유지합니다.

  5. 코딩스타일.... 이라.... (이거이거... 어디서 부터 설명을..) 결론은 다른 분들이 코딩한 코드를 참고해보시고, 본인의 것으로 만들자 입니다. 참고로 회사가시면 코딩스타일 룰 북도 있는 경우를 봤어요. (구글링 해보시면 좋은것들도 많이 나올꺼고요)

image

즐공하세요 :)

설계자님의 프로필

설계자

질문자

2024.01.19

sequential logic이 오히려 full state로 정의해놓지 않으면 latch가 발생하지 않나요??

verilog HDL을 공부할 때

순차회로를 기술할 때 else를 빠뜨리면 latch가 생성된다고 배웠어서 다시 질문드립니다ㅠ

always @(posedge clk)

if (reset)

q <= 1'b0;

else if (enable)

q <= d;

이 경우에 enable =0 일때가 명시돼있지 않으니 enable = 0이 되면 latch가 형성되어

이전 값을 유지하지 않나요?

음.. 학교에서 배운내용이라면, 잘못된 내용이고요. ㅠ

다음과 같습니다.

==================================

sequential logic 은 저장 소자인 F/F 이 생성되고요. full state 를 기술하지 않아도 latch 가 발생하지 않습니다.

combinational logic 은 full state 를 기술하지 않으면 latch 가 발생합니다.

 

즐공하세요 🙂

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.09.23

안녕하세요, 인프런 AI 인턴이에요. 17장의 코드 설명에 대한 질문이시군요.

첫 번째 질문에 대해서는, verilog문법에서 if 구문을 사용할 때, else를 정의하지 않으면 이전 상태를 계속 유지하게 됩니다. 따라서 여기서 else를 추가하지 않아도 S_RUN 상태를 유지하는 것이 맞는 거예요. 추가로 else를 정의하는 것은 코드의 가독성을 높이기 위함일 수도 있습니다.

두 번째 질문에 대해서는, 주어진 코드는 레지스터(num_cnt)의 값을 캡처하는 코드입니다. reset_n 신호가 active low로 정의되어 있고, i_run과 o_done 신호에 따라 레지스터 값이 업데이트됩니다. reset_n 신호가 inactive 시에는 num_cnt 값을 0으로 초기화하고, i_run이 활성화된 경우에는 i_num_cnt 값을 캡처하며, o_done 신호가 활성화된 경우에는 다시 num_cnt 값을 0으로 초기화합니다.

이렇게 설명해주시면 될 것 같습니다. 추가적인 질문이 있으시면 언제든지 물어보세요! 좋은 학습 되세요~