|
|
  |
Компиляция в Riviera-PRO, Ошибка при компиляции модуля |
|
|
|
Mar 29 2017, 14:58
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-08-08
Из: Томск
Пользователь №: 39 559

|
Всем привет. Начал тут осваивать симулятор Riviera-PRO и наткнулся на довольно нелепую проблему: Имеется модуль, в котором имеется присваивание сигналу в разных местах:
....... initial begin reset = 1'b1; end ....... always_ff @(posedge clk200) begin : sync_reset_reg reset <= ~lockpll; end .......
Казалось бы - бред, не может сигналу присваивать значение в параллельных процессах, НО. Стандарту это не противоречит, поэтому ModelSim/QuestaSim разрешает данную конструкцию, а синтезатор, например Quartusа, тупо не обратит на блок initial внимание, так как это не синтезируемая конструкция.
А вот при запуске компиляции данного модуля Riviera выдает ошибку: ALOG: Error: VCP2675 C:/aldec/Riviera-PRO-2013.10/Projects/.../mymodule.v : (48, 1): Cannot write to a variable 'reset' that is also driven by an always_comb/always_latch/always_ff procedural block.
Наверное существует некая опция команды alog, о которой я не знаю?
P.S. Блок initial я используя в симуляции, для избежания в начальный момент времени неопределенного состояния сигнала Х, так как это в некоторых случаях чревато...
|
|
|
|
|
Mar 30 2017, 18:21
|
Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 21-10-11
Пользователь №: 67 894

|
Цитата(dde29 @ Mar 29 2017, 17:58)  Всем привет. Начал тут осваивать симулятор Riviera-PRO и наткнулся на довольно нелепую проблему: Имеется модуль, в котором имеется присваивание сигналу в разных местах:
....... initial begin reset = 1'b1; end ....... always_ff @(posedge clk200) begin : sync_reset_reg reset <= ~lockpll; end .......
Казалось бы - бред, не может сигналу присваивать значение в параллельных процессах, НО. Стандарту это не противоречит, поэтому ModelSim/QuestaSim разрешает данную конструкцию, а синтезатор, например Quartusа, тупо не обратит на блок initial внимание, так как это не синтезируемая конструкция.
А вот при запуске компиляции данного модуля Riviera выдает ошибку: ALOG: Error: VCP2675 C:/aldec/Riviera-PRO-2013.10/Projects/.../mymodule.v : (48, 1): Cannot write to a variable 'reset' that is also driven by an always_comb/always_latch/always_ff procedural block.
Наверное существует некая опция команды alog, о которой я не знаю?
P.S. Блок initial я используя в симуляции, для избежания в начальный момент времени неопределенного состояния сигнала Х, так как это в некоторых случаях чревато... Присваивайте начальное значение reset при объявлении, например: Код logic reset = 1'b1;
|
|
|
|
|
Apr 3 2017, 15:04
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-08-08
Из: Томск
Пользователь №: 39 559

|
Цитата(Fitc @ Mar 30 2017, 22:21)  Присваивайте начальное значение reset при объявлении, например: Код logic reset = 1'b1; Это все понятно, но дайте все-таки разобраться. Если брать в расчет, что Ривьера просто до попы придирчивая к стандарту и блюдет всё и вся, и что не допускает любой конфликт параллельных процессов (даже не синтезируемых), то почему данный код Ривьера компилит без проблем: module test (input clk); reg data; initial begin data = 1; end always @ (posedge clk) data <= !data; endmodule Судя по всему дело именно в том что используется конструкция always против always_ff. Вероятно СВ более досконально блюдёт код. А Ментор со своим МоделСимом просто поклал на это...
|
|
|
|
|
Apr 3 2017, 15:19
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-08-08
Из: Томск
Пользователь №: 39 559

|
Цитата(RobFPGA @ Apr 3 2017, 19:04)  Приветствую!
Видно потому что тут просто always.
Скорее всего для always с модификатором _ff _comb _latch идет внутрення оптимизация которая не позволяет делать параллельное присвоение в другом блоке. Ну или в стандарте прямо это запрещено для данных типов always.
Удачи! Rob. Вероятно да, Но! Непонятный мне момент, если я, например моделирую считаемую CRC и мне необходимо смоделировать ошибку CRC, то есть искусственно в какой-то момент времени подсунуть левые данные с высоты тестбенча, в результате которых сумма получится неверная. Значит при использовании always с суффиксом _ff у меня это не выйдет...
|
|
|
|
|
Apr 3 2017, 15:38
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-08-08
Из: Томск
Пользователь №: 39 559

|
Цитата(RobFPGA @ Apr 3 2017, 19:26)  Приветствую!
Ну если хочется "по насильничать" над бедной переменной то думаю что в этом случае можно использовать force
Удачи! Rob. module test (input clk); reg data; initial begin force data = 1; end always_ff @ (posedge clk) data <= !data; endmodule Так тоже не проканало...
|
|
|
|
|
Apr 4 2017, 06:21
|
Гуру
     
Группа: Свой
Сообщений: 4 247
Регистрация: 17-02-06
Пользователь №: 14 454

|
В стандарте систем верилог предписывается тулзам проверять что под always_ff чисто регистровые схемы, все потенциальные латчи и комбинаторика должны пресекаться. Этим похоже ваш инструмент и занят. Я думаю что если вы в initial сделаете неблокирующее присвоение вашему симулятору сильно полегчает  , попробуйте. initial begin reset <= 1'b0; end ну и опять же если это реальная схема, то у нее должен быть сброс, который задаст ей начальное значение, либо схема инициализации. Если это симуляция, то зачем вам в ней always блок? Код initial begin fork begin reset = 1'b1; #100; forever begin @(posedge clk); reset = ~pll_lock end end join end если вам нужна симуляция сбоя схемы, то эти воздействия через форс должны быть уровнем выше в тест бенче, с доступом по иерархии
|
|
|
|
|
Apr 4 2017, 20:27
|
Частый гость
 
Группа: Свой
Сообщений: 80
Регистрация: 21-10-11
Пользователь №: 67 894

|
Цитата(dde29 @ Apr 3 2017, 18:38)  Так тоже не проканало... Подраздел 9.2.2.4 стандарта 1800-2009 Цитата ... Variables on the left-hand side of assignments within an always_ff procedure, including variables from the contents of a called function, shall not be written to by any other process. ... Подраздел 9.2.2.2.2 стандарта 1800-2009, третий пункт маркированного списка: Цитата ... Variables on the left-hand side of assignments within an always_comb procedure, including vari- ables from the contents of a called function, shall not be written to by any other processes, whereas always @* permits multiple processes to write to the same variable. ... В modelsim/questasim вносить неисправности можно через графический итерфейс в окне objects/local - неявно выполняются tcl-скрипты, включающие команды типа force. Можно явно вызывать данные команды через собственные tcl-скрипты. Думаю, также неисправности можно вносить с помощью PLI.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|