VHDL: falla la comprobación de metastabilidad para el tiempo de espera

2

Estoy tratando de modelar un SN74HC573 pestillo tipo D en VHDL para volver en ello. Esto es lo que obtuve hasta ahora:

-- simple model of a SN74AHC573 D-type Transparent Latch
library ieee;
use ieee.std_logic_1164.all;

-- entity declaration
entity sn74ahc573 is
    port ( oe_n, le : in std_logic;     -- control signals
           d : in std_logic;            -- data input
           q : out std_logic );         -- data output

    -- TODO: add detailed timing constants
    constant t_pd   : delay_length := 9 ns;     -- Propagation delay
    constant t_w    : delay_length := 5 ns;     -- Pulse duration, LE high
    constant t_su   : delay_length := 3.5 ns;   -- Setup time, data before LE falling edge
    constant t_h    : delay_length := 1.5 ns;   -- Hold time, data after LE falling edge
end entity sn74ahc573;

-- rtl architecture to check metastability
architecture rtl of sn74ahc573 is
    signal intern : std_logic := 'X';
begin

    -- concurrent replacement of behavioral process
    -- TODO: replace with state machine for more precise propagation delays
    intern <= 'Z' when oe_n = '1' else              -- high-impedance state
               d  when oe_n = '0' and le = '1' else -- latch input
               unaffected;                          -- else, nothing happens

    -- check metastability of latch enable signal
    checkMetaStability : process is
    begin
        -- wait for LE falling edge
        wait until falling_edge(le);

        --check pulse width
        assert le'delayed'stable(t_w)
            report "LE pulse width too short!"
            severity failure;

        -- check setup time
        assert intern'delayed'stable(t_su)
            report "Input changed during setup time!"
            severity failure;

        -- check hold time
        wait for t_h;
        assert intern'delayed'stable(t_h + t_su)
            report "Input signal changed during hold time!"
            severity failure;

    end process checkMetaStability;

    -- update output
    q <= intern;

end architecture rtl;

Tengo problemas con el proceso de comprobación de la metastabilidad. La verificación del ancho de pulso y el tiempo de configuración funciona, pero la verificación del tiempo de espera fallará:

-- Test Bench for SN74AHC573 model
library ieee;
use ieee.std_logic_1164.all;

-- entity declaration
entity sn74ahc573_tb is
end entity sn74ahc573_tb;

-- test bench architecture
architecture test_bench of sn74ahc573_tb is
    signal oe_n, le, d, q : std_logic := '0';
begin

    dut : entity work.sn74ahc573(rtl)
        port map ( oe_n, le, d, q );

    stimulus : process is
    begin
        -- start in high-Z mode
        oe_n <= '1'; wait for 10 ns;

        -- WARNING: These signal changes violate metastability
        oe_n <= '0'; le <= '1'; d <= '1'; wait for 4 ns;
            -- violate minimal pulse width
        -- le <= '0'; wait for 1 ns;
            -- violate setup time
        -- d <= '0';  wait for 1 ns;
        -- le <= '0'; wait for 1 ns;
            -- violate hold time
         wait for 1 ns; le <= '0';
         wait for 1 ns; d <= '0';

        -- wait forever
        wait;

    end process stimulus;

end architecture test_bench;

Este banco de pruebas "fallará" para el ancho de pulso y el tiempo de configuración, pero no al verificar el tiempo de espera. ¿Qué me estoy perdiendo?

Estoy usando GHDL 0.36-dev en Arch Linux.

    
pregunta georgjz

2 respuestas

2

Estoy respondiendo porque no puedo comentar.

Ha desactivado le antes de cambiar la entrada d en su banco de pruebas.

En el DUT, sin embargo,

intern <= 'Z' when oe_n = '1' else              -- high-impedance state
           d  when oe_n = '0' and le = '1' else -- latch input
           unaffected;                          -- else, nothing happens

Como intern es unaffected cuando le se desactiva y oe_n se afirma ( 0 ), contiene el valor anterior de d (en este caso% código%). Cuando verifique el tiempo de espera, no importa cuánto tiempo espere, la afirmación no fallará.

    -- check hold time
    wait for t_h;
    assert intern'delayed'stable(t_h + t_su)

Este cambio en testbench (similar a lo que has hecho por la violación de la configuración) debería resolver el problema. Al deshabilitar 1 después de que la entrada le cambie, la verificación d debería fallar.

stimulus : process is
begin
    -- start in high-Z mode
    oe_n <= '1'; wait for 10 ns;

    -- WARNING: These signal changes violate metastability
    oe_n <= '0'; le <= '1'; d <= '1'; wait for 4 ns;

    -- violate setup time
    -- d <= '0';  wait for 1 ns;
    -- le <= '0'; wait for 1 ns;

    -- violate hold time
     d <= '0';
     wait for 1 ns; le <= '0';

    -- wait forever
    wait;

end process stimulus;
    
respondido por el Vinay Madapura
0

Gracias a la respuesta de Vinay Madapura , encontré el error. He modificado mis asignaciones de señal a esto:

-- latch the input according to LE state
intern <= d when le = '1' else
          unaffected;

-- update output
q <= intern when oe_n = '0' else
     'Z';

Esto refleja el comportamiento general mejor que mi código anterior. La entrada ahora está correctamente bloqueada en intern independientemente del estado de oe_n .

    
respondido por el georgjz

Lea otras preguntas en las etiquetas