inflearn logo
강의

講義

知識共有

設計独学's Verilogマスター Season 2 (実践コーディングテストの決定版:高難易度問題で完成させる転職フリーパス)

L2_P12_priority_data_controller 코드 리뷰 부탁드립니다.

4

xabc777x8689

投稿した質問数 5

0

안녕하세요, 강의 잘 수강 중에 있습니다.

L2_P12_priority_data_controller 코드 리뷰와 질문 몇가지만 받아주시면 감사합니다.

`timescale 1ns / 1ps
module priority_data_controller (
    // input stream
    input  logic           clk,
    input  logic           reset,
    input  logic [31:0]    stream_a,
    input  logic [31:0]    stream_b,
    input  logic [31:0]    stream_c,
    input  logic           valid_a,
    input  logic           valid_b,
    input  logic           valid_c,

    // Output stream
    output logic [31:0]    output_data,
    output logic           valid
);

    localparam P_ABC = 2'b00;
    localparam P_BCA = 2'b01;
    localparam P_CAB = 2'b10;

    logic [1:0] state, n_state;

    // 1. Combi logic & Output logic
    always_comb begin
        case(state)
            P_ABC   : begin
                if(valid_a) begin
                    output_data = stream_a;
                    valid = 1'b1;
                    n_state = P_BCA;
                end
                else if(valid_b) begin
                    output_data = stream_b;
                    valid = 1'b1;
                    n_state = P_CAB;
                end
                else if(valid_c) begin
                    output_data = stream_c;
                    valid = 1'b1;
                    n_state = P_ABC;
                end
                else begin
                    output_data = 32'b0;
                    valid = 1'b0;
                    n_state = P_ABC;
                end
            end

            P_BCA   : begin
                if(valid_b) begin
                    output_data = stream_b;
                    valid = 1'b1;
                    n_state = P_CAB;
                end
                else if(valid_c) begin
                    output_data = stream_c;
                    valid = 1'b1;
                    n_state = P_ABC;
                end
                else if(valid_a) begin
                    output_data = stream_a;
                    valid = 1'b1;
                    n_state = P_BCA;
                end
                else begin
                    output_data = 32'b0;
                    valid = 1'b0;
                    n_state = P_BCA;
                end
            end

            P_CAB   : begin
                if(valid_c) begin
                    output_data = stream_c;
                    valid = 1'b1;
                    n_state = P_ABC;
                end
                else if(valid_a) begin
                    output_data = stream_a;
                    valid = 1'b1;
                    n_state = P_BCA;
                end
                else if(valid_b) begin
                    output_data = stream_b;
                    valid = 1'b1;
                    n_state = P_CAB;
                end
                else begin
                    output_data = 32'b0;
                    valid = 1'b0;
                    n_state = P_CAB;
                end
            end

            default : begin
                output_data = 32'b0;
                valid = 1'b0;
                n_state = P_ABC;
            end
        endcase
    end

    // 2. Seq logic
    always_ff @(posedge clk or posedge reset) begin
        if(reset) begin
            state <= P_ABC;
        end
        else begin
            state <= n_state;
        end
    end

endmodule


Q1) 위처럼 FSM 방식으로 작성해도 문제없는지 궁금합니다.


Q2) 이건 좀 추상적인 질문인데, 저 같은 경우는 위처럼 간단한 로직이라도 FSM을 사용해 combinational logic/sequential logic/output logic 이 세가지로 분리해서 작성하는게 편한 것 같습니다. 그런데 실무에서 rtl을 보면 모든 ip가 FSM으로만 설계되지는 않는 것 같고, 사용된다하더라도 윗 처럼 FSM logic을 세 부분으로 분리해서 작성하지는 더더욱 않더라구요. 학부 때는 FSM으로 로직을 짜는 것이 많은 장점이 있다고 배운 것 같은데, logic의 복잡도와 무관하게 위와 같은 코딩스타일을 고집하는게 좋지 않은 습관인지 궁금합니다. 또한, logic을 설계함에 있어 FSM을 사용할지 말지에 대한 기준이 궁금합니다.

verilog-hdl fpga system-verilog rtl

回答 1

0

communityai8509

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

질문하신 FSM 구조와 RTL 코딩 스타일에 대해 참고할 만한 기존 답변을 안내드립니다.

FSM 설계 방법에 관해 질문드립니다.

FSM을 조합 논리와 순차 논리로 분리하는 이유, 그리고 하나의 always_ff 블록에 FSM 로직을 모두 작성하는 방식에 대해 다룬 질문입니다.

기존 답변에서는 다음과 같이 설명하고 있습니다.

  • 조합 논리는 현재 입력과 현재 상태에 따라 다음 상태와 출력을 결정합니다.
  • 순차 논리는 클록에 맞춰 현재 상태를 다음 상태로 갱신합니다.
  • 두 부분을 분리하면 설계와 검증이 쉬워지는 장점이 있습니다.
  • 다만 FSM 로직을 하나의 순차 블록에 합쳐서 구현하는 것도 가능하며, 반드시 잘못된 방식은 아닙니다.
  • 여러 사이클이 필요한 동작은 여러 상태로 나누거나 내부 카운터를 사용해 구현할 수 있습니다.

따라서 작성하신 것처럼 always_comb에서 n_state와 출력을 계산하고, always_ff에서 state를 갱신하는 2-process FSM 구조는 일반적으로 사용되는 정상적인 방식입니다. 현재 코드에서는 output_data가 일부 분기에서만 할당되므로, 의도하지 않은 래치 방지를 위해 always_comb 시작 부분에서 기본값을 지정하는 코딩 스타일도 함께 참고하시면 좋습니다.

n_state 구성에 대한 질문

always @(*)로 작성한 n_state가 조합 논리인지, reg와 wire를 어떻게 구분하는지에 대한 질문입니다.

작성하신 코드의 n_state처럼 현재 state와 입력 valid 신호를 기반으로 다음 상태를 계산하는 로직은 조합 논리입니다. 따라서 일반적으로 다음과 같이 구분합니다.

  • 현재 상태를 저장하는 state: 순차 논리, 플립플롭으로 구현
  • 다음 상태를 계산하는 n_state: 조합 논리
  • 출력 데이터를 결정하는 output_data: 조합 논리 또는 설계 요구사항에 따라 순차 논리
  • 상태 갱신: always_ff @(posedge clk ...)

또한 FSM 사용 여부는 로직의 복잡도보다는 시간에 따른 동작 단계와 상태가 존재하는지를 기준으로 판단하는 것이 좋습니다. 예를 들어 대기, 요청 수락, 처리 중, 완료, 오류 상태처럼 동작 단계가 클록에 따라 바뀐다면 FSM이 적합합니다. 반대로 단순한 우선순위 선택기처럼 현재 입력만으로 출력이 결정되고 과거 동작을 기억할 필요가 없다면 조합 논리만으로 구현할 수도 있습니다.

베릴로그 코딩 스타일

동일한 기능을 여러 방식으로 작성했을 때 어떤 방식이 더 좋은지에 대한 질문입니다. 기존 답변에서는 정답이 하나로 정해져 있다기보다 회사나 프로젝트의 코딩 가이드에 따라 달라질 수 있다고 설명합니다. 따라서 FSM을 항상 동일한 세 블록으로 작성해야 한다기보다는, 팀의 RTL 스타일과 검증 편의성, 가독성, 합성 결과를 기준으로 일관된 방식을 선택하는 것이 중요합니다.

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

메모리 리셋 관련 질문 드립니다.

0

8

1

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

0

10

1

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

1

34

2

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

1

34

2

카페 등업신청

0

43

1

fpga

1

61

2

test class의 constructor 부분을 보다가 궁금한 점이 있어 질문드립니다.

0

38

1

FPGA 연결 확인 방법

0

48

1

Arty z7 -20 보드의 경우

1

58

2

RVALID/RREADY 핸드셰이크 발생 시 RDATA 전이가 발생해도 문제가 없는 이유?

1

85

4

강의노트는 어디서 받을 수 있나요?

0

70

2

lwip 실험중 오류 상황

0

67

2

uvm config db에 대해 궁금한 점이 있습니다.

0

66

1

이 강의 zboz7보드에서도 실행 가능한가요?

1

71

1

강의자료 기한 연장 + 로드맵 문의

0

66

2

Chapter 16 FSM 관련 질문

1

86

2

강의 환경(linux) 관련 질문

1

103

2

강의자료 업로드 될까요

0

67

2

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

1

81

2

L2_P08 SRAM 코드 리뷰 부탁드립니다.

1

83

2

Arty Z10 관련 문의

1

80

2

L2_P4 data_average 코드 리뷰 및 waveform 질문 드립니다.

1

102

2

LV2-2 Patter Detector code review 부탁드립니다.

1

73

1

환경 설정하는 guide 최신화 부탁드립니다.

1

118

2