Question #1: are the following two variants equivalent with respect to the signal c?
Variant 1:
signal a : unsigned(31 downto 0);
signal b : unsigned(31 downto 0);
signal c : unsigned(63 downto 0);
process(slow_clk) is
begin
if (rising_edge(slow_clk)) then
c <= a * b;
end if;
end process;
Variant 2:
signal a : unsigned(31 downto 0);
signal b : unsigned(31 downto 0);
signal c_async : unsigned(63 downto 0);
signal c : unsigned(63 downto 0);
c_async <= a * b;
process(slow_clk) is
begin
if (rising_edge(slow_clk)) then
c <= c_async;
end if;
end process;
Question #2: Let's say a is 0, b is 0 and c is also 0.
Then a becomes 0x55555555, and b becomes 0xAAAAAAAA.
c is still 0 but it is about to become 0x38E38E3871C71C72.
Does c suddenly changes value from 0 to 0x38E38E3871C71C72? Or do some bits get set earlier and some later?
Suppose there is another process that working on a faster clock and it's sampling c. I need to know that this process can sample only definite multiplication results, not some junk.