AnatolySh 0 6 июня, 2022 Опубликовано 6 июня, 2022 · Жалоба Всем добра. Уверен, что давно уже обсуждено много раз, но снова прошу меня направить в нужное русло. Вспоминаю, что при моделировании (и, возможно, не только) необходимо принудительно устанавливать все триггеры проекта в заранее определённое состояние. Берём модуль на VHDL library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity n_f0 is Port ( clk : in std_logic; n : in integer range 0 to 2 ** 24 - 1; clk_out : out std_logic ); end n_f0; architecture Behavioral of n_f0 is signal count : unsigned (23 downto 0) := (others => '0'); signal c_out : std_logic := '0'; begin report_proc: process begin report "Invoked n_f0.vhd"; wait; end process report_proc; clk_proc : process (clk) begin if rising_edge(clk) then count <= count + to_unsigned(n,24); c_out <= count(23); clk_out <= '1' when count(23) = '1' and c_out = '0' else '0'; end if; end process clk_proc; end Behavioral; и его реинкарнацию на Verilog module n_f0 ( input clk, // input clk input [23 : 0] n, // divider output reg clk_out // output ); initial $display("Invoked n_f0.v"); reg [23 : 0] count_v; reg c_out_v; wire count_v_msb; assign count_v_msb = count_v [23]; always @ ( posedge clk ) begin count_v <= count_v + n; c_out_v <= count_v_msb; clk_out <= count_v_msb && !c_out_v; end endmodule С testnbench module n_f0_tb; logic clk; logic [23 : 0] n; wire clk_out; n_f0 n_f0_inst ( .clk ( clk ), .n ( n ), .clk_out ( clk_out ) ); initial $display("Invoked n_f0_tb.sv"); initial n = 2 ** 22; initial begin clk = 1'b0; forever # 8ns clk = ~clk; // 125MHz end endmodule : n_f0_tb Моделирование VHDL варианта даёт Т.е. всё работает (clk_out), а, вот, verilog вариант молчит. Уверен на 100%, что дело в сбросе, но почему, скажите, VHDL вариант катит? Установки симулятора, стандарт или что-то иное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 6 июня, 2022 Опубликовано 6 июня, 2022 · Жалоба 37 minutes ago, AnatolySh said: signal count : unsigned (23 downto 0) := (others => '0'); signal c_out : std_logic := '0'; и его реинкарнацию на Verilog reg [23 : 0] count_v; reg c_out_v; молчит. Уверен на 100%, что дело в сбросе, но почему, скажите, VHDL вариант катит? что-то иное? ну как бы не вооруженным глазом видно что код не эквивалентный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnatolySh 0 6 июня, 2022 Опубликовано 6 июня, 2022 · Жалоба 26 minutes ago, des00 said: ну как бы не вооруженным глазом видно что код не эквивалентный Да, спасибо: reg [23 : 0] count_v = 0; reg c_out_v = 0; привело в соответствие. Откуда тогда я мог помнить о необходимости сброса всего и вся в начале работы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 6 июня, 2022 Опубликовано 6 июня, 2022 · Жалоба 3 minutes ago, AnatolySh said: Откуда тогда я мог помнить о необходимости сброса всего и вся в начале работы? да кто его знает, для моделирования своя кучка тонкостей, для ртл кода своя. по ртл Кен Чапмен в свое время хорошо написал статью Get Smart About Reset: Think Local, Not Global Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 6 июня, 2022 Опубликовано 6 июня, 2022 · Жалоба 3 часа назад, AnatolySh сказал: Да, спасибо: reg [23 : 0] count_v = 0; reg c_out_v = 0; привело в соответствие. Откуда тогда я мог помнить о необходимости сброса всего и вся в начале работы? Можно найти документ, что без ресета триггеру не жить. По мне, так этим надо пользоваться аккуратно. Если только синтезатор поддерживает начальную инициализацию регистра. И это обычно прописывается в документации. Если FPGA (xilinx, altera) на базе статической ячейки памяти. Так и внутренний сброс по включению питания можно организовать. Тогда ваша времянка моделирования будет соответствовать реальной. А если структура флешь. Не будет соответствия. так что состояние 'x - это благо. 7 минут назад, sazh сказал: По мне, так этим надо пользоваться аккуратно. Если только синтезатор поддерживает начальную инициализацию регистра. И это обычно прописывается в документации. Если FPGA (xilinx, altera) на базе статической ячейки памяти. Так и внутренний сброс по включению питания можно организовать. Тогда ваша времянка моделирования будет соответствовать реальной. А если структура флешь. Не будет соответствия. так что состояние 'x - это благо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slkhome 0 7 июня, 2022 Опубликовано 7 июня, 2022 · Жалоба рекомендую всегда заводить сброс. Хоть синхронный хоть асинхронный. Это часто дает более ожидаемый результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться