Error (suprimible): (vsim-3601) Límite de iteración Quartus

0

He creado una simulación de un registro de 4 bits en quartus. Cada una de las cuatro chancletas D prueba bien por sí mismas, pero cuando pruebo 4 de ellas conectadas juntas en un registro, obtengo el "Error (suprimible): (vsim-3601) Límite de iteración". Si afirmo primero la señal de borrado (clearNMar, active low), no recibo el error y todo funciona bien ... pero realmente no debería TENER que borrar el registro antes de usarlo. Debería estar "bien" para que esté indefinido hasta que las señales de entrada estén bloqueadas. A continuación se muestra el código ... Proporcionaré todos los componentes que he usado y su forma de onda que se acumula en el registro dentro de lo razonable. Solo puedo publicar 8 enlaces, por lo que no incluiré las formas de onda para las puertas básicas NOT, AND, NAND y OR. Definitivamente funcionan aunque:

Primero, aquí está mi 2 entrada Y puerta:

--2 Input And Gate
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY AND_2 IS PORT(
    In0, In1: IN STD_LOGIC;
    Out0: OUT STD_LOGIC);
END AND_2;

ARCHITECTURE Dataflow_AND_2 of AND_2 IS
BEGIN
    Out0<=In0 AND In1;
END Dataflow_AND_2;

El siguiente es el código para mi puerta NAND de 2 entradas:

--dataflow model of a 2 input nand gate

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY NAND_2 IS PORT(
    In0, In1: IN STD_LOGIC;
    Out0: OUT STD_LOGIC);

END NAND_2;


ARCHITECTURE Dataflow OF NAND_2 IS
BEGIN
    Out0<= In0 NAND In1;
END Dataflow;

El siguiente es mi código de puerta NAND de 3 entradas:

--dataflow model of a 3 input nand gate

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY NAND_3 IS PORT(
    In0, In1, In2: IN STD_LOGIC;
    Out0: OUT STD_LOGIC);

END NAND_3;


ARCHITECTURE Dataflow OF NAND_3 IS
BEGIN
    Out0<= (NOT(In0 NAND In1)) NAND In2;
END Dataflow;

El siguiente es el código para mi puerta NO:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY NOT_1 IS PORT(
    In0: IN STD_LOGIC;
    Out0: OUT STD_LOGIC);
END NOT_1;

ARCHITECTURE Dataflow_NOT_1 OF NOT_1 IS
BEGIN
    Out0<= NOT In0;
END Dataflow_NOT_1;

El siguiente es el código para mi entrada O puerta de entrada:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY OR_3 IS PORT(
    In0, In1, In2: IN STD_LOGIC;
    Out0: OUT STD_LOGIC);
END OR_3;

ARCHITECTURE Dataflow_OR_3 OF OR_3 IS
BEGIN
    Out0<= In0 OR In1 OR In2;
END Dataflow_OR_3;

El siguiente es mi multiplexor. A continuación se muestra un diagrama, el código y la simulación.  Pido disculpas por no haber podido averiguar cómo obtener las señales (N1, N2 ... etc) en la simulación:

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMUX_2_1ISPORT(D0,D1,S:INSTD_LOGIC;Y:OUTSTD_LOGIC);ENDMUX_2_1;ARCHITECTUREStructural_MUX_2_1OFMUX_2_1ISSIGNALN1,N2,N3,N4:STD_LOGIC;COMPONENTNOT_1PORT(In0:INSTD_LOGIC;Out0:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTAND_2PORT(In0,In1:INSTD_LOGIC;Out0:OUTSTD_LOGIC);ENDCOMPONENT;COMPONENTOR_3PORT(In0,In1,In2:INSTD_LOGIC;Out0:OUTSTD_LOGIC);ENDCOMPONENT;BEGINU1:NOT_1PORTMAP(S,N1);U2:AND_2PORTMAP(D0,N1,N2);U3:AND_2PORTMAP(S,D1,N3);U4:AND_2PORTMAP(D1,D0,N4);U5:OR_3PORTMAP(N2,N3,N4,Y);ENDStructural_MUX_2_1;

AquíestáelDiagrama,elCódigoylasimulacióndelflip-flopD,quefuncionabien,creo:

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;--ApositiveedgetriggeredDflipflopwithenableandclearfunctionality--D:Theinputbitthatistobepassed(latched)ontotheflipflop.--E:Theenablesignalthatusesthe"S" input of the multiplexer (MUX).
    --ClearN: The clear signal that sets the D flip flop to zero.  The "N" suffix means the signal is active low (0), 
        --and held high(1) under normal conditions.
    --clk: clock signal.
    --Q: The output value of the D flip flop

ENTITY D_FF_W_ENABLE_CLEAR IS PORT(
    D, E, ClearN, Clk: IN STD_LOGIC;
    Q: BUFFER STD_LOGIC);
END D_FF_W_ENABLE_CLEAR;

ARCHITECTURE Structural_D_FF_W_ENABLE_CLEAR OF D_FF_W_ENABLE_CLEAR IS
    SIGNAL N1, N2, N3, N4, N5, QN: STD_LOGIC;

    COMPONENT NAND_2 PORT(
    In0, In1: IN STD_LOGIC;
    Out0: OUT STD_LOGIC);
    END COMPONENT;

    COMPONENT NAND_3 PORT(
    In0, In1, In2: IN STD_LOGIC;
    Out0: OUT STD_LOGIC);
    END COMPONENT;


    COMPONENT MUX_2_1 PORT(
    D0, D1, S: IN STD_LOGIC;
    Y: OUT STD_LOGIC);
    END COMPONENT;



BEGIN
    U1: NAND_2 PORT MAP(N1, N3, N2);
    U2: NAND_3 PORT MAP(N2, Clk, ClearN, N3);
    U3: NAND_3 PORT MAP(N3, Clk, N1, N4);
    U4: NAND_3 PORT MAP(N4, N5, ClearN, N1);
    U5: NAND_2 PORT MAP(N3, QN, Q);
    U6: NAND_3 PORT MAP(Q, N4, ClearN, QN);
    M1: MUX_2_1 PORT MAP(Q, D, E, N5);

END Structural_D_FF_W_ENABLE_CLEAR;

Finalmente,aquíestáeldiagrama,elcódigoylasimulacióndemiregistro.IncluílasimulacióndeerrorenlaqueclearN(Nsignificaactivobajo)noseimponehastaunospocosciclosdereloj,ylasimulaciónsinerror,cuandoelborradoseconfirmaenelmomento"cero"

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYREG_4_MAR_SAP_1ISGENERIC(size:INTEGER:=3);--LmNistheloadsignal.ItisactivelowsothereisaNOTgateleadingintotheE(enable)portoftheDflipflop--clkMaristheclockfortheregister--clearNMaristheclearfortheregisterwhichconnectstotheclearoftheDflipflops...allactivelow.--DMaristheregisterinputbus--QMaristheregisteroutputbusPORT(LmN,ClkMar,clearNMar:INSTD_LOGIC;DMar:INSTD_LOGIC_VECTOR(sizeDOWNTO0);QMar:OUTSTD_LOGIC_VECTOR(sizeDOWNTO0));ENDREG_4_MAR_SAP_1;ARCHITECTUREStructural_REG_4_MAR_SAP_1OFREG_4_MAR_SAP_1ISSignalEsig:STD_LOGIC;COMPONENTD_FF_W_ENABLE_CLEARPORT(D,E,ClearN,Clk:INSTD_LOGIC;Q:BUFFERSTD_LOGIC);ENDCOMPONENT;COMPONENTNOT_1PORT(In0:INSTD_LOGIC;Out0:OUTSTD_LOGIC);ENDCOMPONENT;BEGINReg4:FORkINsizeDOWNTO0GENERATEFlipFlop:D_FF_W_ENABLE_CLEARPORTMAP(DMar(k),Esig,ClearNMar,clkMar,QMar(k));ENDGENERATEReg4;U1:NOT_1PORTMAP(LmN,Esig);ENDStructural_REG_4_MAR_SAP_1;

AquíestálacondicióndeerrorcuandoclearNMarseafirmaporprimeravezen3us:

EstaeslacondicióncorrectacuandoclearNMarseafirmaenelmomento=0us:

    
pregunta BPoy

1 respuesta

0

Sus bocetos a lápiz no son útiles, sin embargo, el VHDL (de su pregunta eliminada de stackoverflow Error (suprimible): (vsim-3601) Límite de iteración Quartus es:

library ieee;
use ieee.std_logic_1164.all;

entity and_2 is port(
    in0, in1: in std_logic;
    out0: out std_logic);
end and_2;

architecture dataflow_and_2 of and_2 is
begin
    out0<=in0 and in1;
end dataflow_and_2;

library ieee;
use ieee.std_logic_1164.all;
entity nand_2 is port(
    in0, in1: in std_logic;
    out0: out std_logic);

end nand_2;

architecture dataflow of nand_2 is
begin
    out0<= in0 nand in1;
end dataflow;

library ieee;
use ieee.std_logic_1164.all;
entity nand_3 is port(
    in0, in1, in2: in std_logic;
    out0: out std_logic);
end nand_3;

architecture dataflow of nand_3 is
begin
    out0 <= (not(in0 nand in1)) nand in2;
end dataflow;

library ieee;
use ieee.std_logic_1164.all;

entity not_1 is port(
    in0: in std_logic;
    out0: out std_logic);
end not_1;

architecture dataflow_not_1 of not_1 is
begin
    out0<= not in0;
end dataflow_not_1;

library ieee;
use ieee.std_logic_1164.all;

entity or_3 is port(
    in0, in1, in2: in std_logic;
    out0: out std_logic);
end or_3;

architecture dataflow_or_3 of or_3 is
begin
    out0<= in0 or in1 or in2;
end dataflow_or_3;

library ieee;
use ieee.std_logic_1164.all;

entity mux_2_1 is port(
    d0, d1, s: in std_logic;
    y: out std_logic);
end mux_2_1;

architecture structural_mux_2_1 of mux_2_1 is
    signal n1, n2, n3, n4: std_logic;

    component not_1 port(
        in0: in std_logic;
        out0: out std_logic);
    end component;

    component and_2 port(
        in0, in1: in std_logic;
        out0: out std_logic);
    end component;

    component or_3 port(
        in0, in1, in2: in std_logic;
        out0: out std_logic);
    end component;

begin
    u1: not_1 port map(s, n1);
    u2: and_2 port map(d0, n1, n2);
    u3: and_2 port map(s, d1, n3);
    u4: and_2 port map(d1, d0, n4);
    u5: or_3 port map(n2, n3, n4, y);

end structural_mux_2_1;

library ieee;
use ieee.std_logic_1164.all;

entity d_ff_w_enable_clear is port(
    d, e, clearn, clk: in std_logic;
    q: buffer std_logic);
end d_ff_w_enable_clear;

architecture structural_d_ff_w_enable_clear of d_ff_w_enable_clear is
    signal n1, n2, n3, n4, n5, qn: std_logic;

    component nand_2 port(
    in0, in1: in std_logic;
    out0: out std_logic);
    end component;

    component nand_3 port(
    in0, in1, in2: in std_logic;
    out0: out std_logic);
    end component;


    component mux_2_1 port(
    d0, d1, s: in std_logic;
    y: out std_logic);
    end component;

begin
    u1: nand_2 port map(n1, n3, n2);
    u2: nand_3 port map(n2, clk, clearn, n3);
    u3: nand_3 port map(n3, clk, n1, n4);
    u4: nand_3 port map(n4, n5, clearn, n1);
    u5: nand_2 port map(n3, qn, q);
    u6: nand_3 port map(q, n4, clearn, qn);
    m1: mux_2_1 port map(q, d, e, n5);

end structural_d_ff_w_enable_clear;

library ieee;
use ieee.std_logic_1164.all;

entity reg_4_mar_sap_1 is 

    generic (
    size: integer:=3);
    port (
    lmn, clkmar, clearnmar: in std_logic;
    dmar: in std_logic_vector(size downto 0);
    qmar: out std_logic_vector(size downto 0));
end reg_4_mar_sap_1;

architecture structural_reg_4_mar_sap_1 of reg_4_mar_sap_1 is

    signal esig: std_logic;


    component d_ff_w_enable_clear port(
        d, e, clearn, clk: in std_logic;
        q: buffer std_logic);
    end component;

    component not_1 port(
        in0: in std_logic;
        out0: out std_logic);
    end component;


begin

    reg4: for k in size downto 0 generate
        flipflop: d_ff_w_enable_clear port map(dmar(k), esig, clearnmar, clkmar, qmar(k));
    end generate reg4;

    u1: not_1 port map(lmn, esig);

end structural_reg_4_mar_sap_1;

Proporcionando todas las entidades faltantes.

Su metodología parece estar utilizando un archivo .vwf, ya que una fuente de estímulos es un lugar de prueba. Esto afecta la portabilidad y también parece ser el origen de su problema en este caso.

Con un banco de pruebas que replica sus formas de onda de entrada para la imagen que muestra el error de límite de interacción:

library ieee;
use ieee.std_logic_1164.all;

entity reg4_tb is
end entity;

architecture foo of reg4_tb is
    constant size:      natural := 3;
    signal lmn:         std_logic := '1';
    signal clkmar:      std_logic := '0';
    signal clearnmar:   std_logic := '1'; -- not asserted
    signal dmar:        std_logic_vector (size downto 0);
    signal qmar:        std_logic_vector (size downto 0);
begin

UUT:
    entity work.reg_4_mar_sap_1
        generic map (size => size)
        port map (
            lmn => lmn,
            clkmar => clkmar,
            clearnmar => clearnmar,
            dmar => dmar,
            qmar => qmar
        );
CLOCK:
    process
    begin
        wait for 0.5 us;
        clkmar <= not clkmar;
        if now > 15.5 us then
            wait;
        end if;
    end process;
STIMULI:
    process
    begin
        dmar <= x"0";
        wait for 3 us;
        clearnmar <= '0'; -- no early clear
        dmar <= x"1";
        wait for 1 us;
        clearnmar <= '1';
        lmn <= '0';
        wait for 1 us;
        lmn <= '1';
        wait for 1 us;
        dmar <= x"2";
        wait for 1 us;
        lmn <= '0';
        wait for 1 us;
        lmn <= '1';
        wait for 1 us;
        dmar <= x"3";
        wait for 1 us;
        clearnmar <= '0';
        wait for 1 us;
        clearnmar <= '1';
        wait for 1 us;
        dmar <= x"4";
        wait for 3 us;
        dmar <= x"5";
        wait;
    end process;

end architecture;

Tu modelo de diseño simula sin el problema:

notandolosincrementosyvaloresqmarfaltantessemuestran.

Estonosdicequehayunaherramientaounproblemademetodologíaenlaformaenqueestásutilizando.vwfcomoestímuloparatumodeloensimulación.

Siobservaenlaimagendeltextoenlaventanaquecontieneelerrorreportadoenrojo,haydeclaracionesquenoestánvisiblesenlosdosarchivosVHDLincluidosarriba:

  

packagestd.textio
  entidadyarquitecturareg_4_mar_sap_1_vhdl_vec_tst(reg_4_mar_sap_1_arch)
  paquetevital_timing
  paquetevital_primitives
  paquetecycloneive.cycloneive_atom_pack
  paquetecycloneive.cycloneive_components
  entidadyarquitecturawork.hard_block(estructura)
  paqueteieee.std_logic_arith
  entidadyarquitecturacycloneive.cycloneive_io_obuf(arco)
  entidadyarquitecturacycloneive.cycloneive_io_ibuf(arco)
  entidadyarquitecturacycloneive.cycloneive_lcell_comb(vital_lcell_comb)

Sinembargo,todosestossecarganenlasimulación.Situvieraquearriesgarmeasuponer,elproblemasurgealdecirlealaherramientaqueuseVITALenunmodelodetiempocero.Sinoesesootracosaenlalista.(Noestáclaro,porejemplo,porquétienecélulasIOenunmodelodecomportamiento.Todaslascosasanterioresseutilizandealgunamaneraparaconectarentidadesextrañasalmodelodesimulaciónparaproporcionarestímulosdesdelaformadeondavwf.(Pienseenlasextensionesdelmodeloenenlugardeunbancodepruebas.EnalgúnlugardeesegranproblemahayunproblemaquecausaelerrorquenosdiceelverrordeModelsim:

  

Mensaje#3601devsim:  Elsimuladoriteraenuntiempodesimulacióndadoencerodemorahastaque  Nohaymásactividadenesemomento.Paraquenocuelguesi  hayunaoscilaciónderetardocero,limitaelnúmerodeiteraciones  aunvalorpredeterminadode5000.Sialcanzaestelímite,lasimulaciónsedetendrá  conunerror.Sirecibeesteerrorpuedeaumentarlaiteración.  límite,(atravésde"set IterationLimit") y luego intente solo   pisar para intentar determinar qué instancias en el diseño pueden ser   oscilante.
  [DOC: Manual del usuario de ModelSim - Detección de bucles infinitos de retardo cero]

Puedes solucionar problemas. Sin embargo, no está claro cómo solucionar problemas de las partes externas de su modelo de diseño elaborado.

Como sugerencia, limpie su proyecto o copie sus archivos de diseño VHDL a un nuevo proyecto y tenga mucho cuidado con la configuración que proporcione que pueda afectar su entorno de simulación. Parece que has hecho algo mal que no se puede determinar a partir de tus modelos VHDL o que hay algo incompatible con tus flip flops cuando usas estímulos vwf. (Los ajustes son más probables).

Altera (antes de la adquisición de Intel) se desaconseja activamente el uso de estímulos de forma de onda (que es una implementación específica del simulador, Modelsim no admite VHPI).

También puede observar que el código anterior requiere VHDL -2008 (resultados evaluados en expresiones).

La descripción de la lógica estructural (que utiliza puertas instanciadas) no se usa ampliamente, generalmente se basa en descripciones de nivel RTL que se sintetizan. Todos los modelos de VHDL elaborados son de comportamiento, estamos hablando de una diferencia en la granularidad y qué declaraciones de VHDL se utilizan. Los lenguajes de descripción de hardware permiten que las descripciones de RTL se asignen a primitivos definidos de implementación.

Una descripción de RTL:

architecture rtl of reg_4_mar_sap_1 is
begin
    process (clkmar, clearnmar)
    begin
        if clearnmar = '0' then
            qmar <= (others => '0');
        elsif rising_edge(clkmar) then
            if lmn = '0' then
                qmar <= dmar;
            end if;
        end if;
    end process;
end architecture;

proporciona los mismos valores al mismo tiempo para qmar y producirá una lógica equivalente cuando se sintetice utilizando primitivas de proveedor.

    
respondido por el user8352

Lea otras preguntas en las etiquetas