FPGA синтезирует ячейку стробирования часов в LUT, а не в LDCE + AND?

Я хочу синтезировать ячейку стробирования часов в коде Verilog следующим образом:

reg clk_en_i;
always @(clk_in or clk_en)begin
  if(!clk_in)
    clk_en_i <= clk_en;
end
assign clk_out= clk_in&clk_en_i;

но после синтеза FPGA функция стробирования не работает. Я просмотрел схему списка соединений от Vivado и обнаружил, что synplify синтезирует ячейку синхронизации часов в ячейку LUT6: LUT6

Это не глючная свободная ячейка! Вот почему функция не работает!

Я пытался прощупать внутренний сигнал с помощью Identification, но после синтеза FPGA функция работает правильно! И я снова посмотрел схему списка соединений: LDCE+AND

Один и тот же код Verilog дает разные результаты синтеза. Почему? Я уверен, что LUT6 является неправильным логическим результатом. Кто-нибудь может объяснить эту странную ситуацию?


person ysscotty    schedule 02.04.2018    source источник
comment
Что означает найденная система synplify?   -  person underscore_d    schedule 02.04.2018
comment
Для переключения без сбоев см. это: electronics.stackexchange.com/questions/352464/   -  person Oldfart    schedule 02.04.2018
comment
Мой инструмент синтеза - синопсис synplify   -  person ysscotty    schedule 02.04.2018


Ответы (1)


if(!clk_en)
  clk_en_i <= clk_en;

Это выглядит подозрительно. Вы обновляете clk_en_i, как только clk_en падает, независимо от состояния clk_in.

Возможно, вам следует изменить clk_en_i, когда clk_in низкий. Нравиться:

if(!clk_in)
  clk_en_i = clk_en;
person Vlad    schedule 02.04.2018
comment
Ой, извини! Ты прав! Мой оригинальный код Verilog, как вы говорите! - person ysscotty; 02.04.2018
comment
Спасибо за ваш комментарий! Я исправил свой код Verilog в своем посте. - person ysscotty; 02.04.2018