Simulando un banco de pruebas simple con un núcleo ROM sintetizado

9

Soy completamente nuevo en el mundo de los FPGA y pensé que comenzaría con un proyecto muy simple: un decodificador de 4 bits y 7 segmentos. La primera versión que escribí puramente en VHDL (es básicamente una combinación combinatoria select, no se necesitan relojes) y parece funcionar, pero también me gustaría experimentar con los "núcleos IP" en el Xilinx ISE.

Así que por ahora estoy usando la GUI "ISE Project Explorer", y creé un nuevo proyecto con un núcleo ROM. El código VHDL generado es:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
-- synthesis translate_off
LIBRARY XilinxCoreLib;
-- synthesis translate_on
ENTITY SSROM IS
  PORT (
    clka : IN STD_LOGIC;
    addra : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    douta : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)
  );
END SSROM;

ARCHITECTURE SSROM_a OF SSROM IS
-- synthesis translate_off
COMPONENT wrapped_SSROM
  PORT (
    clka : IN STD_LOGIC;
    addra : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    douta : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)
  );
END COMPONENT;

-- Configuration specification
  FOR ALL : wrapped_SSROM USE ENTITY XilinxCoreLib.blk_mem_gen_v7_2(behavioral)
    GENERIC MAP (
      c_addra_width => 4,
      c_addrb_width => 4,
      c_algorithm => 1,
      c_axi_id_width => 4,
      c_axi_slave_type => 0,
      c_axi_type => 1,
      c_byte_size => 9,
      c_common_clk => 0,
      c_default_data => "0",
      c_disable_warn_bhv_coll => 0,
      c_disable_warn_bhv_range => 0,
      c_enable_32bit_address => 0,
      c_family => "spartan3",
      c_has_axi_id => 0,
      c_has_ena => 0,
      c_has_enb => 0,
      c_has_injecterr => 0,
      c_has_mem_output_regs_a => 0,
      c_has_mem_output_regs_b => 0,
      c_has_mux_output_regs_a => 0,
      c_has_mux_output_regs_b => 0,
      c_has_regcea => 0,
      c_has_regceb => 0,
      c_has_rsta => 0,
      c_has_rstb => 0,
      c_has_softecc_input_regs_a => 0,
      c_has_softecc_output_regs_b => 0,
      c_init_file_name => "SSROM.mif",
      c_inita_val => "0",
      c_initb_val => "0",
      c_interface_type => 0,
      c_load_init_file => 1,
      c_mem_type => 3,
      c_mux_pipeline_stages => 0,
      c_prim_type => 1,
      c_read_depth_a => 16,
      c_read_depth_b => 16,
      c_read_width_a => 7,
      c_read_width_b => 7,
      c_rst_priority_a => "CE",
      c_rst_priority_b => "CE",
      c_rst_type => "SYNC",
      c_rstram_a => 0,
      c_rstram_b => 0,
      c_sim_collision_check => "ALL",
      c_use_byte_wea => 0,
      c_use_byte_web => 0,
      c_use_default_data => 0,
      c_use_ecc => 0,
      c_use_softecc => 0,
      c_wea_width => 1,
      c_web_width => 1,
      c_write_depth_a => 16,
      c_write_depth_b => 16,
      c_write_mode_a => "WRITE_FIRST",
      c_write_mode_b => "WRITE_FIRST",
      c_write_width_a => 7,
      c_write_width_b => 7,
      c_xdevicefamily => "spartan3e"
    );
-- synthesis translate_on
BEGIN
-- synthesis translate_off
U0 : wrapped_SSROM
  PORT MAP (
    clka => clka,
    addra => addra,
    douta => douta
  );
-- synthesis translate_on

END SSROM_a;

Se inicializa con estos contenidos:

memory_initialization_radix=2;
memory_initialization_vector=
0000001,
1001111,
0010010,
0000110,
1001100,
0100100,
0100000,
0001111,
0000000,
0000100,
0001000,
1100000,
0110001,
1000010,
0110000,
0111000,

Tiene tres pines: clka, addray douta. También generé un banco de pruebas con la GUI, luego lo edité ligeramente para que cambie la entrada después de 100 ns:

   uut: SSROM PORT MAP (
          clka => clk,
          addra => addra,
          douta => douta
        );

   -- Clock process definitions
   clka_process :process
   begin
        clk <= '0';
        wait for clk_period/2;
        clk <= '1';
        wait for clk_period/2;
   end process;


   -- Stimulus process
   stim_proc: process
   begin        
      -- hold reset state for 100 ns.
      wait for 100 ns;  

      addra <= "0101";
      wait for 100 ns;

      wait;
   end process;

Pero cuando ejecuto la simulación, el valor de la doutaseñal siempre está indefinido:

Resultado de simulacion

¿Lo que da?

Cactus
fuente
Necesitamos el código SSROM para ayudarlo.
Brian Carlton
¿Qué archivo es ese? El .xco?
Cactus
1
El .v o .vhd. .xco no es legible para humanos.
Brian Carlton
1
¿Seguro que compiló la biblioteca para su simulador? Si no recuerdo mal, Xilinx proporciona una herramienta cli 'xcomp' para eso. Compruebe si su ROM no está consolidado en la salida del simulador, después de todo, CoreGen simplemente proporciona un conjunto de parámetros para una biblioteca, no un núcleo real que puede ser simulado ...
BennyBarns
1
Parece que el código que ha publicado debería funcionar, aunque no puedo probarlo porque rara vez uso Xilinx (las herramientas IMO Xilinx son malas, las evito). Es mucho mejor y más portátil inferir una ROM, en lugar de usar una macro. Simplemente defina una matriz de std_logic_vectors para que sea una constante. (es decir, una matriz de bits bidimensional) que sugerirá una ROM para cualquier herramienta de síntesis y simulación decente.
Jason Morgan

Respuestas:

1

Debe observar las señales dentro del módulo SSROM utilizando la herramienta de simulación. A veces, mirar las entradas dentro de la instancia puede ayudar a iluminar dónde se encuentra el problema. Tal vez una señal que creías que estaba conectada en realidad no lo es.

Otra cosa para investigar es su archivo .mif. Xilinx utiliza un archivo .mif en simulaciones para inicializar los contenidos de la memoria para la simulación. Si accidentalmente movió o eliminó el archivo .mif, verá resultados como este.

usuario19460
fuente