jenya7 0 7 апреля, 2021 Опубликовано 7 апреля, 2021 (изменено) · Жалоба у меня есть данные которые я хочу логировать для отладки L_ADC_VAL_3MS : out std_logic_vector(17 downto 0); L_ADC_VAL_6MS : out std_logic_vector(17 downto 0); L_ADC_VAL_9MS : out std_logic_vector(17 downto 0); L_ADC_VAL_12MS : out std_logic_vector(17 downto 0); R_ADC_VAL_3MS : out std_logic_vector(17 downto 0); R_ADC_VAL_6MS : out std_logic_vector(17 downto 0); R_ADC_VAL_9MS : out std_logic_vector(17 downto 0); R_ADC_VAL_12MS : out std_logic_vector(17 downto 0); L_DAC_VAL_1 : in std_logic_vector(15 downto 0); L_DAC_VAL_2 : in std_logic_vector(15 downto 0); L_DAC_VAL_3 : in std_logic_vector(15 downto 0); R_DAC_VAL_1 : in std_logic_vector(15 downto 0); R_DAC_VAL_2 : in std_logic_vector(15 downto 0); R_DAC_VAL_3 : in std_logic_vector(15 downto 0); но у меня 20 таких каналов. я подумал сделать так type TUBE_DATA is record L_ADC_VAL_3MS : std_logic_vector(17 downto 0); L_ADC_VAL_6MS : std_logic_vector(17 downto 0); L_ADC_VAL_9MS : std_logic_vector(17 downto 0); L_ADC_VAL_12MS : std_logic_vector(17 downto 0); R_ADC_VAL_3MS : std_logic_vector(17 downto 0); R_ADC_VAL_6MS : std_logic_vector(17 downto 0); R_ADC_VAL_9MS : std_logic_vector(17 downto 0); R_ADC_VAL_12MS : std_logic_vector(17 downto 0); L_DAC_VAL_1 : std_logic_vector(15 downto 0); L_DAC_VAL_2 : std_logic_vector(15 downto 0); L_DAC_VAL_3 : std_logic_vector(15 downto 0); R_DAC_VAL_1 : std_logic_vector(15 downto 0); R_DAC_VAL_2 : std_logic_vector(15 downto 0); R_DAC_VAL_3 : std_logic_vector(15 downto 0); end record TUBE_DATA; type array_tube_data is array (0 to 20) of TUBE_DATA; и потом по индексу логировать соответсвующий канал. так вообще можно делать? Изменено 7 апреля, 2021 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 7 апреля, 2021 Опубликовано 7 апреля, 2021 · Жалоба type array_tube_data is array (0 to 20) of TUBE_DATA; signal data : array_tube_data; data(0).L_ADC_VAL_3MS <= ...; ... <= data(20).R_DAC_VAL_3; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 апреля, 2021 Опубликовано 7 апреля, 2021 · Жалоба 2 hours ago, andrew_b said: type array_tube_data is array (0 to 20) of TUBE_DATA; signal data : array_tube_data; data(0).L_ADC_VAL_3MS <= ...; ... <= data(20).R_DAC_VAL_3; спасибо. а это вообще нормально работать с таким типом? или это только для тестбенч подходит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
quato_a 3 7 апреля, 2021 Опубликовано 7 апреля, 2021 · Жалоба 55 minutes ago, jenya7 said: спасибо. а это вообще нормально работать с таким типом? или это только для тестбенч подходит? record синтезируется. очень удобная вещь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 апреля, 2021 Опубликовано 7 апреля, 2021 · Жалоба 1 hour ago, quato_a said: record синтезируется. очень удобная вещь спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба SignalTap не видит мой log_data type array_prog_data is array (0 to 20) of PROG_DATA; signal log_data : array_prog_data; без этого теряется весь смысл логирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба Так он, наверное, сокращен при оптимизации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба Логи наверное пишутся и нигде не читаются. Оптимизатор их выкинул. Надо аттрибут поставить на них, чтобы не выкидывал. Я на все логи накладываю аттрибут. Тогда в сигналтапе потом глянуть можно reg log /*synthesis noprune*/; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 1 hour ago, new123 said: Логи наверное пишутся и нигде не читаются. Оптимизатор их выкинул. Надо аттрибут поставить на них, чтобы не выкидывал. process (CLK) variable l_idx : integer range 0 to 20 := 0; variable r_idx : integer range 0 to 20 := 0; variable l_num : std_logic_vector(4 downto 0); variable r_num : std_logic_vector(4 downto 0); begin if (rising_edge(CLK)) then case LoggerState is when ST_IDLE => if (trig_3 = '1') then LoggerState <= ST_LOG_1; new_log <= '0'; end if; when ST_LOG_1 => if (ms_counter >= X"32") then l_idx := to_integer(unsigned(PROGRAM(5 downto 1))); r_idx := to_integer(unsigned(PROGRAM(10 downto 6))); LoggerState <= ST_LOG_2; end if; when ST_LOG_2 => new_log <= '1'; if (l_idx > 0 and l_idx < 20) then log_data(l_idx).L_ADC_VAL_3MS <= L_ADC_VAL_3MS; log_data(l_idx).L_ADC_VAL_6MS <= L_ADC_VAL_6MS; log_data(l_idx).L_ADC_VAL_9MS <= L_ADC_VAL_9MS; log_data(l_idx).L_ADC_VAL_12MS <= L_ADC_VAL_12MS; log_data(l_idx).L_DAC_VAL_1 <= L_DAC_VAL_1; log_data(l_idx).L_DAC_VAL_2 <= L_DAC_VAL_2; log_data(l_idx).L_DAC_VAL_3 <= L_DAC_VAL_3; log_data(l_idx).L_TUBE_NUM <= t_num_l; end if; if (r_idx > 0 and r_idx < 20) then log_data(r_idx).R_ADC_VAL_3MS <= R_ADC_VAL_3MS; log_data(r_idx).R_ADC_VAL_6MS <= R_ADC_VAL_6MS; log_data(r_idx).R_ADC_VAL_9MS <= R_ADC_VAL_9MS; log_data(r_idx).R_ADC_VAL_12MS <= R_ADC_VAL_12MS; log_data(r_idx).R_DAC_VAL_1 <= R_DAC_VAL_1; log_data(r_idx).R_DAC_VAL_2 <= R_DAC_VAL_2; log_data(r_idx).R_DAC_VAL_3 <= R_DAC_VAL_3; log_data(r_idx).R_TUBE_NUM <= t_num_r; end if; LoggerState <= ST_IDLE; when others => LoggerState <= ST_IDLE; end case; end if; end process; вроде всё нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 2 минуты назад, jenya7 сказал: SignalTap не видит мой log_data Где вы его ищете? Ищите в SignalTap:Pre-synthesis. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 2 minutes ago, jenya7 said: вроде всё нормально. наверное нормаль ). Но вот вы логи записываете, а дальше ни в какой логике их не используете. Конечно оптимизатор это все выкинет. Я не сразу увидел, что у вас VHDL, вам нужно в таком стиле аттрибут наложить https://www.intel.com/content/www/us/en/programmable/quartushelp/17.0/hdl/vhdl/vhdl_file_dir_noprune.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 1 hour ago, andrew_b said: Где вы его ищете? Ищите в SignalTap:Pre-synthesis. так и выбираю - Pre-synthesis. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 1 hour ago, new123 said: наверное нормаль ). Но вот вы логи записываете, а дальше ни в какой логике их не используете. Конечно оптимизатор это все выкинет. Я не сразу увидел, что у вас VHDL, вам нужно в таком стиле аттрибут наложить https://www.intel.com/content/www/us/en/programmable/quartushelp/17.0/hdl/vhdl/vhdl_file_dir_noprune.htm да. работает! signal log_data : array_prog_data; attribute noprune: boolean; attribute noprune of log_data: signal is true; и я вижу все 20 каналов - log_data(0) - log_data(20). чтож я раньше так мучался :)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
quato_a 3 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 1 minute ago, jenya7 said: чтож я раньше так мучался :)) я бы еще кое-что полезное выделил в использовании record Допустим, есть очень далекий по иерархии вложенности модулей блочек test_module, который нужно конфигурировать (en, step, pause, threshold и т.п.). Если по старинке, то добавление каждого нового порта конфигурации в блок test_module приводит к добавлению этого порта во все промежуточные блоки по иерархии. А с использованием record и объявлении его в общем pkg на проект, промежуточные блоки дорабатывать не придется. Добавление нового сигнала в record произойдет автоматически во всех блоках. type cfg_t is record en : std_logic; step : std_logic; ... threshold : std_logic_vector(DW_BYTE - 1 downto 0); end record cfg_t; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 апреля, 2021 Опубликовано 8 апреля, 2021 · Жалоба 1 hour ago, quato_a said: я бы еще кое-что полезное выделил в использовании record Допустим, есть очень далекий по иерархии вложенности модулей блочек test_module, который нужно конфигурировать (en, step, pause, threshold и т.п.). Если по старинке, то добавление каждого нового порта конфигурации в блок test_module приводит к добавлению этого порта во все промежуточные блоки по иерархии. А с использованием record и объявлении его в общем pkg на проект, промежуточные блоки дорабатывать не придется. Добавление нового сигнала в record произойдет автоматически во всех блоках. спасибо. полезно знать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться