2012-05-16 2 views
0

Я пытаюсь объявить модель памяти 1 МБ, используя массив в Verilog в ModelSim, используя приведенный ниже код. Я также должен иметь адрес 0x80020000 в адресном пространстве.Создание массива в Verilog с использованием ModelSim

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 

Однако, если я инициализировать индексы памяти от 7FEF_FFFF до 7FFF_FFFF, который также должен быть 1 MB, все в порядке, и я вижу выделенную память в симуляции. Если я изменяю диапазон от 7FEF_FFFF до 8000_0000, теперь я получаю внутреннее переполнение размера данных во время компиляции. Почему конечный диапазон памяти отображается как -2146828288 (FFFF FFFF 800A 0000) в ошибке (дополнение 2)?

Все примеры, которые я видел в Интернете, показывают меньшие воспоминания, то есть 256 слов, поэтому рег [7: 0] MEMORY [0: 255]), поэтому я не уверен, есть ли проблема в моей логике или если проблема связана с HW на моей машине. Я использую 32-разрядную версию Modelsim & с 4 ГБ ОЗУ.

+4

Вы действительно хотите сгенерировать 4 ГБ памяти? Возможно, вы перегрузили свой симулятор. У вас есть 64-битная машина и 6+ гб оперативной памяти? – Tim

+0

Я думаю, что VCS может использовать редкие воспоминания через атрибуты. Не уверен в Modelsim. –

ответ

3

Каждая запись в этом массиве будет два байта, так как каждый бит может быть 0, 1, Z или X. Массив 0x80020000 записей, что составляет 2147614720 записей в десятичной системе.

2 * 2147614720 - 4295229440, который составляет 4 + бит гигабайта на одном массиве.

Поверьте, вы не хотите этого делать. Даже просто написать одно значение для всех этих мест займет огромное количество времени моделирования.

Если вы находитесь в SystemVerilog, то используйте ассоциативный массив с адресом в качестве индекса. Это будет использовать память только для мест, в которых есть что-то, что хранится в них. В противном случае я предлагаю вам обернуть вашу память в то, что перемещает меньший массив в нужную часть вашего адресного пространства.

+0

Спасибо за ваш ответ. Я осознал свою ошибку в отношении размера памяти. Я изменил свой код, но все еще получаю сообщение об ошибке при попытке указать указанный адрес (0x8002000) в 1 МБ модели памяти. См. Мой обновленный вопрос выше. – terfex

+0

@terfex: интерпретирует значение 0x80 .... как знаковое значение и говорит, что это отрицательно, потому что установлен верхний бит. Попробуйте 'parameter unsigned' –

1

Сначала это было похоже на ошибку, но, возможно, нет. Индексы массивов рассматриваются как постоянные целочисленные выражения.

Выражения, определяющие индексы массива, должны составлять константные целочисленные выражения. Значение константного выражения может быть положительным целым числом, отрицательным целым числом или нулем.

Спецификация также очень понятна в отношении постоянных целых чисел и что они отличаются от целых переменных.

Простые десятичных чисел без размера и базового формата должны быть рассматриваются как целые числа со знаком, в то время как числа, указанные с базового формата должны рассматриваться как знаковые целые числа, если s условное обозначение является включены или как целые числа без знака если используется только базовый формат.

Однако этот параметр вынужден быть целочисленным (хотя и постоянным), который всегда подписан. Это подразумевается в спецификации.

Объявление параметров без какой-либо типа или диапазона спецификации должны по умолчанию типа и диапазону конечного значения, присвоенного параметру , после какого-либо значения переопределяет было применено.

Если вы запустите симулятор и распечатаете некоторые арифметические результаты с использованием MEM_END, он, вероятно, будет действовать как 32-разрядное значение со знаком. Сообщение, которое вы видите, безусловно, согласуется с подписью MEM_END. Лично я бы никогда не использовал индексы массива смещения таким образом.


Чтобы исправить это есть несколько вещей, которые вы могли бы попробовать:

  • Используйте неподписанную функцию:

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

  • Если вам нужен диапазон 1Мб, вы могли бы использовать 0x8000_0000..0x8010_0000 а затем игнорировать MSB в индексе.

  • Если вам необходимо протестировать MSB адреса, вы можете применить смещение внутри вашей модели памяти.

  • Используйте 64-разрядную версию Modelsim.

  • Используйте `define, чтобы избежать параметра, хотя и не идеальны, поскольку определяются глобально, а параметры ограничены.

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

Трудно ответить на этот вопрос, не зная точно, что вы пытаетесь сделать.

+0

Привет, Adam, спасибо за ваш ответ и помощь. Как вы сказали, во время моей отладки я понял, что MEM_END интерпретируется как целое число со знаком во время индексации, которое вызывает ошибку. Однако вы можете рекомендовать более эффективный подход к этой проблеме? Для требований моего проекта мне нужно иметь 1 МБ памяти, которая содержит адрес 0x8002_0000 в адресном пространстве. – terfex

Смежные вопросы