아래 코드를 기본으로 해서 머든 출발해보자. 기본을 지키는게 중요하다!
복합 조건에서의 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 |