Массив дампов памяти Icarus verilog ($dumpvars)

Я пытаюсь записать массив (reg [31:0] data [31:0]), но не могу сделать это успешно. Я пробовал то, что есть в вики iverilog:

integer idx;
for (idx = 0; idx < 32; idx = idx + 1)
    $dumpvars(0,cpu_tb.cpu0.cpu_dp.cpu_regs.data[idx]);

Это работает, но происходят 2 вещи.

  1. Отображается предупреждение: предупреждение VCD: слово массива cpu_tb.cpu0.cpu_dp.cpu_regs.data[0] будет конфликтовать с экранированным идентификатором.
  2. В GTKWave у меня есть что-то вроде этого в окне SST: \data[0][31:0]

Есть ли какое-то решение по этому поводу?

Заранее спасибо и извините за мой английский.

1 ответ

Решение

Я отправил по электронной почте список рассылки Icarus Verilog. Вот несколько ответов:

Чтобы вывести слово массива, Icarus необходимо экранировать имя, чтобы оно было совместимо с форматом дампа VCD. Вот что такое \data[0][31:0]. Это нулевое 32-битное слово массива данных. Поскольку теперь экранированное имя и имя массива могут конфликтовать, Icarus выдает предупреждение. Было бы лучше, если бы он мог проверять наличие конфликтующего идентификатора и печатать сообщение только при наличии проблемы, но, насколько я помню, это было невозможно.

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

Я согласен, что было бы хорошо, если бы мы могли сделать предупреждение более точным, но мы обычно заняты работой над другими вещами, поэтому мелкие неприятности, которые, кажется, сложно исправить, не всегда исправляются. Насколько я помню, и вот уже много лет, проблема в том, что если вы ищите экранированный идентификатор, он находит элемент массива, и в VPI нет способа найти следующее вхождение. Возможно, что поиск элемента массива в реализации поиска Icarus по имени является ошибкой.

Cary


"Чтобы вывести слово массива, Icarus необходимо экранировать имя, чтобы оно было совместимо с форматом дампа VCD. Вот что такое \data[0][31:0]. Это нулевое 32-битное слово массива данных. Из-за того, что теперь экранированное имя и имя массива могут конфликтовать, Icarus выдаст предупреждение. Было бы лучше, если бы он мог проверять конфликтующий экранированный идентификатор и печатать сообщение только при наличии проблемы, но, насколько я помню, это было невозможно ".

... Я не думаю, что нужно избегать имен. И VCS (за которым следует fsdb2vcd) и CVC передают имя напрямую без проблем. Пример вырезания и вставки показан ниже:

$ var wire 5 `'IC_DrAd0 [3] [4: 0] $ end $ var wire 5 a' IC_DrAd0 [2] [4: 0] $ end $ var wire 5 b 'IC_DrAd0 [1] [4: 0] $ end $ var wire 5 c 'IC_DrAd0 [0] [4: 0] $ end

Я понимаю, что спецификация VCD не определяет это, но мне пришлось вложить много таких расширений в gtkwave за эти годы, так как другие инструменты генерируют эти конструкции. Экранирование может привести к несовместимости файлов сохранения (отсутствующим сигналам) при попытке симуляции на iverilog против VCS.

Со временем конструкции SV, скорее всего, будут вызывать дальнейшее добавление файлов VCD. AFAIK, VCD часть спецификации 1364 вообще не обновлялась со времен Verilog-XL. CVC позволяет обойти возможные несовместимости, добавив +dump_arrays plusarg (и нет, вам не нужно зацикливаться на каждом элементе массива).

-Тони

Я также отправил письмо создателю GTKWave Тони Бибеллу:

Привет,

Проблема в том, что компилятор не передает эти значения в файл дампа. Вам нужно будет связаться с разработчиками iverilog. Я вижу ту же проблему, если я запускаю sim и сравниваю с другим симулятором, таким как CVC, с включенным +dump_arrays, который делает дамп массивов, и они видны в gtkwave.

http://iverilog.wikia.com/wiki/Release_Notes_Icarus_Verilog_0_9_2 | Разрешить $dumpvars принимать члены массива для дампа,

... похоже, что во время "начального" времени вам может понадобиться добавить оператор $dumpvars для каждого элемента массива, который вы хотите сбросить. Я не знаю, работает ли само имя массива. Присвоение каждого элемента "проводу" тоже может сработать.

Я никогда не пробовал эту функцию в iverilog, поэтому я не знаю, работает ли она. Возможно, вам придется поэкспериментировать или спросить разработчиков.

-Тони

Недавно у меня была аналогичная проблема:

При сбросе варов с циклом for, как в вопросе, возникает эта ошибка vcd:

ERROR: $dumpvars cannot dump a vpiConstant.

Мой обходной путь - сгенерировать n проводов с оператором assign, присвоив ему соответствующее слово массива следующим образом:

reg     [31:0]  registers [31:0];
generate
  genvar idx;
  for(idx = 0; idx < 32; idx = idx+1) begin: register
    wire [31:0] reg;
    assign reg = registers[idx];
  end
endgenerate

Теперь в GTKWave у меня правильно выгружены сгенерированные блоки.

Другие вопросы по тегам