VHDL은 [0, 1] 구간 부동소수점 값을 산출하는 내장 유사 난수 생성기 포함. 이 값들을 스케일링과 오프셋으로 실수, 정수, std_logic_vector, 시간 등 모든 타입의 난수 데이터 생성 가능, 테스트벤치에 적합. 다음 가이드는 IEEE MATH_REAL uniform 프로시저로 이 생성기들 구축하고 OSVVM Random 패키지로 더 큰 유연성 확보하는 법 보여줍니다.
아래 예제들 기반인 uniform 프로시저는 IEEE MATH_REAL 패키지에 정의:
procedure UNIFORM(variable SEED1, SEED2 : inout POSITIVE; variable X : out REAL);
두 시드 변수 필요, 호출마다 업데이트. 출력 X는 0~1 사이 유사 난수 실수. 알고리즘이 결정론적이므로 같은 초기 시드 쌍이면 정확한 같은 수열 생성 - 반복 가능한 테스트벤치에 필수적 속성.
기반 알고리즘 깊은 이해 위해 Pierre L'Ecuyer의 Efficient and Portable Combined Random Number Generators 논문 참조, 또는 GHDL 시뮬레이터에 번들된 구현 검토.
테스트 케이스
아래 모든 예제는 두 시드 값 모두 999 사용. 시드들을 프로세스 선언부에 선언, 난수화 함수를 동일 프로세스 내 순수 함수(impure function)로 구현:
variable seed1, seed2 : integer := 999;
이 글 모든 예제 담긴 완전한 테스트벤치 ZIP 파일로 다운로드 가능. 아카이브엔 컴파일·실행 스크립트 포함된 ModelSim 프로젝트도 포함.
난수 실수 값
uniform 프로시저가 [0.0, 1.0] 범위 실수 반환. 임의 구간 [min_val, max_val]로 매핑하려면 폭 곱하고 오프셋 더하기:
impure function rand_real(min_val, max_val : real) return real is variable r : real; begin uniform(seed1, seed2, r); return r * (max_val - min_val) + min_val; end function;
난수 정수 값
실수 값에서 난수 정수 생성은 단순 반올림 시 극값 확률 왜곡되어 까다로움. 다음 함수는 반올림 전 0.5 더해 편향 보정:
impure function rand_int(min_val, max_val : integer) return integer is variable r : real; begin uniform(seed1, seed2, r); return integer( round(r * real(max_val - min_val + 1) + real(min_val) - 0.5)); end function;
이 보정으로 [min_val, max_val] 구간 모든 정수가 동일 확률로 선택됨 보장.
난수 std_logic_vector
임의 길이 std_logic_vector를 난수 비트로 채우려면 각 위치 순회하며 난수 실수가 0.5 초과면 '1', 아니면 '0' 할당:
impure function rand_slv(len : integer) return std_logic_vector is variable r : real; variable slv : std_logic_vector(len - 1 downto 0); begin for i in slv'range loop uniform(seed1, seed2, r); slv(i) := '1' when r > 0.5 else '0'; end loop; return slv; end function;
난수 시간 값
버스트 데이터 트래픽 시뮬레이션 등 난수 타임스탬프 필요 시 난수 실수를 원하는 구간으로 스케일링 후 VHDL time 타입으로 변환:
impure function rand_time(min_val, max_val : time; unit : time := ns) return time is variable r, r_scaled, min_real, max_real : real; begin uniform(seed1, seed2, r); min_real := real(min_val / unit); max_real := real(max_val / unit); r_scaled := r * (max_real - min_real) + min_real; return real(r_scaled) * unit; end function;
시뮬레이터 시간 단위(예: ns)를 함수에 제공해야 함에 유의.
OSVVM Random 패키지
기성 솔루션 선호하는 사용자 위해 OSVVM Random 패키지가 표준 VHDL 타입 모두에 난수 값 생성하는 풍부한 오버로드 함수 세트 제공. 패키지 임포트:
library osvvm; use osvvm.RandomPkg.all;
ModelSim은 OSVVM 사전 설치되어 해당 플랫폼에서 추가 다운로드 불필요. 다른 시뮬레이터는 OSVVM GitHub 저장소의 RandomPck.vhd 파일 참조.