Beby 5 22 апреля Опубликовано 22 апреля · Жалоба 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) я отмечаю существенные сдвиги в лучшую сторону. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cdg 4 24 апреля Опубликовано 24 апреля · Жалоба Еще одна особенность новой среды в 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 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 5 24 апреля Опубликовано 24 апреля · Жалоба 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 на такие проблемы ни разу не наступал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 5 24 апреля Опубликовано 24 апреля · Жалоба 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 Названия конкретных файлов и номера строчек заменены на ***. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cdg 4 24 апреля Опубликовано 24 апреля · Жалоба 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" похоже надо ждать обновления. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 5 24 апреля Опубликовано 24 апреля · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cdg 4 26 апреля Опубликовано 26 апреля · Жалоба On 4/24/2024 at 3:34 PM, Beby said: И обе эти Beta'ы необходимо включать соседними опциями в опциях Compile. Замечу, что в случае SV включение беты не избавляет от слета ситемы и похоже вообще никак не влияет, с включенной и выключенной опцией поведение компилятора не меняется. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 26 апреля Опубликовано 26 апреля · Жалоба В 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 на такие проблемы ни разу не наступал. А если написать в соответствии со стандартом языка ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 5 27 апреля Опубликовано 27 апреля · Жалоба 22 hours ago, Flip-fl0p said: А если написать в соответствии со стандартом языка ? Да я бы и не против (а может и всячески 'за'), но что-то не могу сообразить, о чём идёт речь. Поэтому, если хотите получить ответ (или результат проведённого мною эксперимента), то: - либо приведите (ссылку/текст) фрагмента стандарта, который мною приведённая запись нарушает; - либо сам вариант записи конструкции (cnMux_W - generic positive, Sel - std_logic_vector). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 27 апреля Опубликовано 27 апреля · Жалоба 17 минут назад, Beby сказал: Да я бы и не против (а может и всячески 'за'), но что-то не могу сообразить, о чём идёт речь. Поэтому, если хотите получить ответ (или результат проведённого мною эксперимента), то: - либо приведите (ссылку/текст) фрагмента стандарта, который мною приведённая запись нарушает; - либо сам вариант записи конструкции (cnMux_W - generic positive, Sel - std_logic_vector). Стандартом VHDL функция conv_integer не определена, как и операция умножения для типа std_logic_vector Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 27 апреля Опубликовано 27 апреля · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 5 27 апреля Опубликовано 27 апреля · Жалоба 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 27 апреля Опубликовано 27 апреля · Жалоба 42 minutes ago, Beby said: 1. conv_integer - IEEE.std_logic_unsigned, std_logic - живёт в соседнем IEEE.std_logic_1164 std_logic_unsigned к IEEE отношения не имеет, это проприетарный пакет, см. копирайты в нём. То, что он живёт в IEEE, так исторически сложилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 27 апреля Опубликовано 27 апреля · Жалоба 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; такую конструкцию имели ввиду Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 5 27 апреля Опубликовано 27 апреля · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться