방금 버블 메모리 에뮬레이터 베릴로그 모델 시뮬레이션하다가 희한한 점을 발견했습니다.
0x191부터 0x19C까지 페이지를 불러오고, 다시 0x191페이지를 불러와야 하는데 갑자기 0x78C 페이지가 튀어나온 것입니다.
버블 메모리 컨트롤러는 특정 신호 한 라인을 그냥 LOW로 둠으로써 페이지를 넘깁니다. 피드백같은것도 없습니다. ACK도 없습니다. 그냥 컨트롤러 자체 클럭으로 어느 정도 페이지가 넘어가고 있는지 계수하는 수밖에 없습니다. 만약 버블 메모리쪽에 문제가 발생한다면 컨트롤러가 생각하는 페이지하고 버블 메모리에서 넘어간 실제 페이지하고 달라질수도 있습니다. 쓰기시에는 쓰기가 잘못될 수도 있습니다.
버블 메모리는 말그대로 자기 버블을 이동시키는 거라 RAM이나 ROM과 같은 형식의 랜덤 액세스는 불가능합니다. 그러면 페이지를 분명히 제대로 넘겼단 소린데, 왜 0x191이 안 나오고 0x78C가 나왔을까요?
대략 급하게 계산해 보니, 처음으로 불러온 0x191페이지와 이후 다시 불러온 0x191페이지 사이에는 10265번의 자기장 회전이 있었습니다. 대충 5로 나눠보니 2053이 나옵니다. 이것은 FBM54DB 버블 메모리의 한 루프의 포지션 수입니다.
그렇습니다. 버블의 포지션 수가 제가 전제했던 4106의 반, 2053이었던 것입니다. 계산을 잘못하여 잘못된 변환 테이블을 집어넣었으니 잘못된 페이지가 나올 수밖에 없는 것입니다.
간단한 C++프로그램을 짜서 다시 계산을 돌린 후 집어넣고 시뮬레이션을 돌렸더니 0x191이 제대로 튀어나옵니다.
제가 시뮬레이션 실행시간이 오래 걸려도 그냥 혹시몰라서 계속 돌려봤기에 망정이지, 그냥 이걸로 합성시켰으면 알 수 없는 오류로 머리를 싸맸을지도 모르겠습니다.