реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Компиляция в Riviera-PRO, Ошибка при компиляции модуля
dde29
сообщение Mar 29 2017, 14:58
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 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 я используя в симуляции, для избежания в начальный момент времени неопределенного состояния сигнала Х, так как это в некоторых случаях чревато...
Go to the top of the page
 
+Quote Post
Fitc
сообщение Mar 30 2017, 18:21
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 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;

Go to the top of the page
 
+Quote Post
dde29
сообщение Apr 3 2017, 15:04
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 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. Вероятно СВ более досконально блюдёт код.
А Ментор со своим МоделСимом просто поклал на это...
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Apr 3 2017, 15:04
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 914
Регистрация: 23-12-04
Пользователь №: 1 643



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

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

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

Удачи! Rob.

Go to the top of the page
 
+Quote Post
dde29
сообщение Apr 3 2017, 15:19
Сообщение #5


Участник
*

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



Цитата(RobFPGA @ Apr 3 2017, 19:04) *
Приветствую!

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

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

Удачи! Rob.


Вероятно да, Но!
Непонятный мне момент, если я, например моделирую считаемую CRC и мне необходимо смоделировать ошибку CRC, то есть искусственно в какой-то момент времени
подсунуть левые данные с высоты тестбенча, в результате которых сумма получится неверная. Значит при использовании always с суффиксом _ff у меня это не выйдет...
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Apr 3 2017, 15:26
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 914
Регистрация: 23-12-04
Пользователь №: 1 643



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

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

Удачи! Rob.
Go to the top of the page
 
+Quote Post
dde29
сообщение Apr 3 2017, 15:38
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 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

Так тоже не проканало...
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Apr 3 2017, 16:03
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 914
Регистрация: 23-12-04
Пользователь №: 1 643



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

Странно! Увы, Rivera у меня нет.
Но в Queste исходный Ваш вариант дает ту же ошибку которую легким движением suppress можно превратить в warning
Вариант с force вообще ни каких ошибок не дает.

Удачи! Rob.




Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 4 2017, 06:21
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 210
Регистрация: 17-02-06
Пользователь №: 14 454



В стандарте систем верилог предписывается тулзам проверять что под always_ff чисто регистровые схемы, все потенциальные латчи и комбинаторика должны пресекаться. Этим похоже ваш инструмент и занят.

Я думаю что если вы в initial сделаете неблокирующее присвоение вашему симулятору сильно полегчаетsm.gif, попробуйте.

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



если вам нужна симуляция сбоя схемы, то эти воздействия через форс должны быть уровнем выше в тест бенче, с доступом по иерархии
Go to the top of the page
 
+Quote Post
Fitc
сообщение Apr 4 2017, 20:27
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th September 2017 - 21:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01653 секунд с 7
ELECTRONIX ©2004-2016