민감도 목록
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 48번째.
감도 목록(sensitivity list)은 always 블록이 언제 실행될지를 알려줍니다. 이는 @ 기호 뒤의 괄호 안에 작성됩니다.
감도 목록(sensitivity list)은 always 블록을 트리거하는 신호 또는 이벤트의 집합입니다. 목록의 신호 중 하나라도 변경되면 블록이 실행됩니다.
구문:
always @(sensitivity_list) begin
// 목록의 신호가 변경될 때 코드가 실행됩니다
end감도 목록(Sensitivity List)의 유형
| 유형 | 구문 | 블록 실행 시점 |
|---|---|---|
| 모든 신호 (조합 논리) | always @(*) | 내부의 어떤 신호라도 변경될 때 |
| 특정 신호 | always @(a or b) | a 또는 b가 변경될 때 |
| 에지 트리거 (순차 논리) | always @(posedge clk) | 클록의 상승 에지에서 |
| 다중 에지 | always @(posedge clk or posedge reset) | 클록 에지 또는 리셋 에지에서 |
옵션 1: 모든 신호 (*)
조합 논리(combinational logic)에 가장 안전하고 일반적인 방법입니다.
always @(*) begin
out = a & b; // a 또는 b가 변경될 때 실행됨
end*는 블록 내에서 읽히는 모든 신호를 자동으로 포함합니다.
옵션 2: 특정 신호
always @(a or b) begin
out = a & b; // a 또는 b가 변경될 때 실행됨
end신호를 누락하면 래치(의도하지 않은 메모리)가 생성됩니다.
옵션 3: 에지 트리거 (posedge)
always @(posedge clk) begin
q <= d; // 클락의 상승 에지에서 실행됨
end상승 에지에는 posedge를, 하강 에지에는 negedge를 사용합니다.
옵션 4: 다중 엣지(Multiple Edges)
always @(posedge clk or posedge reset) begin
if (reset)
q <= 0;
else
q <= d;
end클록 엣지(clock edge) 또는 리셋 엣지(reset edge)에서 실행됩니다.
흔히 발생하는 실수들
| 실수 | 잘못된 이유 |
|---|---|
always @(a or b or c)를 사용하면서 d를 사용하는 경우 | d 누락 → 래치(latch) 발생 |
always @(posedge clk or reset) | reset에 대한 posedge 누락 |
always @(clk) | 플립플롭(flip-flops)에는 posedge clk를 사용해야 함 |
챌린지
수행할 작업:
- 이 플립플롭이 작동하도록 올바른 감지 목록(sensitivity list)을 추가하세요. 블록은
clk의 상승 엣지(rising edge)에서 실행되어야 합니다.
치트 시트
감도 목록(sensitivity list)은 @ 뒤에 오며 always 블록이 언제 실행되는지를 정의합니다:
always @(sensitivity_list) begin
// 나열된 신호가 변경될 때 실행됨
end| 유형 | 구문 | 트리거 조건 |
|---|---|---|
| 모든 신호 | always @(*) | 읽기 신호 중 하나라도 변경될 때 |
| 특정 신호 | always @(a or b) | a 또는 b가 변경될 때 |
| 상승 에지 | always @(posedge clk) | clk의 상승 에지 |
| 다중 에지 | always @(posedge clk or posedge reset) | 두 에지 중 하나가 발생할 때 |
조합 논리(combinational logic)에는 @(*)를 사용하고, 순차 논리(sequential logic)에는 posedge/negedge를 사용하세요:
// 조합 논리
always @(*) begin
out = a & b;
end
// 순차 논리 (비동기 리셋이 있는 플립플롭)
always @(posedge clk or posedge reset) begin
if (reset) q <= 0;
else q <= d;
end흔한 실수: 특정 목록에서 신호를 누락하면 래치(latch)가 발생합니다. 플립플롭에 대해 always @(posedge clk) 대신 always @(clk)라고 작성하거나, 다중 에지 목록에서 reset 앞에 posedge를 생략하는 경우가 있습니다.
직접 해보기
module flipflop (
input clk,
input d,
output reg q
);
always @(______) begin
q <= d;
end
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.