Операнды VHDL имеют ошибку различной длины во время синтеза - PullRequest
0 голосов
/ 21 марта 2020

У меня есть фрагмент кода, который объединяет два вектора переменной длины и 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 бит. Как вы думаете, в чем проблема?

1 Ответ

1 голос
/ 21 марта 2020

Вместо объединения слов переменной ширины для создания слова фиксированной ширины вы можете ИЛИ два слова фиксированной ширины вместе, каждое с переменным количеством маскируемых битов.

В схеме вместо

X"AAAA"(15 downto var) & X"5555"(var-1 downto 0) XOR X"1234";

вычислить

((X"AAAA" AND upper_mask(var)) OR (X"5555" AND not upper_mask(var))) XOR X"1234";

Маски могут быть сгенерированы такими функциями, как:

function upper_mask(var : natural) return std_logic_vector is
   mask : std_logic_vector(15 downto 0) := (others => '1');
begin
   mask(var - 1 downto 0) := (others => '0');
   return mask;
end;

Если Vivado все еще не может синтезировать upper_mask, al oop по всем битам в upper_mask должно работать:

for i in mask'range loop
   if i < var then
      mask(i) := '0';
   end if;
end loop
...