Dos formas diferentes de escribir lo mismo pero generar diferentes comportamientos en Verilog

2

Tengo una parte del código de Verilog que básicamente intenta sintetizar un flip-flop. He estado experimentando y parece que puedo encontrar dos formas de escribirlo.

La primera forma es:

always @(posedge(clk),posedge(reset)) begin
    if(reset) begin
        g <= 1'b0;
    end else begin
        if((~wr_full) && (~fifo_empty)) begin
            g <= ~ g;
        end else begin
            g <= g;
        end
    end
end

Y la segunda forma es:

reg g_next;

always @(posedge(clk),posedge(reset)) begin
    if(reset) begin
        g <= 1'b0;
    end else begin
        g <= g_next;
    end
end

always @* begin
    if((~wr_full) && (~fifo_empty)) begin
        g_next = ~ g;
    end else begin
        g_next = g;
    end
end

Resulta que ambos códigos se sintetizan para convertirse exactamente en el mismo circuito (que se esperaba):

Perosucomportamientoenlasimulaciónesdiferente.Enelprimercaso,tanprontocomolacondiciónenlasentenciaif(~tx_busy)&&(~output_fifo_empty)seconvierteentrue,lasalidadelflipflopcambia,peroenelsegundocaso,elcambioenlasalidaocurreuncicloderelojdespuésdequelacondiciónseconvierteentrue.

Porlotanto,mispreguntasson:

1)¿Porquélosresultadosdesimulacióndecomportamientosondiferentes,aunqueamboscódigossesintetizanparaconvertirseenelmismocircuito?

2)¿Cuáldeloscomportamientosseesperacomosalidadelcircuitosintetizadoyporqué?Despuésdemirarelcircuitosintetizado,parecelógicoinferirqueelcomportamientoseráeldelsegundocircuito,pero¿porquéeseso?(Elcomportamientoquequeríainferirfueelprimero).Ysiesteeselcaso,¿cómohagocumplirelprimercomportamiento(talvezunpestillo?)

3)Heestadousandoestosdosmétodosindistintamenteparaproducirloscomportamientosquequería,peroahoramehedadocuentadequeestosdossintetizanelmismocircuito.¿Cómoafectaestoamisotroscircuitos(noentiendocómofuncionan,perosiguenfuncionandocomoseespera?)

4)¿Cómoséqueelcomportamientodelcircuitoqueinferíenlasimulacióndelcomportamientoseráeldelcircuitosintetizado(estaexperienciabásicamentecuestionatodaslascreenciasquetuvesobreloscomportamientosdediseñossimuladosysintetizados)?

EDIT:comoloscódigossonmuylargos,preferiríanopublicarlosaquí.Loshesubido aquí .

Hay tres floders.

  • La carpeta traffic_generator contiene el archivo traffic_generator.v y el banco de pruebas para el mismo traffic_generator_tb.v . Estos son los códigos de nivel superior.

  • La carpeta pulse_generator contiene el archivo de inclusión pulse_generator.v . Soy consciente de que este código aún no es sintetizable, pero puedo obtener un código sintetizable con el mismo comportamiento (¿verdad?).

  • La carpeta my_fifo contiene otro archivo de inclusión my_fifo.v . Sospecho que podría haber algún problema debido a la forma en que se actualiza la bandera vacía, pero parece que no puedo resolverlo.

pregunta ironstein

0 respuestas

Lea otras preguntas en las etiquetas