Altifigence Academy

5 / 24 · 개념

고정소수점의 비트와 단위

F=4인 입력 0.5와 −1.25를 곱하고 F=8의 바이어스 0.25를 더하세요. 누적 코드와 실수 값은 무엇인가요?

정수에 단위를 붙이기

고정소수점은 정수 코드에 일정한 배율을 붙여 실수를 나타냅니다. 이 단원에서는 총 8비트의 2의 보수 코드와 소수 비트 F=4를 사용합니다. 코드 q의 실수 값은 q×2⁻⁴입니다. Q 형식의 정수 비트 수 표기는 자료마다 부호 비트 포함 방식이 달라질 수 있으므로 총 비트 수, 부호 유무와 F를 직접 적습니다. 총 8비트, signed, F=4이면 코드 범위는 −128부터 127이며 실수 범위는 −8부터 7.9375입니다.

같은 비트열도 F가 다르면 다른 값을 뜻합니다. 24라는 코드는 F=4에서 1.5이고 F=3에서는 3입니다. 그러므로 덧셈기 입력에 두 코드를 그대로 넣기 전에 단위가 같은지 확인해야 합니다. F가 4인 값을 F가 3인 값과 더하려면 하나를 다른 단위로 바꾸고 반올림과 범위를 처리합니다. 단위가 맞지 않는 덧셈은 비트 폭을 충분히 넓혀도 틀립니다.

곱셈 예제

1.5는 코드 24, −0.75는 코드 −12입니다. 정수 곱은 −288이고 두 입력의 소수 비트가 각각 4이므로 곱의 F는 8입니다. 실수로 읽으면 −288/256=−1.125입니다. 두 개의 8비트 입력을 곱한 중간값은 16비트 공간에 보관할 수 있지만 여러 항을 누적할 때는 별도의 누적 폭이 필요합니다. 각 곱에서 먼저 소수 비트 네 개를 버리면 작은 오차가 항마다 더해집니다. 이 과정은 넓은 누적기로 원래 곱 단위를 유지한 뒤 출력에서 한 번만 반올림합니다.

바이어스의 단위도 곱의 단위와 맞춥니다. 실수 바이어스 0.5는 F=8에서 코드 128입니다. 위 곱에 더하면 −288+128=−160이고 실제 값은 −0.625입니다. 같은 바이어스를 F=4의 코드 8로 더하면 −280/256이 되어 전혀 다른 연산입니다. 바이어스 파일에 코드만 적지 말고 배율을 함께 기록해야 하는 이유입니다.

RTL에서 부호 보존하기

2의 보수 값은 넓힐 때 최상위 부호 비트를 복제합니다. −12의 8비트 표현은 11110100이며 16비트로 넓히면 1111111111110100입니다. 0을 채우면 244가 되어 곱셈 부호가 바뀝니다. SystemVerilog에서는 입력, 곱과 누적기를 signed로 선언하고 식의 중간 폭을 명시하는 것이 좋습니다. 짧은 결과 신호에 대입했다고 해서 식 내부가 자동으로 올바른 폭으로 계산되었다고 가정하지 마세요.

이 단원의 2의 거듭제곱 배율은 하드웨어의 시프트를 이해하기 위한 간단한 모델입니다. 실제 양자화 모델은 일반 양의 scale과 zero point를 사용할 수 있습니다. 다음 단원은 이 관계를 확장합니다. 단계마다 코드, 배율, 실수 해석을 같이 적으면 고정소수점, 양자화와 출력 반올림의 차이를 연결해서 이해할 수 있습니다.

직접 생각해 보기

F=4인 입력 0.5와 −1.25를 곱하고 F=8의 바이어스 0.25를 더하세요. 누적 코드와 실수 값은 무엇인가요?

해설 보기

입력 코드는 8과 −20이며 곱은 −160입니다. 바이어스 코드는 64입니다. 누적값 −96은 F=8에서 −96/256=−0.375입니다.

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