Как понять, какой SystemVerilog поддерживается компилятором Cadence XMVLOG?

Мне нужно перенести среду моделирования SV с Questa на Xcelium 20.9. У меня проблемы с компиляцией файлов с помощью xmvlog, тогда как с vlog проблем нет.

Итак, вот что я сделал.

  1. Убедитесь, что цепочка инструментов установлена ​​правильно: я запустил этот простой пример с edaplayground. Это работает нормально. Я также могу видеть волны в Simvision

  2. Попробуйте более сложный дизайн, включающий несколько классов и пакетов.

Вот где я не могу продолжить: мне не удается скомпилировать пакет. Я попытался упростить файл и извлечь минимальный нерабочий пример.

Файл выглядит так:

package test_pkg;
  task wait (ref logic clock, int cycl_num);
    for (int k = 0; k < cycl_num; k++) begin
      @(posedge clock);
    end
  endtask : wait
endpackage

Итак, простой пакет с одной задачей. Запуск xrun test/test_pkg.sv:

введите здесь описание изображения

Здесь много ошибок. Я заметил одну вещь: добавление void в начале объявления задачи решает некоторые из них.

После этого результат будет таким: введите здесь описание изображения

Проблема в определении задачи, так как я могу скомпилировать, если ее удалить.

Я также пробовал следующие варианты для xmvlog

-sv Принудительная компиляция SystemVerilog
-sysv2005 Включить только SV-2005 и более ранние ключевые слова
-sysv2009 Включить только SV-2009 и более ранние ключевые слова

Но не повезло. Есть идеи, что здесь не так? Как указать правильную версию SystemVerilog?


person a_bet    schedule 04.05.2021    source источник


Ответы (1)


Проблема в вашем коде, а не в симуляторе Cadence.

Одна проблема заключается в том, что wait является ключевым словом Verilog, и его нельзя использовать в качестве имени task. См. IEEE Std 1800-2017, раздел 9.4 Процедурный контроль времени; он также является частью 1364 Std. Questa должна была выдать вам ошибку.

Вам нужно изменить имя на другое, например wait_clk. Вам также нужно изменить его после ключевого слова endtask.

Другая проблема заключается в том, что Cadence также выдает мне ошибки, используя ref.

  task wait_clk (ref logic clock, int cycl_num);
                               |
xmvlog: *E,REFANA : reference argument is illegal inside static task-function declaration.
  task wait_clk (ref logic clock, int cycl_num);
                                             |
xmvlog: *E,REFANA : reference argument is illegal inside static task-function declaration.

Я не думаю, что вам нужны эти входы, чтобы быть ссылками. Если это так, то вы можете просто удалить его:

package test_pkg;
  task wait_clk (logic clock, int cycl_num);
    for (int k = 0; k < cycl_num; k++) begin
      @(posedge clock);
    end
  endtask : wait_clk
endpackage

Однако, если вам нужен ref, вы можете получить более подробную информацию, используя nchelp:

nchelp xmvlog REFANA
xmhelp: 20.09-s009: (c) Copyright 1995-2021 Cadence Design Systems, Inc.
xmvlog/REFANA =
    A SystemVerilog reference argument, declared in the formal argument list
    of a task or function, must always be an automatic variable.  The enclosing
    task or function declaration must therefore use the 'automatic' keyword
    to promote all of its formal arguments into automatic variables.

Если вы просто хотите, чтобы clock был ref:

package test_pkg;
  task automatic wait_clk (ref logic clock, input int cycl_num);
    for (int k = 0; k < cycl_num; k++) begin
      @(posedge clock);
    end
  endtask : wait_clk
endpackage

Вы не должны использовать void вместо task. Это ничего не исправило; это просто повело компилятор по другому пути.

person toolic    schedule 04.05.2021