Jump to content
    

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

57 minutes ago, vorrom said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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 похоже оптимизирует по модулям. И просто регистры между модулями - хуже, чем регистры в конце модуля (или в начале).

Share this post


Link to post
Share on other sites

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

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 в опциях синтеза - все работает как задумано.

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

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

Share this post


Link to post
Share on other sites

В 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.

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

5 hours ago, vorrom said:

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

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

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

 

Share this post


Link to post
Share on other sites

55 minutes ago, andrew_b said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

5 hours ago, vorrom said:

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

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

 

5 hours ago, vorrom said:

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

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

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

Share this post


Link to post
Share on other sites

9 hours ago, _4afc_ said:

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

 

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...