Altifigence Academy

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 소스

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 / time8 / 8000ps

각 열은 아래 입력 파일의 한 항목에 해당합니다. 조합 출력 y의 예상값은 0,0,0,1,1,0,1,1입니다. 이 그림은 입력을 순서대로 넣었을 때의 조합 출력만 보여 주며, sampled_y가 갱신되는 시각은 포함하지 않습니다.

입력 JSON의 여덟 조합을 한눈에
파형 데이터 보기
파형 데이터: 각 문자는 한 구간, 점은 이전 상태 유지, p는 클록 한 주기입니다.
신호파형버스 값
a0...1...
b0.1.0.1.
sel01010101
y expected0..1.01.

입력 자극

json
[
  {
    "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 테스트벤치는 포함하지 않습니다. 학습 완료 표시는 학습 기록이며 실제 시뮬레이션 결과를 뜻하지 않습니다.

먼저 예상 결과를 작성합니다

시뮬레이터를 실행하기 전에 위 입력 순서의 조합 출력 yy를 직접 계산하세요. 예상 비트열은 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1입니다. 이는 입력 조합 8개를 모두 검사한 결과이므로, 마지막 출력 하나만 맞는지 확인할 때보다 회로의 동작을 더 확실히 검증할 수 있습니다.

레지스터레지스터 여러 비트의 상태를 저장하는 회로입니다. 이 과정의 동기식 레지스터는 클록 에지에서 정해진 입력을 저장합니다. 자세히 보기 출력은 입력 자극이 바뀌는 순간이 아니라 상승 에지에서 갱신됩니다. 에지 직전의 조합 출력과 에지 직후의 레지스터 출력을 구분해 기록하세요.

qk+1=sk‾ak+skbkq_{k+1}=\overline{s_k}a_k+s_kb_k

여기서 kk번째 에지에서 샘플링한 입력으로 에지 이후 상태 qk+1q_{k+1}을 정의했습니다. 신호 이름 sampled_y는 이 상태에 해당합니다. 같은 시간 좌표에 표시되더라도 입력 적용과 레지스터 갱신의 이벤트 순서를 확인해야 합니다.

세 가지 검사로 오류 원인을 구분합니다

  1. 선택 반전: sel ? a : b로 바꾸면 어떤 입력 벡터에서 처음 예상과 다른 출력이 나오는지 먼저 예측합니다. a=ba=b인 벡터는 이 오류를 발견하지 못합니다.
  2. 관찰 시점 혼동: y 대신 sampled_y를 조합 출력의 예상값과 즉시 비교하면 정상 회로도 오류가 있는 것처럼 보이는 이유를 설명합니다.
  3. 출력 유지 검사: 선택되지 않은 입력만 바꾸고 yy가 유지되는지 확인합니다. 선택된 입력의 변화에는 yy가 따라가야 합니다.

오류 보고서에는 입력, 관찰 시점, 기대값, 실제값을 한 줄씩 남기세요. 단순히 ‘파형이 이상하다’는 기록으로는 선택 논리 오류와 한 사이클 지연을 구분할 수 없습니다.

확장 과제

데이터 폭을 4비트로 넓히면 가능한 조합 입력은 24+4+1=5122^{4+4+1}=512개입니다. 전수 검사가 여전히 가능하지만 먼저 0, 최댓값, 0101, 1010과 walking-one 패턴을 사용해 비트 위치 오류를 빠르게 드러내세요. 폭을 바꾼 회로의 설정과 입력 파일도 함께 갱신해야 합니다.

직접 생각해 보기

a=0,b=1,s=0a=0,b=1,s=0인 값을 상승 에지에서 저장한 뒤, 다음 에지 전에 ss만 1로 바꿨습니다. 논리 지연이 지난 뒤의 yy와 다음 상승 에지 전후의 sampled_y를 구하세요.

해설 보기

조합 출력 y=1y=1입니다. sampled_y는 다음 상승 에지 전까지 0을 유지하고, 그 에지에서 1을 저장합니다. 입력이 샘플링에 필요한 시간 동안 안정되어 있다고 가정한 결과입니다.

실습 파일

mux-top.sv ↓mux-inputs.json ↓

선택은 이 브라우저에만 적용됩니다. 언제든 푸터에서 변경할 수 있습니다.