Направление среза Verilog отличается от VHDL

У меня есть объект VHDL с несколькими неограниченными std_logic_vector портами, обернутый модулем verilog, который четко определяет ширину этих портов.

Обертка Verilog:

module conv_wrapper (din,dout,clk,ce);
input [7:0] din;
output [7:0] dout;
input clk;
input ce;
conv conv_inst (
.din(din),
.dout(dout),
.clk(clk),
.ce(ce));
endmodule

Модуль VHDL:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

entity conv is
    port(
        clk  : in  std_logic;
        ce   : in  std_logic;
        din  : in  std_logic_vector;
        dout : out std_logic_vector
    );
end entity conv;

architecture behavioural of conv is

    signal s_nosignbit : std_logic_vector(din'high - 1 downto din'low) := (others => '0');
    signal s_nosignbit_not : std_logic_vector(din'high - 1 downto din'low) := (others => '0');
    signal s_dout : std_logic_vector(din'range) := (others => '0');
    signal msb : std_logic := '0';

begin
    -- Assign the MSB
    msb <= din(din'high);
    -- Assign the rest of the bits excluding the MSB
    s_nosignbit <= din(din'high - 1 downto din'low);
     -- Perform bitwise NOT operation on s_nosignbit
    s_nosignbit_not <= not s_nosignbit;
    -- Concat
    s_dout <= msb & s_nosignbit_not;
    dout <= s_dout;
end architecture behavioural;

Модуль VHDL по сути просто преобразует число в дополнение до 2. Вероятно, есть более простые способы сделать это, но на самом деле дело не в этом.

Во время моделирования я получаю сообщение об ошибке: эта строка: s_nosignbit <= din(din'high - 1 downto din'low); неправильно присваивает значения, поскольку «направление среза отличается от диапазона типа индекса». Я часто использовал неограниченные порты в своих проектах и ​​никогда раньше такого не видел. Возможно, Vivado неправильно переводит 7:0 как 7 downto 0?

Использование Вивадо 2024.1

Спасибо всем.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот что следует иметь в виду:

  1. Для Verilog или наоборот не существует стандарта VHDL, поэтому каждый поставщик инструментов предоставляет разные возможности и ограничения.
  2. Из-за 1. типы, используемые на интерфейсе между доменами VHDL и Verilog, должны быть очень простыми, например, масштабаторы (1 бит) или массив/вектор (группа битов, рассматриваемых вместе). Никаких записей, структур, перечислений, массивов массивов и т. д.
  3. Далее 2. явно укажите размер портов, не полагайтесь на инструменты, определяющие размер портов на основе правил, которые работают на любом языке. Исходя из этого, я бы указал размер вектора как din : in std_logic_vector(7 downto 0); в объекте VHDL. Сделайте то же самое изменение для dout. Если вам нужна переносимость, используйте универсальный VHDL. Другой классический пример: в Verilog целые числа всегда имеют длину 32 бита; VHDL не будет знать этого.
  4. 3. То же изменение для оператора компонента, если необходимо.
  5. Упорядочите порты в одинаковом порядке в модуле-оболочке и экземпляре. Не рассчитывайте на способность языка правильно выполнять именованные ассоциации. Включите в это правило оператор компонента. Если вы используете дженерики VHDL, закажите дженерики карты портов так же, как и объект. То же самое с параметрами Verilog в экземпляре модуля.
  6. Здесь есть раздел о смешанной языковой поддержке Vivado Руководство по синтезу UG901

Общее правило смешивания VHDL и Verilog заключается в том, чтобы снизить ваши ожидания и не разочароваться, однако биты и битовые векторы должны вести себя так, как ожидалось. Просто указывайте размер вектора везде, где это возможно, в коде.

Спасибо, Майк. Жаль, я заметил, что указание размера вектора для din, как вы указали, устранило проблему, но я очень надеялся избежать этого. Я все равно добавлю это, так как моя проблема, похоже, не нашла решения в предоставленном вами документе Vivado.

Fo0ty 28.08.2024 12:32

Другие вопросы по теме