2012-05-16 2 views
0

아래 코드를 사용하여 ModelSim의 Verilog에서 배열을 사용하여 1MB 메모리 모델을 선언하려고합니다. 또한 주소 공간에 주소 0x80020000이 있어야합니다.ModelSim을 사용하여 Verilog에서 배열 만들기

parameter MEM_START = 32'h7FFA_0000; 
parameter MEM_END = 32'h800A_0000; 
reg [7:0] MEMORY [MEM_START:MEM_END]; 

위의 코드는 잘 컴파일하지만 난 그것을 시뮬레이션하려고 할 때 다음과 같은 오류를 제공합니다

# Loading project.memoryModule 
# ** Fatal: (vsim-3419) Array with element size 2 and index range 2147090432 downto -2146828288 is too large. 
# Time: 0 ns Iteration: 0 Instance: Project/memoryModule.v 
# FATAL ERROR while loading design 
# Error loading design 

을 그러나 나는 또한해야하는 7FFF_FFFF에 7FEF_FFFF에서 메모리 인덱스를 초기화 할 경우 1 MB, 다 괜찮아요 시뮬레이션에서 할당 된 메모리를 볼 수 있습니다. 범위를 7FEF_FFFF에서 8000_0000으로 수정하면 컴파일하는 동안 내부 데이터 크기가 오버 플로우됩니다. 메모리의 끝 범위가 오류 (2의 보수)에 -2146828288 (FFFF FFFF 800A 0000)으로 나타나는 이유는 무엇입니까?

온라인으로 본 모든 예는 더 작은 기억, 즉 256 단어이므로 reg [7 : 0] MEMORY [0 : 255])이므로 내 논리에 문제가 있는지 확실하지 않습니다. 문제는 내 컴퓨터의 HW와 관련이 있습니다. Modelsim의 32 비트 버전 &에 4GB의 RAM이 있습니다.

+4

정말 4GB의 메모리를 생성 하시겠습니까? 아마도 시뮬레이터에 과부하가 걸릴 것입니다. 64 비트 시스템과 6GB 이상의 RAM을 사용할 수 있습니까? – Tim

+0

VCS는 속성을 통해 스파 스 메모리를 사용할 수 있다고 생각합니다. Modelsim에 대한 확신이 없습니다. –

답변

3

각 비트는 0, 1, Z 또는 X 일 수 있으므로 해당 배열의 각 항목은 2 바이트입니다. 배열의 길이는 0x80020000이며 십진수는 2147614720입니다.

2 * 2147614720은 4230229440이고 이는 4 + 1 비트 기가 바이트 이고 하나의 배열은입니다.

나를 믿으십시오, 이것을 원하지 않습니다. 모든 위치에 단일 값을 쓰는 것만으로도 엄청난 양의 시뮬레이션 시간이 소요됩니다.

SystemVerilog에있는 경우 주소가 색인 인 연관 배열을 사용하십시오. 이렇게하면 무언가가 저장된 위치에만 메모리가 사용됩니다. 그렇지 않으면 주소 공간의 오른쪽 부분으로 더 작은 배열을 옮기는 무언가에 당신의 기억을 감쌀 것을 제안합니다.

+0

답변 해 주셔서 감사합니다. 나는 기억의 크기에 관한 나의 실수를 깨달았다. 코드를 수정했지만 1MB 메모리 모델 내에 지정된 주소 (0x8002000)를 사용하려고해도 오류가 발생합니다. 위의 업데이트 된 질문을 참조하십시오. – terfex

+0

@terfex : 0x80 .... 값을 부호있는 값으로 해석하고, 최상위 비트가 설정되어 있기 때문에 음수라고 말합니다. 보십시오'매개 변수 서명되지 않음' –

1

처음에는 버그처럼 보였지만 그렇지 않을 수도 있습니다. 배열 인덱스는 상수 정수 표현식으로 처리됩니다.

배열의 색인을 지정하는 표현식은 상수 표현식이어야합니다. 상수 표현식의 값은 이 양의 정수, 음의 정수 또는 0 일 수 있습니다.

사양은 정수 정수에 대해 매우 명확하며 변수 정수와 다릅니다. 베이스 포맷에 지정된 번호가 부호있는 정수로 간주되어야하는 반면 S 부호가 포함 또는 부호없는 정수인지 크기와 기본 포맷없이

간단한 진수는 부호있는 정수로 처리한다 기본 형식 만 사용하는 경우

그러나이 매개 변수는 항상 정수인 정수형 (비록 상수 임에도 불구하고)이어야하며, 항상 서명됩니다. 이것은 스펙에서 암시 된 것입니다.

없는 타입 또는 다양한 사양 매개 변수 선언은 유형 및 값을 대체 한 후 파라미터에 할당 된 최종 값의 범위 기본 적용된한다.

sim을 실행하고 MEM_END를 사용하여 일부 산술 결과를 인쇄하면 아마도 32 비트 부호있는 값으로 작동합니다. 표시되는 메시지는 MEM_END에 서명 한 것과 확실히 일치합니다. 개인적으로 나는 결코 이런 식으로 오프셋 배열 인덱스를 사용하지 않을 것입니다. 당신이 1MB의 범위를해야하는 경우

reg [7:0] MEMORY [$unsigned(MEM_START):$unsigned(MEM_END)];

  • , 당신은 0x8000_0000..0x8010_0000을 사용할 수

    • 가 서명 기능을 사용


      당신이 시도 할 수있는 몇 가지가이 문제를 해결하려면 인덱스의 MSB를 무시하십시오. 당신이 주소의 MSB를 통해 테스트해야하는 경우

    • , 당신은 당신의 메모리 모델 내부 오프셋 적용 할 수 있습니다.

    • 사용 ModelSim을 64 비트 버전. 전역 및 매개 변수가 범위가된다 정의하므로하지 이상적인 있지만

    • 사용 `define는 매개 변수를 방지 할 수 있습니다.

      `define MEM_START 32'h7FFA_0000; 
      `define MEM_END 32'h800A_0000; 
      reg [7:0] MEMORY [`MEM_START:`MEM_END];

    정확히 무엇을 하려는지 알지 못하면 대답하기가 어렵습니다.

  • +0

    안녕하세요 아담, 당신의 응답과 도움에 감사드립니다. 앞에서 말했듯이, 디버깅하는 동안 MEM_END가 색인 생성 중에 오류를 일으키는 부호있는 정수로 해석된다는 것을 알았습니다. 그러나이 문제에 대한 더 나은 접근 방법을 권장 할 수 있습니까? 내 프로젝트의 요구 사항에 대해 주소 공간에 주소 0x8002_0000을 포함하는 1MB 메모리가 있어야합니다. – terfex