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

Gowin Gw2AR-18 проблема с таймингами

Добрый вечер.

Собираю проект на GW2AR-18.

Проект занимает около 40 % ресурса по лутам.

Один UART, двухклоковое fifo, просто fifo, ШИМы, парсер команд с UART. Таблицы в Ромах и два канала АЦП SPI.

Клок проекта 125МГц.

Вот вижу, что иногда, крайне редко, дизайн собирается с вымолненными констрейнтами, но в основном нет. Причем разбежка по ошибке частоты от 10 до 25 МГц.

Кручу все, что можно в настройках сборки. Не помогает. 

Может кто знает, как с этим бороться ?

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


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

57 minutes ago, vorrom said:

Может кто знает, как с этим бороться ?

Регистры ставить на выходе модулей. И PnR_mode=2.

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


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

Спасибо, помогло. Регистры это правильный путь, но не единственный. А вот pnr помог соаершенно точно

Возникла еше проблема с памятью при синтезе.

Описал обычно на vhdl как массив типа  std_logic_vector.

В процессе под клоком условие записи и безусловное под клоком чтение.

Xilinx эту же конструкцию синтезирует и все работает, а вот gowin фиг вам. 

Причем интересная штука - если не делать запись, то работает как пзу с изначально заданными данными правильно, но следует только сделать в память запись - на выходе вне зависимости от адреса нули мертво стоят.

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


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

6 hours ago, vorrom said:

В процессе под клоком условие записи и безусловное под клоком чтение.

Шины адреса для чтения и записи разные?

 

reg signed [17:0] DATA [0:127]/* synthesis syn_ramstyle = "no_rw_check,block_ram" */;

поиграйтесь с галкой no_rw_check в настройках проекта.

6 hours ago, vorrom said:

Регистры это правильный путь, но не единственный.

Прикол в том, что Gowin похоже оптимизирует по модулям. И просто регистры между модулями - хуже, чем регистры в конце модуля (или в начале).

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


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

 Память описана так:

LIBRARY IEEE;
LIBRARY WORK;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL; 
use ieee.numeric_std.all;
USE work.ALL;

ENTITY ROM_TIMP_BLOCK IS    
PORT (    
       CLK               :  IN  STD_LOGIC;
       RST               :  IN  STD_LOGIC; 
       -------------------------------------------------------
       ROM_WR             :  IN  STD_LOGIC; 
       ROM_WR_DATA         :  IN  STD_LOGIC_VECTOR(11 DOWNTO 0);
       -------------------------------------------------------
       ROM_RD_ADDR         :  IN  STD_LOGIC_VECTOR(11 DOWNTO 0);
       ROM_RD_DATA         :  OUT STD_LOGIC_VECTOR(11 DOWNTO 0)
     );
END ROM_TIMP_BLOCK;

ARCHITECTURE ROM_TIMP_BLOCK_ARCH OF ROM_TIMP_BLOCK IS      


type ram_type is array (4095 downto 0) of std_logic_vector(11 downto 0); -- synthesis syn_ramstyle = "no_rw_check,block_ram" --;
signal RAM : ram_type := (
X"000",
X"000",

.....

 

 

X"190",
X"190",
X"190"
);


SIGNAL ROM_RD_DATA_INT                  :  STD_LOGIC_VECTOR(11 DOWNTO 0);-- := (OTHERS => '0');
SIGNAL ROM_ADDR_INT                        :  STD_LOGIC_VECTOR(11 DOWNTO 0) := (OTHERS => '0');
SIGNAL ROM_RD_DATA_INT_FF               :  STD_LOGIC_VECTOR(11 DOWNTO 0) := (OTHERS => '0');


BEGIN       
    
ROM_RD_DATA <= ROM_RD_DATA_INT_FF;    
    
ROM_WR_PROCESS:PROCESS(CLK)
BEGIN
    IF CLK = '1' AND CLK'EVENT THEN
       IF ROM_WR = '1' THEN     
          ------------------------------------------------------- 
          IF ROM_ADDR_INT = X"FFF" THEN
             ROM_ADDR_INT <= (OTHERS => '0');
          ELSE
             ROM_ADDR_INT <= ROM_ADDR_INT + 1;   
          END IF;      
          -------------------------------------------------------
          RAM(to_integer(unsigned(ROM_ADDR_INT))) <= ROM_WR_DATA;
          -------------------------------------------------------
       END IF;
    END IF;    
END PROCESS ROM_WR_PROCESS;    


ROM_RD_DATA_INT <= RAM(to_integer(unsigned(ROM_RD_ADDR)));

ROM_RD_PROCESS:PROCESS(CLK)
BEGIN
    IF CLK = '1' AND CLK'EVENT THEN
      ROM_RD_DATA_INT_FF <= ROM_RD_DATA_INT;
    END IF;    
END PROCESS ROM_RD_PROCESS;    

 

 

Добавление этой строки  -- synthesis syn_ramstyle = "no_rw_check,block_ram" -- 

 не помогло

А вот если снять галочку Ram R/W Check в опциях синтеза - все работает как задумано.

Что эта галочка означает ?

Большое вам спасибо.

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


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

В 12.09.2024 в 09:09, vorrom сказал:

 Что эта галочка означает ?

Цитата из Gowin Software User Guide SUG100-4.1.1E, 08/09/2024:

Цитата

Ram R/W Check: If there is a read or write conflict in RAM, check this
option and bypass logic will be inserted around RAM to prevent
simulation mismatches. If this option is disabled, bypass logic will not
be generated, unchecked by default.

 

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


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

А что физически означает из написанного в мануале ?

Какую логику они формируют ?

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


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

 Еще есть вопрос, как моделировать на Aldec  gowin ip ядра и библиотечные примитивы ?

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


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

В 12.09.2024 в 11:29, vorrom сказал:

 Еще есть вопрос, как моделировать на Aldec  gowin ip ядра и библиотечные примитивы ?

Надо исходники симуляционных библиотек Gowin скомпилироовать под Aldec (что у Вас там - ActiveHDL или Riviera).

Ищите их в папке ..\Ide\simlib

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


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

5 hours ago, vorrom said:

Добавление этой строки  -- synthesis syn_ramstyle = "no_rw_check,block_ram" -- 

Так пишут в Верилоге. В VHDL должно быть через attribute. Смотрите в мануале не синтезатор.

И вставляйте код через специальный блок, для этого предназначенный.

 

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


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

55 minutes ago, andrew_b said:

Так пишут в Верилоге. В VHDL должно быть через attribute. Смотрите в мануале не синтезатор.

На самом деле автору нужно было отключить no_rw_check, что он и сделал в среде разработки. Поэтому биться над добавлением этой строки именно в таком виде - не стоит.

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


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

Внесу ложку дегтя.

Похоже, что и с галочкой в настройках синтеза не помогает.

При переразводке опять сломалось.

Видимо, придется ставить компонент памяти и делать на нем.

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


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

5 hours ago, vorrom said:

Похоже, что и с галочкой в настройках синтеза не помогает.

Значит проект криво написан.

 

5 hours ago, vorrom said:

Видимо, придется ставить компонент памяти и делать на нем.

На текущий момент компоненты памяти и умножители от GoWin не дают никакого преимущества по скорости относительно описания на верилоге.

работоспособность в ПЛИС полностью совпадает с моделированием.

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


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

9 hours ago, _4afc_ said:

Значит проект криво написан.

 

На текущий момент компоненты памяти и умножители от GoWin не дают никакого преимущества по скорости относительно описания на верилоге.

работоспособность в ПЛИС полностью совпадает с моделированием.

Проет написан правильно, Xilinx все правильно разводит.

Как описана память я здесь изложил. Проблема только в этом модуле памяти.

Описание на компонентах не даст возможности погулять софту в интерпретации как

отсинтезировать этот блок памяти, на мой взгляд.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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