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