아래 코드를 기본으로 해서 머든 출발해보자. 기본을 지키는게 중요하다!
복합 조건에서의 if와 case 혼용 예제 (SystemVerilog 사용, always_ff 블록 내에서)
복합 조건이 3가지 이상일 경우, if와 case 문을 혼용하여 가독성을 높이고, 효율적으로 코드를 작성할 수 있습니다. 아래는 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
설명
- 상태 전이 및 출력 로직 (State Transition and Output Logic)
always_ff블록 내에서 현재 상태와 출력을 결정합니다.- 리셋 신호가 활성화되면, 상태는
IDLE로 초기화되고, 출력 값은 기본 값으로 설정됩니다. - 이 부분은 순차 논리로, 매 클럭 상승 에지에서 상태와 출력을 업데이트합니다.
- 혼용된
if와case문IDLE상태에서는if문을 사용하여start신호를 체크하고, 시작 신호가 있으면PROCESS상태로 전이합니다.PROCESS상태에서는case문을 사용하여mode값에 따라 다른 동작을 수행합니다. 이때, 각각의mode에 따라result값을 설정합니다.WAIT상태에서는if,else if,else문을 사용하여data값에 따라 상태 전이를 결정합니다. 이는 범위 검사가 필요한 경우에 유용합니다.FINISH상태에서는done신호를 설정하고, 다시IDLE상태로 전이합니다.
요약
- 복잡한 조건 처리: 복합 조건이 있는 경우
if와case문을 혼용하여 가독성을 높이고 코드의 효율성을 유지합니다. - 상태 기계 구현: 상태 전이와 출력 로직을 하나의
always_ff블록 내에서 처리하여, 코드의 명확성과 유지보수성을 향상시킵니다. - 가독성 향상: 각 조건문을 명확히 작성하여 유지보수성을 높입니다.
이 예제를 통해 if와 case 문을 혼용하여 복잡한 조건을 효율적으로 처리하는 방법을 이해할 수 있습니다.
'IT > ASIC | FPGA' 카테고리의 다른 글
| Verdi 옵션 - kdb,fsdb 물고 실행 (0) | 2024.07.01 |
|---|---|
| tcl 멀티라인 지원 - 작성 내용이 너무 길어서 엔터치고 싶다! (0) | 2024.06.19 |
| SDC clock group 이해: asynchronous vs exclusive 차이점 (0) | 2024.05.30 |
| UVM Configuration Database (uvm_config_db) 사용 예제 (0) | 2024.05.29 |
| UVM Error 메시지 출력 - report_phase() in uvm_test (0) | 2024.05.29 |