Многоразовый способ назначить двунаправленную запись другому - PullRequest
0 голосов
/ 29 мая 2020

Я использую UVVM AXI-Stream VV C. Он определяет интерфейс AxiStream как тип записи, сокращенный в этом вопросе для краткости.

Итак, учитывая этот тип записи, которая содержит сигналы, идущие в обоих направлениях

  type t_axistream_if is record
    tdata  : std_logic_vector;  -- Going in
    tvalid : std_logic;         -- Going in
    tready : std_logic;         -- Going out
  end record;

, мне нужен метод многократного использования, который может переупорядочивать байты в tdata и соединять два экземпляра этого записывать друг друга.

Это функциональность, которую я ищу. Функционален следующий VHDL:

   -- dutInput and axisMasterIf are constrained instances of the record.
   dutInput.tData      <= reverseBytes(axisMasterIf.tData);
   dutInput.tValid     <= axisMasterIf.tValid;
   axisMasterIf.tReady <= dutInput.tReady;

Мне нужно что-то вроде этого (потому что запись намного больше):

   dutInput            <= reverse(axisMasterIf);
   axisMasterIf.tReady <= dutInput.tReady; 
   -- or using a procedure
   -- reverse(axisMasterIf, dutInput)

При использовании процедур это не похоже на сигналы назначаются непрерывно. При использовании функций мне сложно не назначать dutInput.tReady.

Вот несколько неработающих попыток:

   -- If I set outIf <= reverse(inIf) this function will drive the
   -- TReady-signal and I will get U due to multiple drivers.
   -- When I  set TReady as open, it just doesn't compile. 
   function reverse(inIf : t_axistream_if) return t_axistream_if is
   begin
      return (
         tData  => reverseBytes(inIf.tData),
         tValid => inIf.tValid,
         tReady => open -- This doesn't compile.
      );
   end function;


   -- This compiles, but the signals don't seem to become continually assigned when the procedure is called from within a process.
   procedure reverse(
      signal inIf  : inout t_axistream_if;
      signal outIf : inout t_axistream_if
   ) is
   begin
      outIf.tData  <= reverseBytes(inIf.tData);
      outIf.tValid <= inIf.tValid;

      inIf.tReady <= outIf.tReady;
   end procedure;

Код не должен быть синтезируемым. Я использую VHDL2008.

1 Ответ

0 голосов
/ 29 мая 2020

В отношении этого блока:

   -- This compiles, but the signals don't seem to become continually assigned when the procedure is called from within a process.
   procedure reverse(
      signal inIf  : inout t_axistream_if;
      signal outIf : inout t_axistream_if
   ) is
   begin
      outIf.tData  <= reverseBytes(inIf.tData);
      outIf.tValid <= inIf.tValid;

      inIf.tReady <= outIf.tReady;
   end procedure;

... конкретно:

... но сигналы не кажутся постоянно назначаемыми , когда процедура вызывается изнутри процесса

Все назначения в (синхронизированном) процессе превращаются в триггеры. Использование вашей процедуры reverse в процессе изменит синхронизацию сигналов, добавив дополнительный тактовый цикл задержки. Это ожидаемое поведение.

Однако, скорее всего, это не то, что вам нужно. Вы захотите использовать эту процедуру вне любого процесса, чтобы обеспечить ее безотлагательную передачу.

...