25 / 63 · 실습
실습: MUX의 전수 검사와 레지스터 출력 분석
같은 입력을 조합 경로와 레지스터 경로에 적용하고, 진리표와 샘플링 시점으로 결과를 검증합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
실험 대상과 관찰 조건
sel이 0이면 a, 1이면 b가 y로 나옵니다. sampled_y는 클록 상승 에지상승 에지 클록이 0에서 1로 바뀌는 순간입니다. CLK=1인 구간 전체를 뜻하는 레벨과 구별합니다. 자세히 보기의 y를 저장합니다. 입력이 바뀌어도 다음 상승 에지까지 sampled_y는 유지됩니다.
시작하기 전에
Digital Design Studio의 Desktop 프로젝트를 준비하고, 시뮬레이션 실행 권한이 있는지 확인하세요. 각 예제는 별도 폴더의 rtl/top.sv로 저장합니다.
먼저 a와 b가 다른 조합을 만드세요. sel=0이면 a, sel=1이면 b가 출력되는지 확인한 뒤 입력 파일의 각 행과 대조하세요.
y = sel ? b : a
SystemVerilog 소스
module top (
input logic clk,
input logic a,
input logic b,
input logic sel,
output logic y,
output logic sampled_y
);
assign y = sel ? b : a;
// Explicit observation register: y remains purely combinational.
// The register makes this design eligible for logic-netlist-1 simulation.
always_ff @(posedge clk) sampled_y <= y;
endmodule실행 방법
New analysis에서 Two-state single-clock v1을 선택하세요. Clock port는 clk, 주기는 1000ps입니다. 아래 값으로 설정해 Preflight를 수행한 뒤 Run RTL simulation을 실행하고 결과를 비교하세요.
| 설정 | 값 |
|---|---|
| 초기 레지스터 값 (LSB부터) | [false] |
| Reset port | 비움 |
| Maximum cycles / time | 8 / 8000ps |
각 열은 아래 입력 파일의 한 항목에 해당합니다. 조합 출력 y의 예상값은 0,0,0,1,1,0,1,1입니다. 이 그림은 입력을 순서대로 넣었을 때의 조합 출력만 보여 주며, sampled_y가 갱신되는 시각은 포함하지 않습니다.
파형 데이터 보기
| 신호 | 파형 | 버스 값 |
|---|---|---|
| a | 0...1... | |
| b | 0.1.0.1. | |
| sel | 01010101 | |
| y expected | 0..1.01. |
입력 자극
[
{
"inputs": {
"a": [
false
],
"b": [
false
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
false
],
"b": [
false
],
"sel": [
true
]
}
},
{
"inputs": {
"a": [
false
],
"b": [
true
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
false
],
"b": [
true
],
"sel": [
true
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
false
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
false
],
"sel": [
true
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
true
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
true
],
"sel": [
true
]
}
}
]결과 비교
8 cycles · y=1 · sampled_y=1. 3000ps에서는 y=1이고 sampled_y=0인지 비교하세요.
이 실습은 0/1 단일 클록 RTL을 사용합니다. #delay·initial·X/Z 테스트벤치는 포함하지 않습니다. 학습 완료 표시는 학습 기록이며 실제 시뮬레이션 결과를 뜻하지 않습니다.
먼저 예상 결과를 작성합니다
시뮬레이터를 실행하기 전에 위 입력 순서의 조합 출력 를 직접 계산하세요. 예상 비트열은 입니다. 이는 입력 조합 8개를 모두 검사한 결과이므로, 마지막 출력 하나만 맞는지 확인할 때보다 회로의 동작을 더 확실히 검증할 수 있습니다.
레지스터레지스터 여러 비트의 상태를 저장하는 회로입니다. 이 과정의 동기식 레지스터는 클록 에지에서 정해진 입력을 저장합니다. 자세히 보기 출력은 입력 자극이 바뀌는 순간이 아니라 상승 에지에서 갱신됩니다. 에지 직전의 조합 출력과 에지 직후의 레지스터 출력을 구분해 기록하세요.
여기서 번째 에지에서 샘플링한 입력으로 에지 이후 상태 을 정의했습니다. 신호 이름 sampled_y는 이 상태에 해당합니다. 같은 시간 좌표에 표시되더라도 입력 적용과 레지스터 갱신의 이벤트 순서를 확인해야 합니다.
세 가지 검사로 오류 원인을 구분합니다
- 선택 반전:
sel ? a : b로 바꾸면 어떤 입력 벡터에서 처음 예상과 다른 출력이 나오는지 먼저 예측합니다. 인 벡터는 이 오류를 발견하지 못합니다. - 관찰 시점 혼동:
y대신sampled_y를 조합 출력의 예상값과 즉시 비교하면 정상 회로도 오류가 있는 것처럼 보이는 이유를 설명합니다. - 출력 유지 검사: 선택되지 않은 입력만 바꾸고 가 유지되는지 확인합니다. 선택된 입력의 변화에는 가 따라가야 합니다.
오류 보고서에는 입력, 관찰 시점, 기대값, 실제값을 한 줄씩 남기세요. 단순히 ‘파형이 이상하다’는 기록으로는 선택 논리 오류와 한 사이클 지연을 구분할 수 없습니다.
확장 과제
데이터 폭을 4비트로 넓히면 가능한 조합 입력은 개입니다. 전수 검사가 여전히 가능하지만 먼저 0, 최댓값, 0101, 1010과 walking-one 패턴을 사용해 비트 위치 오류를 빠르게 드러내세요. 폭을 바꾼 회로의 설정과 입력 파일도 함께 갱신해야 합니다.
직접 생각해 보기
인 값을 상승 에지에서 저장한 뒤, 다음 에지 전에 만 1로 바꿨습니다. 논리 지연이 지난 뒤의 와 다음 상승 에지 전후의 sampled_y를 구하세요.
해설 보기
조합 출력 입니다. sampled_y는 다음 상승 에지 전까지 0을 유지하고, 그 에지에서 1을 저장합니다. 입력이 샘플링에 필요한 시간 동안 안정되어 있다고 가정한 결과입니다.