inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

[L1-P15] 우선순위 인코더 (Priority Encoder) : 수많은 입력 중 가장 중요한 신호 먼저 처리하기

RTL_ROM이 무엇인지 알고 싶습니다.

2

김상현

작성한 질문수 66

0

에타님, 안녕하세요. 강의 잘 보고 있습니다.

[1. 질문 챕터] : L1-P15 Priority encoder

[2. 질문 내용] : RTL_ROM으로 합성되었다는 것이 어떤 의미인가요?

AI 답변을 봤을 때는 LUT 형식으로 합성된 것으로 이해했습니다.

이 엔코더 예제로 예를 들면 아래와 같습니다.

Address 0000, 0001 , Data 00

Address 0010, 0011, Data 01

Address 0100, ..., 0111, Data10

Address 1000, ..., 1111, Data 11

만약 그렇다고 하면 게이트로 합성되는 것보다 RTL_ROM으로 합성되는게 더 유리한건가요?

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

 일단 저는 Priority encoder를 아래처럼 구현했습니다.

`timescale 1ns / 1ps
module priority_encoder(
    input [3:0] in,
    output reg [1:0] out,
    output reg valid
);

//TODO
    always @(*) begin
        valid = (in == 4'b0000) ? 1'b0:1'b1;
        if (in[3])          out = 2'b11;
        else if (in[2])     out = 2'b10;
        else if (in[1])     out = 2'b01;
        else                out = 2'b00;
    end
endmodule

그 후 schematic을 보는데 valid가 RTL_ROM으로 합성되어 있어요.

image.png


모범 답안 schematic이 궁금해서 봤는데 모범 답안 schematic은 두 로직 전부 RTL_ROM으로 합성되어 있습니다.

image.png

ROM으로 합성되는게 유리하다고 판단한 이유는 게이트로 합성되면 발열(전력 소모)과 전송 지연 시간 등이 있기 때문입니다.


추가로 가끔 제가 구현한 예제가 시뮬레이션 실행에도 문제가 없고 결과도 PASS로 뜨는데 schematic을 실행했을 때 에러가 발생하는 경우가 있습니다.

이 경우 실제 합성 불가능해서 schematic 실행 시 에러가 발생하는 것인가요?

L1-P13 Parallel processor 내용입니다.

`timescale 1ns / 1ps
module clock_divider #(
    parameter INPUT_FREQ = 100_000_000,  // 입력 주파수 (Hz)
    parameter OUTPUT_FREQ = 25_000_000   // 출력 주파수 (Hz)
)(
    input wire clk_in,                   // 입력 클럭
    input wire rst_n,                    // 비동기 리셋 (액티브 로우)
    output reg clk_out                   // 출력 클럭
);

    // 분주 비율 계산
    localparam DIVIDE_RATIO = INPUT_FREQ / OUTPUT_FREQ;
    localparam COUNTER_WIDTH = $clog2(DIVIDE_RATIO);

    // 카운터 레지스터
    reg [COUNTER_WIDTH-1:0] counter;

    //TODO
    always @(posedge clk_in or negedge rst_n) begin
        if (!rst_n) begin
            clk_out <= 1'b0;
        end else if (counter < (DIVIDE_RATIO / 2)) begin
            clk_out <= 1'b1;
        end else begin
            clk_out <= 1'b0;
        end
    end

    always @(posedge clk_in or negedge rst_n) begin
        if (!rst_n) begin
            counter <= 1'b0;
        end else begin
            counter <= counter + 'b1;
        end
    end


endmodule
image.png

어디가 문제인지 찾지는 못했습니다.

verilog-hdl system-verilog

답변 1

0

인프런 AI 인턴

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

질문하신 RTL_ROM, LUT 합성 및 RTL schematic의 합성 결과 차이와 직접적으로 관련된 기존 답변은 아래 게시글을 참고하시면 좋습니다.

Counter 설계 관련 질문3

해당 답변에서는 Verilog 코드를 작성하는 추상화 수준과 합성 도구의 최적화 결과에 대해 설명하고 있습니다. RTL schematic에 표시되는 RTL_ROM, RTL_MUX 등의 블록은 최종 FPGA 내부 회로가 그대로 ROM이나 MUX로 고정되었다는 뜻이라기보다, 합성 도구가 현재의 조합 논리를 표현한 RTL 수준의 추상화 결과로 이해하는 것이 좋습니다.

질문하신 priority encoder의 경우 입력값에 따라 출력이 결정되는 조합 논리이므로, 합성 도구가 이를 진리표 형태의 ROM으로 표현할 수 있습니다.

  • valid는 in == 0인지 검사하는 4입력 조합 논리입니다.
  • out은 입력값에 따라 00, 01, 10, 11 중 하나를 출력합니다.
  • 따라서 도구 입장에서는 이를 if-else 게이트 구조로 표현할 수도 있고, ROM 또는 LUT 형태의 조합 논리로 표현할 수도 있습니다.

RTL_ROM으로 표시되었다고 해서 일반적인 메모리 블록이나 FPGA의 Block RAM을 사용했다는 의미는 아닙니다. 실제 FPGA 구현에서는 LUT 자원이나 조합 논리 자원으로 매핑될 수 있으며, 게이트 방식보다 항상 전력이나 지연 면에서 유리하다고 단정할 수 없습니다. 최종 결과는 FPGA 종류, 합성 옵션, 팬아웃, 배치배선 결과 등에 따라 달라지므로 합성 리포트와 구현 후 타이밍·자원·전력 분석으로 확인해야 합니다.

또한 아래 게시글도 RTL 분석 화면에서 MUX가 나타나는 이유와, 작성한 Verilog 코드가 합성 도구에 의해 하드웨어 구조로 변환되는 과정을 이해하는 데 도움이 됩니다.

Counter 설계 관련 질문2

이 게시글에서는 if-else 문이 MUX로 합성되는 과정과, 출력 포트 및 레지스터 선언이 실제 회로 구조와 어떤 관계를 갖는지 설명하고 있습니다. 질문하신 것처럼 RTL schematic은 작성한 코드와 최종 게이트 회로 사이의 중간 표현이므로, 코드에 직접 작성하지 않은 MUX나 ROM이 표시될 수 있습니다.

참고 이미지:

마지막으로, 시뮬레이션이 PASS라고 해서 반드시 합성까지 가능한 것은 아닙니다. 시뮬레이션은 주어진 테스트벤치에서 동작 결과를 검증하는 과정이고, 합성은 해당 코드를 실제 하드웨어 자원으로 변환하는 과정이기 때문입니다. 따라서 시뮬레이션은 정상이어도 다음과 같은 이유로 schematic 또는 합성 단계에서 오류가 발생할 수 있습니다.

  • 합성 도구가 지원하지 않는 문법 사용
  • 선언되지 않은 신호 또는 포트 연결 오류
  • 조합 논리에서의 불완전한 할당
  • 합성 불가능한 시스템 태스크나 테스트벤치 코드 포함
  • 최상위 모듈 설정 및 파일 인식 문제
  • 파라미터, 배열, 메모리 문법에 대한 도구 지원 문제

따라서 오류가 발생하면 시뮬레이션 결과만 확인하기보다, 합성 로그의 첫 번째 실제 에러 메시지와 합성 리포트를 함께 확인하는 것이 좋습니다.

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

인터럽트 컨트롤러 요청 처리와 처리 완료 구문 중 이해가 안되는 내용이 있습니다.

1

27

2

enable_latch가 F/F이 아니라 래치인 이유가 궁금합니다.

1

33

2

output.txt가 이상하게 나옵니다.

1

81

2

season 2 코딩테스트 강의에 대한 문의드립니다.

1

73

1

4:1먹스 구현방식에 대한 질문입니다.

1

69

2

Windows 기능 켜기

1

89

2

[L1-P02] 멀티플렉서 실전 결과 확인하는데 시간이 너무 걸립니다.

0

77

2

환경설정 문

2

121

2

환불 문의

1

163

2

[LV1_P4_REGISTER ] Non-Blocking

1

106

2

조건문에서 if 연속 사용

1

130

2

vivado 설치

2

154

1

LV1-21 Edge Detector 구현 방법 질문

1

137

1

학교에서 사용하는 툴

1

141

2

[L1-P16 clog2 with memory] clog2 function 질문

1

169

4

fsm 설계 방식에 대한 질문

1

131

2

Level0_P12_verification_testbench

1

126

2

mobaxterm 완전 삭제법

1

411

2

155ns 타이밍 이슈에 관한 궁금증(?)

1

135

2

build 오류

1

175

2

VIVADO 환경

1

151

2

코딩테스트

1

123

2

vscode 환경세팅 방법

2

278

2

L1-P12 인터럽트 제어 질문

2

137

2