Cuando es apropiado usar = o = asigimientos en Verilog

1

No he aclarado en absoluto esta parte de Verilog cuando uso < = o cuando =

Tengo algunos bloques siempre que hacen algunos agregados, restan y multiplican un ejemplo es el siguiente:

    module Calcs 
    #
    (
        parameter RC = 24'h0186DA,
                  RV = 24'h018666
    )
    (
        input clk,    // Clock
        //SOME INPUT VALUES FOR VAL1 VAL2 VAL.....

        output reg go  
    );



    reg [63:0] val1; 
    reg [63:0] val2; 

    reg [63:0] val3; 
    reg [63:0] val4; 

    reg [63:0] ValSelected;

    reg [127:0] Mult1; 
    reg [127:0] Mult2; 

    reg [128:0] Subs; 

    reg [128:0] Mult3; 

    reg isNeg;

    reg go1;

    reg [63:0] LastVal1;
    reg [63:0] LastVal2;
    reg [63:0] LastValSelected;

    always @ (posedge clk) begin

         Is_Valid  = (val1 != 0) && (val2 !=0); 


        if (val4 >=  val3) ValSelected = val3; 
        else if (val4 < val3) ValSelected = val4; 

        if (Is_Valid) begin
            Mult1      = val2 * RV;
            Mult2      = val1 * RC;
            Subs       = Mult2 - Mult1;
            isNeg      = Subs < 0;
            if (!isNeg) Mult3 = ValSelected * Subs;
            else Mult3 = 0;
            if (Mult3 > 1) begin
                if (((val1 != LastVal1) || (val2 != LastVal2))  || (ValSelected != LastValSelected)) go1 <= 1'b1;
                else if(((val1 == LastVal1) || (val2 == LastVal2))  || (ValSelected == LastValSelected)) go1 <= 1'b0;           
            end      
        end
    end


    always @ (posedge clk) begin
        if (go1) begin
            LastVal1 = val1;
            LastVal2 = val2;
            LastValSelected = ValSelected;
            go <= 1'b1;
        end
        else go <= 1'b0;
    end
endmodule

Hay un comportamiento extraño cuando uso < = para establecer el valor en go1, esto nunca se ejecuta y si lo cambio por = esto se ejecuta siempre y si se cumple, go1 nunca vuelve a 0

¿Puede alguien ayudarme a entender esto?

perdón si el código tiene algunos problemas, solo hay un ejemplo

Muchas gracias!

    
pregunta Alexis Hernandez

2 respuestas

2

La regla es simplemente:

  

Si un proceso escribe en una variable sincronizada con un evento, y otro proceso lee el misma variable sincronizada con el mismo evento, debe escribir usando una NBA asegurándose de que el proceso de lectura use el valor antiguo de la variable.

Si no utiliza un proceso de escritura de la NBA, existe una condición de carrera en el proceso de lectura en el sentido de que no sabe si lee el texto anterior o nuevo valor.

Tenga en cuenta que cada bloque always en su ejemplo es un proceso de lectura y escritura, dependiendo de la variable que estemos considerando sincronizada con el evento posedge clk . También considere los procesos que escriben en las entradas del módulo y lea las salidas del módulo.

Si tiene una variable que es local para un proceso, es su elección utilizar cualquiera de las asignaciones según la funcionalidad que desee. Pero para la combinación, se recomiendan tareas de bloqueo.

    
respondido por el dave_59
-3

Verilog - Asignación de bloqueo (=) A dos salidas de Registro se les asigna la misma entrada, después de un borde de clk compartido.

Verilog - Asignación sin bloqueo (< =) Dos salidas de registro se conectan en cascada, una tras otra, después de un borde de clk compartido, es decir, un reloj retrasado registro

Según lo prometido, prueba de que lo anterior es cierto Ref

Cualquier persona que no esté de acuerdo debe justificar.

    
respondido por el Tony EE rocketscientist

Lea otras preguntas en las etiquetas