Перейти к содержанию
    

Компиляция в Riviera-PRO

Всем привет. Начал тут осваивать симулятор 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 я используя в симуляции, для избежания в начальный момент времени неопределенного состояния сигнала Х, так как это в некоторых случаях чревато...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет. Начал тут осваивать симулятор 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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присваивайте начальное значение 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. Вероятно СВ более досконально блюдёт код.

А Ментор со своим МоделСимом просто поклал на это...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Видно потому что тут просто always.

 

Скорее всего для always с модификатором _ff _comb _latch идет внутрення оптимизация которая не позволяет делать параллельное присвоение в другом блоке. Ну или в стандарте прямо это запрещено для данных типов always.

 

Удачи! Rob.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Видно потому что тут просто always.

 

Скорее всего для always с модификатором _ff _comb _latch идет внутрення оптимизация которая не позволяет делать параллельное присвоение в другом блоке. Ну или в стандарте прямо это запрещено для данных типов always.

 

Удачи! Rob.

 

Вероятно да, Но!

Непонятный мне момент, если я, например моделирую считаемую CRC и мне необходимо смоделировать ошибку CRC, то есть искусственно в какой-то момент времени

подсунуть левые данные с высоты тестбенча, в результате которых сумма получится неверная. Значит при использовании always с суффиксом _ff у меня это не выйдет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Ну если хочется "по насильничать" над бедной переменной то думаю что в этом случае можно использовать force

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Ну если хочется "по насильничать" над бедной переменной то думаю что в этом случае можно использовать force

 

Удачи! Rob.

 

module test (input clk);

 

reg data;

 

initial begin

force data = 1;

 

end

 

 

always_ff @ (posedge clk)

data <= !data;

 

endmodule

 

Так тоже не проканало...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Странно! Увы, Rivera у меня нет.

Но в Queste исходный Ваш вариант дает ту же ошибку которую легким движением suppress можно превратить в warning

Вариант с force вообще ни каких ошибок не дает.

 

Удачи! Rob.

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В стандарте систем верилог предписывается тулзам проверять что под 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

 

 

если вам нужна симуляция сбоя схемы, то эти воздействия через форс должны быть уровнем выше в тест бенче, с доступом по иерархии

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так тоже не проканало...

Подраздел 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...