LTspice의 난수는 정말 무작위적일까?
2025년 08월 06일
트위터로 보내기페이스북으로 보내기구글플러스로 보내기

 글/ 앤 마하피(Anne Mahaffey) 수석 엔지니어, 아나로그디바이스(Analog Devices)


이 글에서는 LTspice의 flat(), gauss() 그리고 mc() 함수를 사용하여 시뮬레이션에 의사 난수성(pseudorandomness)과 실제 무작위성(true randomness)을 포함시키는 방법과 설정 패널의 ‘Hacks’ 섹션에 있는 “Use the clock to reseed the MC generator” 옵션 사용법을 살펴본다. 또한 의사 난수성과 진정한 무작위성 간의 절충안, 통계적/몬테카를로 유사 시뮬레이션, 그리고 보다 표적화된 최악 조건에서의 시뮬레이션들 간의 절충안에 대해서도 논의한다.


머리말 

LTspice 회로도에서 무작위성을 시뮬레이션하는 방법이 몇 가지 있다. LTspice의 flat(), gauss(), mc() 함수를 활용하면 LTspice에서 무작위성을 시뮬레이션 할 수 있다. mc() 함수는 이 글 전체에서 부품의 허용 오차를 시뮬레이션 하는 데 사용된다. LTspice를 연 상태에서 Help > LTspice Help (또는 F1 키 누름)를 선택하여 flat()과 gauss() 함수에 대한 자세한 정보를 제공하는 도움말 매뉴얼(Help Manual)을 연다. 


그림 1의 예시에서 mc() 함수는 R1과 C1의 명목 값과 허용 오차를 설정하는 데 사용된다. 예를 들어, R1의 명목 값은 10kΩ이고 허용 오차는 5%이다. mc(x,y) 함수는 x*(1-y)와 x*(1+y) 사이의 균일 분포의 의사 난수를 생성한다.


bed74f109ce6bc329b44f4a7deb15cea_1754481187_7305.jpg
그림 1. 수동 부품의 값과 허용 오차를 설정하기 위해 mc()함수를 사용하는 RC 회로


계속 읽다 보면, 의사 난수와 실제 난수를 구분하는 방법과 LTspice가 진정한 난수(무작위 수)를 생성하도록 하는 방법을 알 수 있다. .STEP 지시문은 LTspice가 시뮬레이션을 몇 회 실행할지 지시하는 데 사용된다. 다음 예제에서는 .STEP 지시문이 1부터 100까지 더미(dummy) 매개 변수를 1씩 증가시키면서 100회의 시뮬레이션을 실행하고, 매번 R1과 C1 값이 무작위로 설정된다.


이 mc() 함수가 각 단계를 반복하면서 무엇을 하는지 살펴보자: 그림 2는 전압 소스만 사용하는 더 간단한 예제를 보여준다. 이 예제에서는 mc() 함수를 사용하여 명목 전압을 10V로 설정하고 허용 오차를 100%로 설정하여 0V에서 20V 사이의 균등 분포를 기대할 수 있다. 파형 뷰어와 SPICE 출력 로그에서 결과를 보면, 10회 반복 시 전압이 약 2.7V에서 19.92V까지 분포하는 것을 볼 수 있지만, 분포가 완전히 균등하지는 않다. 반복 횟수를 더 많이 늘리면 이러한 결과가 통계적으로 더 신뢰할 수 있다는 것을 알게 된다.


더 자세히 살펴보려면 이 시뮬레이션을 여러 차례 실행해보라. 그리고 매 시뮬레이션마다 값이 바뀌는지를 살펴보라. 필자의 컴퓨터에서는 이 시뮬레이션을 실행할 때 각 단계를 반복할 때마다 동일한 전압 값이 나왔다. 이는 무작위처럼 보이지 않는다.


bed74f109ce6bc329b44f4a7deb15cea_1754481211_7185.jpg
그림 2. 전압을 무작위화 하기 위해 mc() 함수를 사용하는 전압 소스


여기서 관찰하게 되는 것은 난수(무작위 수)를 생성할 때, 코드와 컴퓨터에서 나타나는 고전적인 동작이다. 프로그래밍 언어의 난수 생성기는 이들과 연관된 seed() 메서드를 선택적으로 사용할 수 있다. 프로그램을 실행할 때마다 바뀌는 진정한 난수를 얻으려면 seed() 메서드를 매번 다른 시드 값으로 호출해야 한다. 종종 프로그래머는 현재 시스템 시간을 seed() 메서드로 전달해 무작위성을 구현한다.


그렇다면 LTspice 시뮬레이션에서는 이를 어떻게 해야 할까? 만약 목표가 시뮬레이션을 실행마다 값이 달라지도록 하려면, 다시 말해 각 시뮬레이션마다 값이 바뀌도록 하려면, 설정 패널의 Hacks 섹션에서 “Use the clock to reseed the MC generator” 옵션을 활성화해야 한다(그림 3 참조).


bed74f109ce6bc329b44f4a7deb15cea_1754481269_3595.jpg
그림 3. 매 시뮬레이션마다 무작위성을 활성화하는 방법을 나타낸 

LTspice 설정 패널의 Hacks 섹션 장면


이 “Use the clock to reseed the MC generator” 옵션은 flat() 함수와 gauss() 함수에도 적용된다. 이 함수들은 mc() 함수가 사용되는 동일한 위치에서 사용할 수 있다. 하지만, 이것이 사용자가 구현하고자 의도한 시뮬레이션 동작인지 다시 한 번 생각해 봐야 한다. 시뮬레이션을 진짜 무작위로 구현하고 싶은가? 만약 그렇다면, 시뮬레이션에서 예측 가능성과 재현성을 잃게 된다.


예시를 위해, 그림 2의 예제로 다시 돌아가보자. 만약 0V ~ 20V 사이에서 균일한 분포를 갖는 전압을 시뮬레이션 하고자 한다면 어떻게 될까? 현재의 예제는 기대를 완전히 만족시키지는 않지만, 반복 횟수를 10회에서 100회로 늘린다면 원하는 분포 범위에 훨씬 가까워질 수 있을 것이다(그림 4). 이러한 조정을 통해 시뮬레이션을 원하는 분포 경계(edge)에 훨씬 더 근접하게 할 수 있다.


bed74f109ce6bc329b44f4a7deb15cea_1754481294_7643.jpg
그림 4. 더 많은 반복 횟수를 가진 mc() 함수를 사용하는 전압 소스


이제, (a) mc() 100회 반복이 상당히 좋은 값 분포를 만들어낼 것이고, (b) “reseed the MC generator” 해킹(hack) 옵션을 활성화하지 않는다면, 그 결과는 시뮬레이션을 실행할 때마다 동일하게 반복될 것이 분명하다.


만약 회로에서 mc() 함수가 여러 곳에서 사용된다면 어떻게 될까? 모든 허용 오차의 극단 값이 100회 반복으로 모든 조합이 포함된다고 확신할 수 있을까? 그림 5는 이를 시도한 것으로, mc() 함수를 사용하는 두 개의 전압 소스를 보여준다. V(out1)을 플로팅하고 x축을 V(out2)로 설정하면, V1과 V2의 좌표 조합이 무작위적으로 분포하는 것을 확인할 수 있다(마우스 오른쪽 버튼으로 x축 제목을 클릭하여 더미 매개 변수에서 V(out2)로 변경). 그러나 기술적으로는, 이 전압들의 최소값과 최대값이 동시에 형성되지 않아 코너 부분에서 커버리지가 약간 부족할 수 있다.


bed74f109ce6bc329b44f4a7deb15cea_1754481311_5406.jpg
그림 5. 하나의 시뮬레이션에서 두 개의 mc() 전압 결과를 플로팅한 장면


만약, 완벽한 커버리지에 가깝게 하는 것이 목표라면 반복 횟수를 더 늘려야 한다(그림 6).


bed74f109ce6bc329b44f4a7deb15cea_1754481332_8466.jpg
그림 6. 반복 횟수를 늘렸을 때의 결과를 플로팅한 장면


이 간단한 예제의 경우에는 시뮬레이션이 빠르게 실행되기 때문에 1,000회를 실행해도 문제가 없다. 하지만 만약 시뮬레이션이 실행되는 데 시간이 오래 걸리고, 반복 횟수가 많아져 실행하는 데 몇 시간, 또는 심지어 며칠이 걸린다면 어떨까? 또한, “Use the clock to reseed the MC generator” 옵션을 활성화할 가치가 있는지도 고려해봐야 한다. 만약 mc() 함수로 생성된 값이 만족스럽다고 판단된다면, 그 결과가 시뮬레이션을 실행할 때마다 동일하게 반복되길 원하는 것이 목표인가? 아니면 실행할 때마다 값이 무작위로 바뀌길 원하는 것인가? 이는 이 해킹 옵션을 활성화하기 전에 꼭 생각해봐야 할 중요한 질문이다.


시뮬레이션 시간을 획기적으로 단축하기 위해, 이번에는 무작위성이 덜한 접근 방식을 살펴본다. 그림 7은 전체 시뮬레이션 시간을 최소화하면서 시뮬레이션이 수동 부품의 허용 오차 범위의 모든 경계 범위까지 적용되도록 하는 사례를 보여준다. 이 예시는 R1의 세 가지 값과 C1의 세 가지 값을 순차적으로 처리하여 총 9회의 시뮬레이션을 수행하고, 부품의 값에서 동시에 최소값(또는 최대값)들이 커버되는 시나리오를 보여준다.


bed74f109ce6bc329b44f4a7deb15cea_1754481352_1704.jpg
그림 7. 허용 오차로 인한 동작을 시뮬레이션하기 위해 부품에 특정 값을 설정하는 장면


결론

회로의 동작 한계를 탐색하는 것이 목적이라면, 무작위성이 덜한 방식이 더 적합할 수 있다. 반면, 다양한 변동성 범위에서 시뮬레이션이 어떻게 작동하는지를 통계적으로 분석하는 것이 목적이라면, 무작위성을 도입하는 함수들을 활용하여 많은 횟수의 시뮬레이션을 수행하는 방식이 가장 효과적일 수 있다. 어느 쪽이든, 이제는 LTspice 시뮬레이션에 무작위성을 어느 정도 포함할지 또는 포함하지 않을지에 대해 더 명확히 이해하게 되었을 것이다.


이와 관련한 추가적인 내용은 'LTSpice를 사용하여 복잡한 회로에 대한 통계적 허용 오차 분석을 모델링하는 방법(How to Model Statistical Tolerance Analysis for Complex Circuits Using LTspice)' 기사를 참고하기 바란다: https://www.analog.com/en/resources/technical-articles/how-to-model-statistical-tolerance-analysis.html/?adicid=af_ww_technical%20article__external%20publications_2025  


저자 소개

앤 마하피(Anne Mahaffey)는 조지아 공과대학교에서 학사 학위를, 노스캐롤라이나 주립대학교에서 석사 학위를 받은 후, 2003년에 아나로그디바이스(ADI)에 직접 디지털 합성 제품을 지원하는 테스트 엔지니어로 입사했다. 그는 10년 넘게 프리시전 스튜디오(Precision Studio) 도구 세트의 설계 도구를 설계 및 지원했으며, 현재는 LTspice®의 수석 애플리케이션 엔지니어로 활동하고 있다. 

 

핫 뉴스
많이 본 뉴스