강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

rnjstns0721님의 프로필 이미지
rnjstns0721

작성한 질문수

디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기

32bit CPU 설계와 Through-put 개선을 위한 Pipelining 설계 (Timing 이슈 해결을 위해 어떠한 테크닉을 사용하지는 알아봅시다.)

DataMem 스펙 질문

해결된 질문

작성

·

8

0

image.png

안녕하세요 학습 중에 코드를 보고 궁금증이 생겨 질문 드립니다. DataMem spec을 보면 mem 이 4byte짜리로 총 128개로 구성되어 있는데, always 문을 보면 mem[0] ~ mem[63] 까지의 공간을 사용하는 것으로 보입니다. 나머지 mem[64] ~ mem[127] 까지는 사용이 안되는거 같은데, 그러면 굳이 reg [31:0] mem [127:0] 으로 선언한 이유가 있을까요?? 뭔가 제가 파악하지 못한 의도가 있는것인지 궁금하여 질문드립니다!! 감사합니다.

답변 1

0

안녕하세요, 답변 남겨드립니다.

말씀하신것처럼 의도가 헷갈릴수있어서 몇가지 관점들을 설명드려볼게요.

지금 보신 선언은 reg [31:0] mem [127:0]; 이라서 32비트짜리 공간이 128개 있는 셈입니다. 그런데 실제로는 주소를 6비트(Address[5:0])만 쓰고 있어서 0번부터 63번까지만 접근이 됩니다. 즉, 전체 중 절반(64개)만 쓰고 나머지 64개는 실제로는 아무 역할도 하지 않습니다.

그럼 왜 굳이 128개로 선언했을까 하는 부분인데, 보통 두 가지 이유가 있습니다. 하나는 나중에 주소를 7비트(Address[6:0])로 확장해서 128개 다 쓰려고 미리 크게 잡아둔 경우이고, 또 하나는 원래 설계 스펙이 128이었는데 실제 구현은 64까지만 쓰도록 변경되면서 코드가 정리되지 않은 경우입니다.

이렇게 “선언된 크기”와 “실제로 쓰는 크기”가 다르면 몇 가지 불편함이 생깁니다. 예를 들어 합성 도구가 자동으로 최적화를 하면 사용하지 않는 64개는 버려주기도 하지만, 경우에 따라서는 버리지 못하고 그대로 회로 자원이 낭비될 수도 있습니다. FPGA 같은 데서는 64워드만 쓰면 2,048비트 메모리가 필요한데, 128로 선언해두면 4,096비트짜리 메모리 블록이 잡혀버려서 2배를 차지하는 경우도 생깁니다. 또, 시뮬레이션에서는 쓰이지 않는 공간이 초기화되지 않고 X(알 수 없는 값) 상태로 남아 있어서, 혹시 잘못된 주소로 접근하면 디버깅이 어려워질 수 있습니다.

그래서 실제로는 선언 크기와 사용하는 크기를 일치시켜 주는 게 가장 깔끔합니다. 즉, 지금처럼 64개만 쓸 거라면 reg [31:0] mem [63:0]; 으로 줄이고, 혹시 128개를 쓰고 싶다면 주소를 7비트로 바꾸고 초기화도 128개 전체를 돌도록 수정하는 것이 좋습니다.

정리하면, 현재 코드에서는 64개만 쓰니까 128로 선언한 건 사실상 의미가 없고, 그냥 크기를 줄여서 맞추는 게 더 안전하고 효율적입니다. 혹시 나중에 확장을 염두에 둔 거라면 그때 가서 주소폭을 넓히고 선언 크기를 늘리는 방식이 일반적으로 권장됩니다.

rnjstns0721님의 프로필 이미지
rnjstns0721

작성한 질문수

질문하기