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

Проблемы поддержки VHDL/Verilog в PangoMicro PDS

On 4/19/2024 at 8:19 PM, makc said:

Отличная новость. Есть какие-нибудь подводные камни на этом пути?

1. Главной проблемой была некорректная работа Hierarchy Updater’а: пока он не может корректно построить дерево проекта в тех местах, где в VHDL используются внешние модули (Verilog / IP-Core), но об этом я уже писал.
2. Для некоторых может быть непривычно и неочевидно, что (в строгом соответствии с VHDL’93) при использовании entity из библиотеки Work, необходимо указывать:
library work;
use work.all;

3. Несколько напрягает, что все справочные материалы на китайском.
4. Немного изменилась работа с атрибутами: для VHDL необходимо использовать Syn_* атрибуты (на 2023.1 достаточно было использовать PAP_* атрибуты – тогда было меньше warning/info о преобразовании Syn_* атрибутов в PAP_*). С другой стороны в ADS_Synthesis_User_Guide.pdf добавлено очень подробное описание правил применения Syn_* атрибутов с примерами на каждый случай.

Но главной проблемой был п.1, т.к. приводил к падению Compile с «internal error» без объяснения причин падения.

Отмечу, что Pango Micro старается сделать PDS/ADS лучше, с каждым шагом (2022.2-SP4->2023.1->2023.2-SP1) я отмечаю существенные сдвиги в лучшую сторону.

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


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

Еще одна особенность новой среды в SV:

logic [10:0] cntr1;
   
localparam x1_Width = $clog2($size(cntr1)+5); //!!!crash!!!

Вложенность системных тасков вызывает коллапс синтезатора PDS. Решение вполне очевидно:

  logic [10:0] cntr1;

  localparam 
    tmp = $size(cntr1), 
    x_Width = $clog2(tmp+5);//work

 

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


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

On 4/19/2024 at 8:19 PM, makc said:

Отличная новость. Есть какие-нибудь подводные камни на этом пути?

  Забыл, есть ещё одна грабля при описании мультиплексора для ADS от PDS 2023.2-SP1:
Вот так - можно:
Mux <= A( cnMux_W*conv_integer(Sel) + cnMux_W-1 downto cnMux_W*conv_integer(Sel) );

А вот так - нельзя (Error: The left bound of range is not a constant expression):
Mux <= A( cnMux_W*conv_integer(Sel+1)-1 downto cnMux_W*conv_integer(Sel) );

Но эта проблема была ещё в 2023.1 при синтезе Synplify, поэтому я не сразу вспомнил.
Как-то в ISE на такие проблемы ни разу не наступал.

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


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

On 4/19/2024 at 7:43 PM, Beby said:

* - есть ошибка при direct instantiation IP-Core (дочерние файлы IP-Core PDS не видит).

26 minutes ago, cdg said:
localparam x1_Width = $clog2($size(cntr1)+5); //!!!crash!!!

Обращаю внимание, что в обоих случаях Compile просто разваливается:
В Messages нет ни Error ни Critical Warnings.
А вот в конце Log выглядит как-то так:

Start rtl-elaborate.
I: Verilog-0003: [***.sv(line number: ***)] Elaborating module ***
Development error at line *** in E:\wf\2023.2\output_files\ads\FAB_Develop\branches\pds_2023.2\source\sw\ads\***.cpp

pds_shell crashes.

call stack dump:
00000001405e00c4
00000001405e067f
00000001405e05ab
00000001404d8039
000000014036e7cc
00000001403196f2
000000014031bdda
00000001402f164d
00000001402efe74
0000000140309aee
00000001403012a3
00000001402c0d65
0000000141c6bc89
00000001407754dd
00000001407a3de0
00000001401766d3
000000014017c754
000000014017c379
00007ffa83ca93f4
00007ffa83ca7b53
00007ffa83c80207
00007ffa83c802c9
00007ffa83c81ffe
00007ffa83ccb420
00007ffa83c7c28b
00007ffa83c7f23b
000000014017f166
000000014197f524
00007ffaff1081f4
00007ffb01b4a251
000000014017f060

Action compile: Real time elapsed is 0h:0m:4s
Action compile: CPU time elapsed is 0h:0m:1s
Action compile: Process CPU time elapsed is 0h:0m:1s
Action compile: Peak memory pool usage is 120 MB

Current time: Wed Apr 24 11:46:27 2024

Названия конкретных файлов и номера строчек заменены на ***.

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


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

53 minutes ago, cdg said:

Еще одна особенность новой среды в SV: ...

Похоже их там ворох, порожденных одной проблемой:

logic [1:0] ddd; 
localparam SZ = $size(ddd)+2;

так же как и в предыдущем случае ломает систему (обход в прочем тот же через промежуточный параметр только теперь с константой 🙁), похоже что реализация  системных тасков возвращает что то не то и модули защиты в CPP падают с резульатом "Development error at line 539 in E:\wf\2023.2\output_files\ads\FAB_Develop\branches\pds_2023.2\source\sw\ads\basic\LogicInt.cpp"  

похоже надо ждать обновления. 

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


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

22 hours ago, cdg said:

так же как и в предыдущем случае ломает систему (обход в прочем тот же через промежуточный параметр только теперь с константой 🙁), похоже что реализация  системных тасков возвращает что то не то и модули защиты в CPP падают с резульатом "Development error at line 539 in E:\wf\2023.2\output_files\ads\FAB_Develop\branches\pds_2023.2\source\sw\ads\basic\LogicInt.cpp"

  И вот что самое интересное, тот же самый ADS 2023.2-SP1 подобные конструкции в VHDL спокойно воспринимает:
constant cnO_W:   positive := Log2Roundup(A'Length);
signal     RAM_DO: std_logic_vector(RxC'Length+RxD'Length-1 downto 0);

Log2Roundup - User Function (прямой аналог $clog2)
'Length - VHDL predefined attribute (прямой аналог $size)

Отмечу, что вся поддержка VHDL - "Beta Feature for VHDL", равно как и поддержка Verilog $size - тоже Beta, но "Beta Feature for Vierilog".
И обе эти Beta'ы необходимо включать соседними опциями в опциях Compile.

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


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

On 4/24/2024 at 3:34 PM, Beby said:

И обе эти Beta'ы необходимо включать соседними опциями в опциях Compile.

Замечу, что в случае SV включение беты не избавляет от слета ситемы и похоже вообще никак не влияет, с включенной и выключенной опцией поведение компилятора не меняется.

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


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

В 24.04.2024 в 14:25, Beby сказал:

  Забыл, есть ещё одна грабля при описании мультиплексора для ADS от PDS 2023.2-SP1:
Вот так - можно:
Mux <= A( cnMux_W*conv_integer(Sel) + cnMux_W-1 downto cnMux_W*conv_integer(Sel) );

А вот так - нельзя (Error: The left bound of range is not a constant expression):
Mux <= A( cnMux_W*conv_integer(Sel+1)-1 downto cnMux_W*conv_integer(Sel) );

Но эта проблема была ещё в 2023.1 при синтезе Synplify, поэтому я не сразу вспомнил.
Как-то в ISE на такие проблемы ни разу не наступал.

А если написать в соответствии со стандартом языка ?

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


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

22 hours ago, Flip-fl0p said:

А если написать в соответствии со стандартом языка ?

  Да я бы и не против (а может и всячески 'за'), но что-то не могу сообразить, о чём идёт речь.
Поэтому, если хотите получить ответ (или результат проведённого мною эксперимента), то:
- либо приведите (ссылку/текст) фрагмента стандарта, который мною приведённая запись нарушает;
- либо сам вариант записи конструкции (cnMux_W - generic positive, Sel - std_logic_vector).

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


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

17 минут назад, Beby сказал:

  Да я бы и не против (а может и всячески 'за'), но что-то не могу сообразить, о чём идёт речь.
Поэтому, если хотите получить ответ (или результат проведённого мною эксперимента), то:
- либо приведите (ссылку/текст) фрагмента стандарта, который мною приведённая запись нарушает;
- либо сам вариант записи конструкции (cnMux_W - generic positive, Sel - std_logic_vector).

Стандартом VHDL функция conv_integer не определена, как и операция умножения для типа std_logic_vector

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


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

On 4/24/2024 at 2:25 PM, Beby said:

  Забыл, есть ещё одна грабля при описании мультиплексора для ADS от PDS 2023.2-SP1:
Вот так - можно:
Mux <= A( cnMux_W*conv_integer(Sel) + cnMux_W-1 downto cnMux_W*conv_integer(Sel) );

А вот так - нельзя (Error: The left bound of range is not a constant expression):
Mux <= A( cnMux_W*conv_integer(Sel+1)-1 downto cnMux_W*conv_integer(Sel) );

Но эта проблема была ещё в 2023.1 при синтезе Synplify, поэтому я не сразу вспомнил.
Как-то в ISE на такие проблемы ни разу не наступал.

я все время использую для описания мультиплексора (VHDL)

ptr_read_next <= ptr_read + 1 when rd_en_int = '1' else ptr_read;

или под клоком в процессе с помощью if else

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


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

3 minutes ago, Maverick_ said:

я все время использую для описания мультиплексора (VHDL)

ptr_read_next <= ptr_read + 1 when rd_en_int = '1' else ptr_read;

или под клоком в процессе с помощью if else

  Но это же - статика... с заранее предопределённым количеством состояний.
А мне нужна была полная динамика: A, Mux - параметризированы (Sel под них подстраивается).
Кстати, саму конструкцию я посмотрел где-то во времена ISE 10.1/11.1 (для Virtex-5) в исходниках (или библиотеках) Xilinx или даже в xst.pdf того времени - уже не помню.
При предопределённом варианте мультиплексора использую With-Select или When-When-Else (иногда Case, и если уж совсем припрёт if-elsif-else),.. и то, если не надо описывать много состояний или нет смысла конструкцию свернуть. Ключевым требованием в моём описании является минимизации возможностей посадить опечатку, вторичным - именование сигналов, которые переживут оптимизацию и будут доступны в FPGA Editor'е (куда как приятнее видеть подходящий к BRAM сигнал xx_LRAM_WE, чем net0078352).

 

19 minutes ago, Flip-fl0p said:

Стандартом VHDL функция conv_integer не определена, как и операция умножения для типа std_logic_vector

1. conv_integer - IEEE.std_logic_unsigned, std_logic - живёт в соседнем IEEE.std_logic_1164. Соответственно теперь даже мыслей нет, что могло подразумеваться под: "написать в соответствии со стандартом языка".
2. и что-то не могу понять, где я использовал "умножения для типа std_logic_vector" ?
- cnMux_W - generic positive,
- conv_integer - даёт integer,
- на всякий случай: signal Mux: std_logic_vector(cnMux_W-1 downto 0);

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


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

42 minutes ago, Beby said:

1. conv_integer - IEEE.std_logic_unsigned, std_logic - живёт в соседнем IEEE.std_logic_1164

std_logic_unsigned к IEEE отношения не имеет,  это проприетарный пакет, см. копирайты в нём. То, что он живёт в IEEE, так исторически сложилось.

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


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

1 hour ago, Beby said:

  Но это же - статика... с заранее предопределённым количеством состояний.
А мне нужна была полная динамика: A, Mux - параметризированы (Sel под них подстраивается).
Кстати, саму конструкцию я посмотрел где-то во времена ISE 10.1/11.1 (для Virtex-5) в исходниках (или библиотеках) Xilinx или даже в xst.pdf того времени - уже не помню.
При предопределённом варианте мультиплексора использую With-Select или When-When-Else (иногда Case, и если уж совсем припрёт if-elsif-else),.. и то, если не надо описывать много состояний или нет смысла конструкцию свернуть. Ключевым требованием в моём описании является минимизации возможностей посадить опечатку, вторичным - именование сигналов, которые переживут оптимизацию и будут доступны в FPGA Editor'е (куда как приятнее видеть подходящий к BRAM сигнал xx_LRAM_WE, чем net0078352).

 

1. conv_integer - IEEE.std_logic_unsigned, std_logic - живёт в соседнем IEEE.std_logic_1164. Соответственно теперь даже мыслей нет, что могло подразумеваться под: "написать в соответствии со стандартом языка".
2. и что-то не могу понять, где я использовал "умножения для типа std_logic_vector" ?
- cnMux_W - generic positive,
- conv_integer - даёт integer,
- на всякий случай: signal Mux: std_logic_vector(cnMux_W-1 downto 0);

возможно 

library ieee;
  use ieee.std_logic_1164.all;
  use ieee.numeric_std.all;

entity demux is 
	generic ( SEL_W		: natural := 4 );	
	
	port (
		-- inputs
		din: 		in std_logic;
		sel:		in std_logic_vector (SEL_W-1 downto 0);
		
		-- outputs
		data_out: 	out std_logic_vector (2**SEL_W-1 downto 0)
	);
end demux;

architecture rtl of demux is

begin 

	demux_pr: process(sel, din)
	begin
		-- set all the outputs to '0' to avoid inferred latches
		data_out <= (others => '0');
		-- Set input in correct line
		data_out(to_integer(unsigned(sel))) <= din;
	end process;

end rtl;

такую конструкцию имели ввиду

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


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

24 minutes ago, Maverick_ said:

возможно 

library ieee;
  use ieee.std_logic_1164.all;
  use ieee.numeric_std.all;

entity demux is 
	generic ( SEL_W		: natural := 4 );	
	
	port (
		-- inputs
		din: 		in std_logic;
		sel:		in std_logic_vector (SEL_W-1 downto 0);
		
		-- outputs
		data_out: 	out std_logic_vector (2**SEL_W-1 downto 0)
	);
end demux;

architecture rtl of demux is

begin 

	demux_pr: process(sel, din)
	begin
		-- set all the outputs to '0' to avoid inferred latches
		data_out <= (others => '0');
		-- Set input in correct line
		data_out(to_integer(unsigned(sel))) <= din;
	end process;

end rtl;

такую конструкцию имели ввиду

  Может быть,.. Если вопрос был в to_integer(unsigned(Sel)), то получаем такой результат:
Проглатывает:
Mux <= A( cnMux_W*(to_integer(unsigned(Sel))) + cnMux_W-1 downto cnMux_W*to_integer(unsigned(Sel)) );
Отрыгивает (Error: The left bound of range is not a constant expression) все 3 варианта:
Mux <= A( cnMux_W*(to_integer(unsigned(Sel+1)))-1 downto cnMux_W*to_integer(unsigned(Sel)) );
Mux <= A( cnMux_W*(to_integer(unsigned(Sel)+1))-1 downto cnMux_W*to_integer(unsigned(Sel)) );
Mux <= A( cnMux_W*(to_integer(unsigned(Sel))+1)-1 downto cnMux_W*to_integer(unsigned(Sel)) );

 

55 minutes ago, andrew_b said:

std_logic_unsigned к IEEE отношения не имеет,  это проприетарный пакет, см. копирайты в нём. То, что он живёт в IEEE, так исторически сложилось.

  Обязательно ещё раз гляну - с прошлого раза (лет 20 назад) запомнилось только, что оно не IEEE, теперь же гляну чьё именно.
И Xilinx, и Pango функцию 'conv_integer' просто принужнает исользовать: см. эталонные описния RAM в xst.pdf и ADS_Synthesis_User_Guide.pdf.

 

В итоге, я так и не понял, что подразумевалось под:

On 4/26/2024 at 12:11 PM, Flip-fl0p said:

А если написать в соответствии со стандартом языка ?

Будет пример такого описания - я его попробую и о результатах расскажу.
На взякий случай, постановка задачи такая:
1. из длинного A (std_logic_vector) выбирается кусок номер Sel (std_logic_vector) и выдаётся в Mux (std_logic_vector).
2. длины A, Mux и Sel - параметризированы так, что: A'Length = Mux'Length * (2**Sel'Length), Mux'Length = cnMux_W.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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