2017-06-26 4 views
2

Ich versuche, ein SystemVerilog-Modul zu erstellen, das ich mit einer VHDL-Zeichenfolge verbinden konnte. Ich kann jedoch einen entsprechenden Typ in SystemVerilog nicht finden. Die Verwendung des Typs "string" führt zu einem Fehler bei der Verarbeitung in Questa.Welches SystemVerilog-Konstrukt entspricht der VHDL-Zeichenfolge?

VHDL-Code:

library IEEE; 
use IEEE.std_logic_1164.all; 

entity tb_serdes_support is  
end entity; 

architecture beh of tb_serdes_support is  
    component serdes_support is port ( 
     cmd   : in string  
    ); 
    end component; 

    signal cmd : string(1 to 100); 

begin  
    i_srds_support: serdes_support port map (
     cmd   => cmd  
    ); 

    process 
    begin  
     cmd(1 to 12) <= "hello world!";  
     wait for 10 ns;  
     cmd(1 to 18) <= "hello world again!";  
     wait;  
    end process;  

end architecture; 

SV-Code:

module serdes_support (cmd); 

import uvm_pkg::*; 

input string cmd; 

always_comb begin  
    $display(cmd);  
end 

endmodule 

Edit: Fehlermeldung (Questa):

** Error: (vsim-3059) Cannot connect a VHDL array signal to Verilog scalar port 'cmd'.

Antwort

1

Sie können die VHDL-Zeichenfolge in einem geeigneten "Bit-Vektor" konvertieren und diesen "Bit-Vektor" in der Verilog-Umgebung verwenden. In Verilog können Sie es dann interpretieren, aber Sie möchten z. mit% s.

mov_vhd.vhd:

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 
USE ieee.numeric_std.ALL; 

ENTITY mod_vhd IS 
    PORT 
     (
      clk : IN std_ulogic; 
      str_out : OUT string 
     ); 
END ENTITY mod_vhd; 

ARCHITECTURE sim OF mod_vhd IS 

BEGIN 

    clock_out_string: PROCESS IS 


    BEGIN 
     FOR i IN 0 TO 9 loop 
      WAIT UNTIL rising_edge(clk); 
      str_out <= "Hallo "&integer'IMAGE(i); 
     END LOOP; 

    END PROCESS clock_out_string; 

END ARCHITECTURE sim; 

mod_ver.sv:

module mod_ver (
    input [79:0] my_string 
); 

initial begin 
    forever @my_string 
     $display ("see %s",my_string); 
end 


endmodule // mod_ver 

top_vhd.vhd

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 
USE ieee.numeric_std.ALL; 

ENTITY top_vhd IS 
END ENTITY top_vhd; 

ARCHITECTURE sim OF top_vhd IS 

SIGNAL clk: std_ulogic := '0'; 
SIGNAL str_out : string (1 TO 10); 
SIGNAL str_out_ver : std_logic_vector (79 DOWNTO 0); 

BEGIN 

    clk <= NOT clk AFTER 10 ns; 

    mod_vhd_i: ENTITY work.mod_vhd 
     PORT MAP (
      clk  => clk, 
      str_out => str_out 
     ); 

    gen_vec: for i in str_out'range generate 
     str_out_ver((11-i)*8-1 downto (11-i)*8-8) <= std_logic_vector(to_unsigned(character'pos(str_out(i)), 8)); 
    end generate;  

    mod_ver_i: ENTITY work.mod_ver 
     PORT MAP (
      my_string => str_out_ver 
     ); 


END ARCHITECTURE sim; 
3

A string in VHDL ist feste Größe Array, während in SystemVerilog, es ist ein singulärer Typ mit einer variablen Größe. Möglicherweise müssen Sie die VHDL-Zeichenfolge in Systemverilog in ein Bytearray konvertieren.

+0

Ich wollte Sie gerade in einer Antwort von [hier] zu zitieren (https://verificationacademy.com/forums/systemverilog/passing-string-sv-systemc-port). ;) – JHBonarius

Verwandte Themen