Verilog: ¿Cómo mantener el proceso reaccionando solo al clk y al reiniciar?

2

Tengo un código Verilog que simula correctamente. Decidí sintetizarlo y veo estas advertencias que me inquietan:

 Signal <> missing in the sensitivity list is added for synthesis purposes. HDL and post-synthesis simulations may differ as a result.

Aproximadamente 20 del mismo tipo. No QUIERO que esas señales se agreguen a la lista de sensibilidad, realmente no lo hago. Todo lo que quiero es hacer cosas en los bordes del reloj, no cada vez que cambia una señal.

Dándole el beneficio de la duda, cambié mi proceso de

 always @(posedge clk or negedge reset)

a:

 always @(*)

Y, por supuesto, ninguna de mis cosas funcionó (en simulación). Probablemente porque las instrucciones de no bloqueo ahora están haciendo cosas cada vez que algo cambia, en lugar de esperar por los bordes del reloj.

¿Hay alguna manera de evitar que Verilog haga esto? Supongo que piensa que mi código es combinativo, en lugar de secuencial ... ¿Pero por qué? ¿Hay alguna manera de decirle que esto es secuencial y solo para usar el clk?

Gracias de antemano!

Editar, aquí hay un código, estoy eliminando algunas de las funciones:

always @(*) begin
    // Some signals here that I apparently can't put in the other one
    // Something about double edges
end

always @(posedge clk or negedge reset) begin

case (!reset)
    0: begin
            // Assign 0 to things       
        end
    1: begin            
        p_spi_done <= spi_done;       // Wants these to be in sensitivity list
        case ((spi_done == 1) && (p_spi_done!=spi_done))
            0:  begin   
                    case (helper_reg)
                    5'b00000: begin
                            // Do something else
                        end
                    5'b00001: begin                     
                            ...
                        end                     
                    5'b00010: begin
                            ....
                        end                     
                    5'b00100: begin
                            i_wData <= i_rDataA[SPI_WIDTH-1:0];
                            i_temp_reg <= i_rDataA[BANK_DATA_WIDTH-1:SPI_WIDTH];
                            helper_reg[3] <= 0;
                        end
                    5'b01000: begin
                            ...
                        end
                    5'b10000: begin
                            ...
                        end
                    default:    begin
                            // Don't know what happened
                            helper_reg <= 0;
                        end
                    endcase                     
                end             
            1:  begin
                    case (cpu_state)
                    0: begin                                // SYNC HAS ARRIVED
                            if (spi_rx_data == SYNC_VALUE) begin
                                cpu_state           <= 1;
                            end
                        end
                    1: begin
                        OPCODE <= spi_rx_data;
                        // Instruction set begins here
                        case (spi_rx_data)
                            0:  begin                               
                                    ...
                                end
                            1:  begin   
                                   ...  
                                end
                            2:  begin
                                   ...
                                end
                            3:  begin                                   // Set maximum count value for watch unit
                                        if (SPI_WIDTH > MAX_COUNT_LENGTH) begin
                                            n_rx                    <= 1;
                                        end
                                        else begin
                                            n_rx                        <= (MAX_COUNT_LENGTH + SPI_WIDTH/2)
                                                                        /SPI_WIDTH;                                 // Compiler truncates
                                        end
                                        cpu_state               <= 2;
                                        helper_reg[5]           <= 1;
                                    end
                            4:      begin                   
                                    end
                            5:      begin
                                        cpu_state <= 2;
                                    end
                            default: begin
                                    end
                        endcase
                    end
                    2: begin                                        // DATA
                        case (OPCODE)
                            0: begin

                                end
                            1: begin

                                end
                            2: begin
                                    .... and it goes on in this fashion
    
pregunta Mewa

1 respuesta

4
always @(posedge clk or negedge reset) begin

case (!reset)
    0: begin
            // Assign 0 to things       
        end
    1: begin   
            // Do stuff
        end
 endcase

Observe que tiene la lógica de reinicio invertida.

Tienes sensibilidad al negedge reset , lo que implica que debes restablecer cuando la señal reset se agote.

Pero luego realmente establece las cosas en cero si !reset es bajo, lo que significa que reset es alto.

Esto significa básicamente que estás tratando de crear flip-flops con sensibilidad a dos señales de reloj diferentes, lo que no es sintetizable. La herramienta de síntesis probablemente intentó crear una función equivalente a partir de la lógica combinatoria, razón por la cual le sugirió expandir la lista de sensibilidad.

Creo que esta fue la fuente de tu problema.

La forma convencional de crear flip-flops con reinicio sincronizado de baja actividad es

always @(posedge clk or negedge reset) begin
    if(!reset) begin
        // set things to zero
    end
    else begin
        // do things 
    end
end
    
respondido por el The Photon

Lea otras preguntas en las etiquetas