La tarea no funciona en verilog

0

Creé un módulo que primero ordena una matriz de bytes y luego el último elemento como mínimo (solo para la práctica). Cuando me moví en orden al bloque de tareas, no funcionó tan bien como antes. ¿Cómo se puede utilizar correctamente el bloque de tareas para la clasificación? gracias.

Ordenar sin tarea:

    module sort(input clk, input nrst, output byte choose);

    byte sorted[0:3];

    assign choose = sorted[3];// output must be minimum after sort (12)

    always@(posedge clk, negedge nrst) begin                
        if(nrst == 0) begin // initialize to something
            sorted[0] = 17;
            sorted[1] = 12;
            sorted[2] = 23;
            sorted[3] = 21;
        end 
        else begin                      
            int i, j;               
            byte tmp;           
            //sort  
            for(i=0; i<4; i=i+1)            
                for(j=0; j<4; j=j+1)
                    if(sorted[j] < sorted[j+1]) begin
                        tmp = sorted[j]; // swap
                        sorted[j] = sorted[j+1];
                        sorted[j+1] = tmp;
                    end                                                 
        end                         
    end

endmodule

Ordenar con tarea:

module sort(input clk, input nrst, output byte choose);

    byte sorted[0:3];

    assign choose = sorted[3];// output must be minimum after sort (12)

    always@(posedge clk, negedge nrst) begin                
        if(nrst == 0) begin // initialize to something
            sorted[0] = 17;
            sorted[1] = 12;
            sorted[2] = 23;
            sorted[3] = 21;
        end 
        else begin                      
            sort_task(sorted);                                      
        end                         
    end

    task sort_task(inout byte list[3:0]);
        begin 
            int i, j;               
            byte tmp;           
            //sort  
            for(i=0; i<4; i=i+1)            
                for(j=0; j<4; j=j+1)
                    if(list[j] < list[j+1]) begin
                        tmp = list[j];
                        list[j] = list[j+1];
                        list[j+1] = tmp;
                    end                                                 

        end
    endtask

endmodule

Testbench:

module tb();

    byte choose;
    reg nrst, clk;

    sort sort(clk, nrst, choose);

    initial begin       
        clk = 0;        
        forever #5 clk = ~clk;      
    end     

    initial begin       
        int i;
        nrst = 1;
        #50;
        for(i=0; i<4; i=i+1)            
            $display("50 : %d", sort.sorted[i]);
        nrst = 0;       
        #50
        for(i=0; i<4; i=i+1)            
            $display("100 : %d", sort.sorted[i]);               
        nrst = 1;   
        #50 
        for(i=0; i<4; i=i+1)            
            $display("150: %d", sort.sorted[i]);                
    end

endmodule
    
pregunta Soheil Shababi

1 respuesta

1

El problema es que hay una falta de coincidencia en la declaración del índice para sorted[0:3] versus list[3:0] , por lo que (list[j] < list[j+1]) le da la evaluación inversa. Recomiendo encarecidamente el uso de typedef's comunes (en un paquete) para eliminar problemas como este.

typedef byte list_t[4];
list_t sorted;
task sort_task( inout list_t list);

Por cierto, el uso de typedef le proporciona la sintaxis necesaria para declarar una función con tipo de devolución desempaquetado porque se permite cualquier nombre simple para un tipo de devolución, sin importar cuán compleja sea la typedef.

También, estoy de acuerdo con usted en que una tarea es sintetizable, siempre que el código dentro de la tarea cumpla con su estilo de modelado de síntesis de herramientas. Pero preferiría que las personas utilicen una función de vacío en lugar de una tarea cuando su tarea no requiere mucho tiempo. Una función es una garantía de que no consumirá tiempo.

    
respondido por el dave_59

Lea otras preguntas en las etiquetas