시계만들기 아키텍처-1 의 코딩 방식에 관한 질문
66
작성한 질문수 7
안녕하세요 🙂
[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

파형은 문제없이 나온것 같은데, 이런 방식으로 중첩 if 문을 사용하면 기존 Matbi_Watch_1 구조와 다르게 합성되어 타이밍에서 문제가 되는지 궁금합니다.
경계값(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 코드를 사용하여 시계 기능을 구현하시는 과정에서의 질문에 대해 답변드리겠습니다.
질문 요약 및 답변
중첩 if 문에 따른 합성 결과 차이:
- 중첩된 if 문을 사용하는 것 자체가 합성 결과에 큰 영향을 미치지는 않습니다. 다만, 코딩 스타일에 따라 신호의 경로 및 회로의 깊이가 달라질 수 있으며, 복잡한 조건문을 관리하는 데 신중을 기해야 합니다. 일반적으로는 코드의 가독성과 유지보수성을 고려하여 중첩 깊이를 얕게 유지하는 것이 좋습니다.
- 중첩된 if 문을 사용하는 것 자체가 합성 결과에 큰 영향을 미치지는 않습니다. 다만, 코딩 스타일에 따라 신호의 경로 및 회로의 깊이가 달라질 수 있으며, 복잡한 조건문을 관리하는 데 신중을 기해야 합니다. 일반적으로는 코드의 가독성과 유지보수성을 고려하여 중첩 깊이를 얕게 유지하는 것이 좋습니다.
카운터 크기의 최적화:
- 각 카운터가 특정 범위까지 도달할 때만 증가하도록 조건을 설정하여 카운터의 크기를 최소화할 수 있습니다. 분/시/일/월 등의 단위로 조건을 설정하는 것은 상당히 유효한 방법입니다. 이렇게 하면 필요 이상으로 큰 비트를 사용하는 것을 방지하고, 자원 사용을 최적화할 수 있습니다. 다만, 모든 경우설에서 정확한 overflow/underflow 처리에 유의해야 합니다. 예를 들어, 설정된 값에 도달할 때마다 다음 단위 카운터가 올바르게 증가하는지를 확실히 검증해야 합니다.
- 각 카운터가 특정 범위까지 도달할 때만 증가하도록 조건을 설정하여 카운터의 크기를 최소화할 수 있습니다. 분/시/일/월 등의 단위로 조건을 설정하는 것은 상당히 유효한 방법입니다. 이렇게 하면 필요 이상으로 큰 비트를 사용하는 것을 방지하고, 자원 사용을 최적화할 수 있습니다. 다만, 모든 경우설에서 정확한 overflow/underflow 처리에 유의해야 합니다. 예를 들어, 설정된 값에 도달할 때마다 다음 단위 카운터가 올바르게 증가하는지를 확실히 검증해야 합니다.
추가 설명
- Verilog HDL에서는 반복 구조를 최적화하는 것이 중요합니다. 이러한 최적화는 FPGA 또는 ASIC 설계에서 하드웨어 자원의 효율적인 배분에 영향을 줄 수 있습니다.
- 각 단위(초, 분, 시)에서 넘치는 경우(Overflow)가 발생했을 때 다음 단위가 증가하는 로직을 정확히 구현하는 것이 핵심입니다. 이를 효과적으로 구현하는 방법 중 하나는 위에서 언급하신 것처럼 조건문과 tick 신호를 적절히 사용하는 방법입니다.
관련 질문 링크
- 해당 강좌에서 다루어진 중첩 if문 사용과 카운터 최적화에 대한 답변들이 있습니다. 비슷한 질문이 있었던 링크를 참고하시면 초기에 오버헤드를 해결하는 방법에 대한 견해를 얻으실 수 있을 것입니다.
- 이곳에서는 Verilog HDL에서의 카운터 사용 및 최적화에 대한 질문이 다루어졌습니다. 관련 내용을 읽어보시면 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
latency 개념 구현
1
87
3
비바도 all os버전
1
72
2
초기화를 reset_n 이 '1'일 때가 아닌 '0' 일 때 실행시키는 이유 질문
1
71
2
다운로드용량
1
71
2
비바도리눅스설치
1
80
2
전체path복사넣기
1
63
2
Vivado 2025.2 리눅스 설치 후 실행 에러와 솔루션 (libxv_commontasks.so)
1
149
2
explorer.exe오류
1
106
3
mobaxterm설치오류
1
90
2
./build시, waveform 'divide color' 사용
1
57
2
Latch와 관련하여 (Time borrowing, Latch-based design)
1
130
2
clean 명령어가 안되는데, 따로 저장해줘야 하는지 궁금합니다.
0
63
1
안녕하세요 설치 관련 질문 드립니다.
1
64
3
16장 mealy 설계.
1
74
2
14장 Cycle 관련, Testbench 코드.
1
64
2
21강(16장) 초기값 설정이 적용되는 시점 질문
1
60
1
20강(15장) - 밀리 머신 관련하여 질문 드립니다.
1
68
2
build에러 질문
0
57
2
1장 ./build에서 에러가 나요
1
73
2
FPGA 강의 보드 문의 드립니다.
1
107
2
5장 DFF특성에 대한 질문
1
77
3
vivado linux 사용 이유.
1
137
2
메모리의 형태가 전체설계에 미치는 영향이 궁금합니다.
1
104
2
디스코드 멤버쉽 등업 관련 문제
1
92
2





