Vivado Simulation не может поддерживать неограниченные типы, имеющие подписанный компонент.
т.е.
type A is array (natural range <>) of signed;
Я использовал это в проекте, где тип A используется в объявлениях портов, так как я хотел бы иметь параллельный дизайн, которым я управляю через общий, а также длину слова текущего этапа, например,
port (
inputdata : A(0 to number_of_parallel_generic-1)(stage_wordlength_generic-1 downto 0)
);
Поскольку я использую тип A со многими вариантами управляющих ими дженериков, например 4 широких массива с 16 длинами слов и другими вариациями (часто контролируются с помощью цикла for)
for i in 0 to length_of_generate_statement-1 generate
signal example_signal : A(0 to 3)(stage_wordlength_generic + i - 1 downto 0);
begin
<functional code>
end generate;
Этот вид кода позволил бы мне получить дополнительный рост от последовательных разделов моей архетектуры - например, из дополнения.
Теперь ... приступим к вопросу.
Одним из способов, которым я мог бы обойти это, вместо того, чтобы инициировать сигнал с постоянно изменяющимся оператором генерирования, могло бы быть на самом деле создание "массива типов".
Дайте мне ваши глаза, это написано не совсем VHDL-образом, но, надеюсь, вы сможете увидеть, что я пытаюсь сделать.
type my_arr_of_types is array(0 to length_of_array-1) of type;
for i in 0 to length_of_array-1 generate
my_arr_of_types(i) <= <type declaration with some dependance on i>;
end generate;
Надеюсь, вы увидите, что я пытаюсь сделать.
Это позволит вам затем вызвать элемент my_arr_of_types, который сам по себе является типом, который затем назначается сигналу / переменной.
т.е.
сигнал my_sig: my_arr_of_types (n);
* Где n - любой допустимый индекс массива.
Очевидно, что это не разрешено в VHDL или любом другом инструменте моделирования. Но кто-нибудь может увидеть потенциальное решение моей проблемы?
Помните, я использую большинство этих типов в операторах портов, поэтому любое решение должно соответствовать ограничениям объявлений портов.