Код
reg_array: for reg_index in 31 downto 0 generate
constant data_lo : natural := reg_index * 32;
constant data_hi : natural := reg_index * 32 + 31;
begin
reg: component dffn
generic map (
n => 32
)
port map (
clk => clk,
en => '1',
rst => rst,
d => reg_in(data_hi downto data_lo),
q => reg_out(data_hi downto data_lo)
);
end generate reg_array;
constant data_lo : natural := reg_index * 32;
constant data_hi : natural := reg_index * 32 + 31;
begin
reg: component dffn
generic map (
n => 32
)
port map (
clk => clk,
en => '1',
rst => rst,
d => reg_in(data_hi downto data_lo),
q => reg_out(data_hi downto data_lo)
);
end generate reg_array;
КОмпилится нормально, да и логически ясно массив из 32 регистров размером 32 бит каждый. А вот во время запуска симуляции вот что выдает:
# ** Fatal: (vsim-3471) Slice range (1023 downto 992) does not belong to the prefix index range (31 downto 0).
есть идеи какие?
да у меня reg_in/reg_out 32 бит.....
Ладно тогда такой вопрос: как видите там я использую операцию умножения, однако над константами и внутри оператора генерирования логики... так вот оптимайзер это как воспримет? Я думаю ето должно сгенерировать комбинированную логику, а не действительную операцию Умножения?
Проще говоря, на чипе ето будет уже реализовано в виде фиксированной логики (так как если бы я все ети регистры вручную в коде прописывал пронумеровывая) ?