dde29 0 29 марта, 2017 Опубликовано 29 марта, 2017 · Жалоба Всем привет. Начал тут осваивать симулятор 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 я используя в симуляции, для избежания в начальный момент времени неопределенного состояния сигнала Х, так как это в некоторых случаях чревато... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fitc 0 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба Всем привет. Начал тут осваивать симулятор 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Присваивайте начальное значение 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. Вероятно СВ более досконально блюдёт код. А Ментор со своим МоделСимом просто поклал на это... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Приветствую! Видно потому что тут просто always. Скорее всего для always с модификатором _ff _comb _latch идет внутрення оптимизация которая не позволяет делать параллельное присвоение в другом блоке. Ну или в стандарте прямо это запрещено для данных типов always. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Приветствую! Видно потому что тут просто always. Скорее всего для always с модификатором _ff _comb _latch идет внутрення оптимизация которая не позволяет делать параллельное присвоение в другом блоке. Ну или в стандарте прямо это запрещено для данных типов always. Удачи! Rob. Вероятно да, Но! Непонятный мне момент, если я, например моделирую считаемую CRC и мне необходимо смоделировать ошибку CRC, то есть искусственно в какой-то момент времени подсунуть левые данные с высоты тестбенча, в результате которых сумма получится неверная. Значит при использовании always с суффиксом _ff у меня это не выйдет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Приветствую! Ну если хочется "по насильничать" над бедной переменной то думаю что в этом случае можно использовать force Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Приветствую! Ну если хочется "по насильничать" над бедной переменной то думаю что в этом случае можно использовать force Удачи! Rob. module test (input clk); reg data; initial begin force data = 1; end always_ff @ (posedge clk) data <= !data; endmodule Так тоже не проканало... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 3 апреля, 2017 Опубликовано 3 апреля, 2017 · Жалоба Приветствую! Странно! Увы, Rivera у меня нет. Но в Queste исходный Ваш вариант дает ту же ошибку которую легким движением suppress можно превратить в warning Вариант с force вообще ни каких ошибок не дает. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 4 апреля, 2017 Опубликовано 4 апреля, 2017 · Жалоба В стандарте систем верилог предписывается тулзам проверять что под 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 если вам нужна симуляция сбоя схемы, то эти воздействия через форс должны быть уровнем выше в тест бенче, с доступом по иерархии Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fitc 0 4 апреля, 2017 Опубликовано 4 апреля, 2017 · Жалоба Так тоже не проканало... Подраздел 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться