Vivado 中 Verilog與VHDL模組相連

當要在Verilog中instantiate一個VHDL模組時,需要考慮Mixed Language Boundary以及Mapping Rules,簡單來說就是兩者間的介面,以及port之間的對接。

port對接可以透過port connect by ordering list 或是 port connect by name方式對接。 然而必須注意只有VHDL基礎的type才可以當成對接介面,這些type包含:

也就是說自己定義的enum type是不支援的。關於細節部份可以參考Mixed Language Boundary and Mapping Rules

然而如果你需要支援這些自己定義的type而不想修改VHDL module設計(也許你在做測試,不能更改design under test的內容)。這時你可以考慮多一層VHDL module當wrapper,將你自己的type map到這些基本的type。例如:

port map(
    ...
    vhdl_enum_type => enum_type'val(to_integer(unsigned(original_verilog_vector)));
    ...
)
Signal enum_type_var: ENUM_TYPE;
Signal enum_type_intVal: Integer;
Signal enum_type_vector: std_logic_vector(VEC_WIDTH-1 downto 0); -- to verilog vector port
...
begin
    enum_type_intVal <= ENUM_TYPE'POS(enum_type_var);
    enum_type_vector <= std_logic_vector(to_unsigned(enum_type_intVal,VEC_WIDTH));
...

以上我日前遇到忽然需要VHDL測試所需要的案例。

comments powered by Disqus