작성
·
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
파형은 문제없이 나온것 같은데, 이런 방식으로 중첩 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 문에 따른 합성 결과 차이:
카운터 크기의 최적화:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.