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包含:
- bit
- std_ulogic
- std_logic
- bit_vector
- std_ulogic_vector
- std_logic_vector (對應到verilog vector)
也就是說自己定義的enum type是不支援的。關於細節部份可以參考Mixed Language Boundary and Mapping Rules。
然而如果你需要支援這些自己定義的type而不想修改VHDL module設計(也許你在做測試,不能更改design under test的內容)。這時你可以考慮多一層VHDL module當wrapper,將你自己的type map到這些基本的type。例如:
- 把verilog vector 轉成VHDL enum type
port map(
...
vhdl_enum_type => enum_type'val(to_integer(unsigned(original_verilog_vector)));
...
)
- 把VHDL enum type 轉成 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測試所需要的案例。