У меня есть фрагмент кода, который объединяет два вектора переменной длины и XOR-результат с другим вектором фиксированной длины. Переменная длина связанных векторов не влияет на общую длину результата конкатенации. Вот соответствующий код
-- Find the number of bits to be skipped.
-- This is done for better optimization of hardware.
bits2MSB := 15 - findHighestIndex(m_xorResult);
-- If there are sufficient number of remaining bits in the extended data
-- Then we can continue the XOR operation
if(bits2MSB < remainingXorCount) then
m_xorResult <= (m_xorResult((15 - bits2MSB - 1) downto 0) & m_dataExtended(remainingXorCount downto (remainingXorCount - bits2MSB))) xor STD_LOGIC_VECTOR(to_unsigned(polynom, 16));
remainingXorCount := remainingXorCount - bits2MSB - 1; -- Decrease remainingXorCount
-- If the remaining bit count of the extended data is equal to the number of bits to be skipped until the first HIGH bit
-- Then the last XOR operation for given data can be made.
elsif(bits2MSB = remainingXorCount) then
m_xorResult <= (m_xorResult((14 - remainingXorCount) downto 0) & m_dataExtended(remainingXorCount downto 0)) xor STD_LOGIC_VECTOR(to_unsigned(polynom, 16));
remainingXorCount := remainingXorCount - bits2MSB;
state <= FINISH;
-- If the remaining bits are not sufficient for a new XOR operation
-- Then the result is equal to the extended version of the last XOR result.
else
m_xorResult <= (m_xorResult((14 - remainingXorCount) downto 0) & m_dataExtended(remainingXorCount downto 0));
remainingXorCount := 0; -- Decrease remainingXorCount
state <= FINISH;
end if;
Сообщение об ошибке указывает на строку под оператором if. В нем говорится, что
[Synth 8-509] операнды логического оператора '^' имеют разную длину (40 против 16)
Объявление связанных векторов имеет вид следующие
variable bits2MSB : integer range 0 to 8 := 0;
variable remainingXorCount : integer range 0 to 7 := 7;
signal m_xorResult : STD_LOGIC_VECTOR(15 downto 0);
signal m_dataExtended : STD_LOGIC_VECTOR(23 downto 0);
variable polynom : natural := 16#1021#;
В дополнение к этому функция findHighestIndex (...) может возвращать целочисленное значение в диапазоне от 7 до 15.
Тестовая среда для данного модуля работает без каких-либо проблем. , Я проверил это для любого данного входа в модуль. Каким-то образом Вивадо говорит, что в некоторых условиях я могу создать вектор длиной 40 бит и попытаться выполнить XOR с вектором длиной 16 бит. Как вы думаете, в чем проблема?