Inflearn brand logo image

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

apex737님의 프로필 이미지
apex737

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

[Verilog HDL/FPGA 외전1 - 시계만들기] Chapter 2. 시,분,초 만들기 - Part1

시계만들기 아키텍처-1 의 코딩 방식에 관한 질문

작성

·

25

·

수정됨

1

안녕하세요 🙂

[1. 질문 챕터] : Verilog HDL/FPGA 외전1 - Chapter2

[2. 질문 내용] : 아키텍처-1 의 코딩 방식에 관한 질문

[3. 시도했던 내용, 그렇게 생각하는 이유] :

module clock_arch1 (
  input clk, rst, en,
  output reg [5:0] sec_cnt, // clog2(60)
  output reg [5:0] min_cnt, // clog2(60)
  output reg [4:0] hour_cnt // clog2(24)
);

wire w_sec_tick;
gen_sec u_gen_sec (
  clk, rst, en, w_sec_tick
);

wire sec_th = sec_cnt == 60-1;
wire min_th = min_cnt == 60-1;
wire hour_th = hour_cnt == 24-1;

always@(posedge clk) begin
  if(rst) begin
    sec_cnt <= 0;
    min_cnt <= 0;
    hour_cnt <= 0;
  end
  else if (w_sec_tick) begin
    if(sec_th) begin
      sec_cnt <= 0;
      if(min_th) begin
          min_cnt <= 0;
          hour_cnt <= hour_th ? 0 : hour_cnt + 1;
      end else begin
          min_cnt <= min_cnt + 1;
      end 
    end else begin
        sec_cnt <= sec_cnt + 1;
    end
  end
end
  
endmodule
image.png
  1. 파형은 문제없이 나온것 같은데, 이런 방식으로 중첩 if 문을 사용하면 기존 Matbi_Watch_1 구조와 다르게 합성되어 타이밍에서 문제가 되는지 궁금합니다.

  2. 경계값(th)를 초 단위가 아닌 분/시/일/월 단위로하게되면 if 중첩은 깊어지겠지만 tick_cnt를 60/24/30/12으로 줄 수 있어서 큰 카운터가 필요하지 않을 것 같은데, 이 부분은 어떻게 생각하시는지 궁금합니다.

답변 2

0

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요 🙂

A1. 합성기로 직접 돌려보고 test 를 추천드립니다. 똑똑한 합성기라면 if 중첩문을 단순화 시킬 수 있습니다. (카르노맵 과 같은 원리로) 환경은 드렸으니 test 해보시면 정확한 답을 얻으실 수 있을 것 같아요.

A2. A1 의 답을 참고하셔서, Tool 로써 코드 결과를 비교하시는 것이 가장 best 이다 생각이 듭니다.

알고계신대로, 제 생각에도 조건의 중첩의 이슈가 있을 것 같아요. 그로인한 critical path 가 발생할 수 있겠죠. 하지만, area 는 작게 나오지 않을까..? 하는 기대감도 있습니다.

실제 현업에서도 tool 을 돌리고 PPA 를 봅니다.

즐공하세요 🙂

 

0

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

Verilog HDL 코드를 사용하여 시계 기능을 구현하시는 과정에서의 질문에 대해 답변드리겠습니다.

질문 요약 및 답변

  1. 중첩 if 문에 따른 합성 결과 차이:

    • 중첩된 if 문을 사용하는 것 자체가 합성 결과에 큰 영향을 미치지는 않습니다. 다만, 코딩 스타일에 따라 신호의 경로 및 회로의 깊이가 달라질 수 있으며, 복잡한 조건문을 관리하는 데 신중을 기해야 합니다. 일반적으로는 코드의 가독성과 유지보수성을 고려하여 중첩 깊이를 얕게 유지하는 것이 좋습니다.
  2. 카운터 크기의 최적화:

    • 각 카운터가 특정 범위까지 도달할 때만 증가하도록 조건을 설정하여 카운터의 크기를 최소화할 수 있습니다. 분/시/일/월 등의 단위로 조건을 설정하는 것은 상당히 유효한 방법입니다. 이렇게 하면 필요 이상으로 큰 비트를 사용하는 것을 방지하고, 자원 사용을 최적화할 수 있습니다. 다만, 모든 경우설에서 정확한 overflow/underflow 처리에 유의해야 합니다. 예를 들어, 설정된 값에 도달할 때마다 다음 단위 카운터가 올바르게 증가하는지를 확실히 검증해야 합니다.

추가 설명

  • Verilog HDL에서는 반복 구조를 최적화하는 것이 중요합니다. 이러한 최적화는 FPGA 또는 ASIC 설계에서 하드웨어 자원의 효율적인 배분에 영향을 줄 수 있습니다.
  • 각 단위(초, 분, 시)에서 넘치는 경우(Overflow)가 발생했을 때 다음 단위가 증가하는 로직을 정확히 구현하는 것이 핵심입니다. 이를 효과적으로 구현하는 방법 중 하나는 위에서 언급하신 것처럼 조건문과 tick 신호를 적절히 사용하는 방법입니다.

관련 질문 링크

  • 해당 강좌에서 다루어진 중첩 if문 사용과 카운터 최적화에 대한 답변들이 있습니다. 비슷한 질문이 있었던 링크를 참고하시면 초기에 오버헤드를 해결하는 방법에 대한 견해를 얻으실 수 있을 것입니다.
  • 이곳에서는 Verilog HDL에서의 카운터 사용 및 최적화에 대한 질문이 다루어졌습니다. 관련 내용을 읽어보시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

apex737님의 프로필 이미지
apex737

작성한 질문수

질문하기