Я использую 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.