본문 바로가기

아래 코드를 기본으로 해서 머든 출발해보자. 기본을 지키는게 중요하다!

복합 조건에서의 ifcase 혼용 예제 (SystemVerilog 사용, always_ff 블록 내에서)

복합 조건이 3가지 이상일 경우, ifcase 문을 혼용하여 가독성을 높이고, 효율적으로 코드를 작성할 수 있습니다. 아래는 always_ff 블록을 사용하여 복합 조건을 처리하는 예제입니다. 이 예제에서는 상태 전이와 출력 로직을 하나의 always_ff 블록에 통합하여 구성합니다.

예제: 상태 기계 (State Machine) 구현

이 예제는 상태 기계를 구현하면서 입력 신호에 따라 다른 동작을 수행하는 복잡한 조건을 처리합니다. if 문과 case 문을 혼용하여 각 상태에서의 동작을 명확하게 정의합니다.

module state_machine_example (
    input logic clk,
    input logic reset_n,
    input logic [1:0] mode,
    input logic start,
    input logic [3:0] data,
    output logic done,
    output logic [3:0] result
);

typedef enum logic [1:0] {
    IDLE = 2'b00,
    PROCESS = 2'b01,
    WAIT = 2'b10,
    FINISH = 2'b11
} state_t;

state_t current_state, next_state;

// 상태 전이 및 출력 로직 (State Transition and Output Logic)
always_ff @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        current_state <= IDLE;
        done <= 0;
        result <= 4'b0000;
    end else begin
        current_state <= next_state;
        case (current_state)
            IDLE: begin
                if (start) begin
                    next_state <= PROCESS;
                end else begin
                    next_state <= IDLE;
                end
            end

            PROCESS: begin
                case (mode)
                    2'b00: result <= data + 4;
                    2'b01: result <= data - 4;
                    2'b10: result <= data & 4'b1010;
                    2'b11: result <= data | 4'b0101;
                    default: result <= 4'bxxxx;
                endcase
                next_state <= WAIT;
            end

            WAIT: begin
                if (data == 4'b0000) begin
                    next_state <= FINISH;
                end else if (data == 4'b1111) begin
                    next_state <= IDLE;
                end else begin
                    next_state <= PROCESS;
                end
            end

            FINISH: begin
                done <= 1;
                next_state <= IDLE;
            end

            default: next_state <= IDLE;
        endcase
    end
end

endmodule

설명

  1. 상태 전이 및 출력 로직 (State Transition and Output Logic)
    • always_ff 블록 내에서 현재 상태와 출력을 결정합니다.
    • 리셋 신호가 활성화되면, 상태는 IDLE로 초기화되고, 출력 값은 기본 값으로 설정됩니다.
    • 이 부분은 순차 논리로, 매 클럭 상승 에지에서 상태와 출력을 업데이트합니다.
  2. 혼용된 ifcase
    • IDLE 상태에서는 if 문을 사용하여 start 신호를 체크하고, 시작 신호가 있으면 PROCESS 상태로 전이합니다.
    • PROCESS 상태에서는 case 문을 사용하여 mode 값에 따라 다른 동작을 수행합니다. 이때, 각각의 mode에 따라 result 값을 설정합니다.
    • WAIT 상태에서는 if, else if, else 문을 사용하여 data 값에 따라 상태 전이를 결정합니다. 이는 범위 검사가 필요한 경우에 유용합니다.
    • FINISH 상태에서는 done 신호를 설정하고, 다시 IDLE 상태로 전이합니다.

요약

  • 복잡한 조건 처리: 복합 조건이 있는 경우 ifcase 문을 혼용하여 가독성을 높이고 코드의 효율성을 유지합니다.
  • 상태 기계 구현: 상태 전이와 출력 로직을 하나의 always_ff 블록 내에서 처리하여, 코드의 명확성과 유지보수성을 향상시킵니다.
  • 가독성 향상: 각 조건문을 명확히 작성하여 유지보수성을 높입니다.

이 예제를 통해 ifcase 문을 혼용하여 복잡한 조건을 효율적으로 처리하는 방법을 이해할 수 있습니다.

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.