1 Отредактировано nice.vladi (2018-01-30 11:49:34)

Тема: Не задействован порт модуля

Добрый день!

Создал простой проект. Иерархия проекта:

top.sv -> cnt.sv

Частота раздается с PLL с внешнего источника.

Во время компиляции получаю сообщение:

CL159 <..путь..\cnt.sv> | input iclk is unused.

Модуль cnt.v:

module cnt
#(
     parameter pINT = 32'd20000
)
(
  input iclk ,
  output ostrb
)

reg [31:0] cnt_int;
reg           int;

always@(posedge iclk) begin
  if (int)                      cnt_int <= '0;
  else if (~(&cnt_int))  cnt_int <= cnt_int + 1'b1;

  int <= cnt_int == pINT;
end

assign ostrb = int;

endmodule

Этот модуль подключен в топе. В топе же крутится похожий счетчик. Оба счетчика работают на одной и той же частоте (из PLL). Со счетчиком в топе - все в порядке. Модуль же cnt.sv отказывается функционировать.

Вопрос: как же заставить порт iclk быть "used"?

Спасибо!


Upd: Методом тыка выяснил, что компилятору не нравится условие (~(&cnt_int)) в счетчике.
Теперь очень интересно, почему?

2 Отредактировано Squanchy (2018-01-30 12:35:13)

Re: Не задействован порт модуля

У Вас 32битное число складывается с 1битным:
cnt_int <= cnt_int + 1'b1;
Могу предположить, что он суммирует только нулевой бит, понимает что переполнения счётчика не возникает, второе условие никогда не сработает и собственно выкидывает из синтезации этот процесс как бесполезный.

Плюс на первом такте неопределённость значения int и cnt_int. Задайте дефолные значения регистров.

3

Re: Не задействован порт модуля

Squanchy пишет:

У Вас 32битное число складывается с 1битным...

Разрядность инкремента роли не играет (главное, что бы число в нее влазило).

Squanchy пишет:

Плюс на первом такте неопределённость значения int и cnt_int. Задайте дефолные значения регистров.

Может быть, но после первой, ошибочной, итерации счетчика он должен выйти в нормальный режим.

Как написал вышел, почему-то неверно интерпретировалось условие (~(&cnt_int)). Считать "до конца". Т.е., пока все разряды не заполнятся 1.

4

Re: Не задействован порт модуля

Отдельно блок синтезируется? Схему, которую синтезатор строит, смотрели?
В вебпаке xilinxовом проверил, всё синтезируется корректно. Возможно особенности конкретного синтезатора. Как вариант - поиграться с операторами, возможно какие-то из них средой не поддерживаются.
Ну и я бы всё-таки причесал код. Убрал разрядность инкремента,раз она всё равно некорректная, verilog допускает не указывать её в константах. Задал дефолтные значения. Ключевое слово в качестве имени регистра тоже может ему мозги сломать, попробуйте переименовать.

5 Отредактировано Dmitriy0111 (2018-03-11 09:09:37)

Re: Не задействован порт модуля

Можно поподробнее о модуле, зачем он вообще нужен и что должен делать, ибо по описанию не совсем понимаю зачем столько всего много описано в нём. И как я заметил, когда создавал проекты для smartfusion2, желательно делать у всех модулей вход reset и писать initial блоки. Иначе модуль может не совсем адекватно работать. Плюс может попробовать промоделировать работу самого модуля отдельно от всей системы и тогда будет ясно, что не так с этим модулем.

6

Re: Не задействован порт модуля

nice.vladi пишет:

Добрый день!

Создал простой проект. Иерархия проекта:

top.sv -> cnt.sv

Частота раздается с PLL с внешнего источника.

Во время компиляции получаю сообщение:

CL159 <..путь..\cnt.sv> | input iclk is unused.

Модуль cnt.v:

module cnt
#(
     parameter pINT = 32'd20000
)
(
  input iclk ,
  output ostrb
)

reg [31:0] cnt_int;
reg           int;

always@(posedge iclk) begin
  if (int)                      cnt_int <= '0;
  else if (~(&cnt_int))  cnt_int <= cnt_int + 1'b1;

  int <= cnt_int == pINT;
end

assign ostrb = int;

endmodule

Этот модуль подключен в топе. В топе же крутится похожий счетчик. Оба счетчика работают на одной и той же частоте (из PLL). Со счетчиком в топе - все в порядке. Модуль же cnt.sv отказывается функционировать.

Вопрос: как же заставить порт iclk быть "used"?

Спасибо!


Upd: Методом тыка выяснил, что компилятору не нравится условие (~(&cnt_int)) в счетчике.
Теперь очень интересно, почему?


Может проблемы с верхним уровнем? Кусок кода модуля top.sv выложите, пожалуйста.

7

Re: Не задействован порт модуля

Dmitriy0111 пишет:

Можно поподробнее о модуле, зачем он вообще нужен и что должен делать, ибо по описанию не совсем понимаю зачем столько всего много описано в нём. И как я заметил, когда создавал проекты для smartfusion2, желательно делать у всех модулей вход reset и писать initial блоки. Иначе модуль может не совсем адекватно работать. Плюс может попробовать промоделировать работу самого модуля отдельно от всей системы и тогда будет ясно, что не так с этим модулем.

Это очень глупый модуль, который просто генерирует строб раз в Н тактов.

Про initial и reset я понял, учел.

Моделирование показало корректную работу модуля.