sistema verilog matriz 3d, no puedo insertar datos, ¿qué estoy haciendo mal?

0

Estoy tratando de implementar la convolución 2d (8 bits cada celda en la convolución, por lo que en systemV es 3D) en el sistema verilog, y tengo problemas para insertar datos en la matriz de "resultados", y no entiendo qué hago mal, esto es mi código:

module conv2d (
                input clk,
                input logic [7:0] img[3:0][3:0],
                input logic [7:0] kernel[2:0][2:0],
                output logic [7:0] result [4:0][4:0]
                );//#(parameter img_size=16,kernel_size=4)()
int i,j;


always_ff @(posedge clk) begin
    for(i=0;i<5;i++) begin
        for(j=0;j<5;j++) begin
            for(int k=0;k<3;k++) begin
                for(int l=0;l<3;l++) begin
                    if ((i-k > -1)&&(j-l>-1)&&(i-k < 3)&&(j-l < 3))begin
                        result[i][j] <= result[i][j] + kernel[i-k][j-l]*img[k][l];
                    end
                end
            end
        end
    end
end 

endmodule

mi banco de pruebas:

module test; 
logic clk;
logic [7:0] img[3:0][3:0] ;
logic [7:0] kernel[2:0][2:0];
logic [7:0] result[4:0][4:0];
initial begin
    for(int i=0;i<5;i++) begin
        for(int j=0;j<5;j++) begin
            result[i][j]=8'b0;
        end
    end
clk=1'b0;
img[0][0]=8'd1;
img[0][1]=8'd0;
img[0][2]=8'd2;
img[0][3]=8'd0;
img[1][0]=8'd1;
img[1][1]=8'd2;
img[1][2]=8'd3;
img[1][3]=8'd1;
img[2][0]=8'd0;
img[2][1]=8'd0;
img[2][2]=8'd1;
img[2][3]=8'd0;
img[3][0]=8'd1;
img[3][1]=8'd0;
img[3][2]=8'd3;
img[3][3]=8'd1;
kernel[0][0]=8'd1;
kernel[0][1]=8'd0;
kernel[0][2]=8'd0;
kernel[1][0]=8'd0;
kernel[1][1]=8'd1;
kernel[1][2]=8'd0;
kernel[2][0]=8'd1;
kernel[2][1]=8'd1;
kernel[2][2]=8'd0;
end
//#100;
//$stop;
always #5 clk = ~clk; 
conv2d con4test (
                    .clk(clk),
                    .img(img),
                    .kernel(kernel),
                    .result(result)
                    );
endmodule

esta es la primera vez que trabajo por primera vez con un sistema verilog y arreglos en 3D, no pude encontrar ninguna información útil en línea, no seas tan duro conmigo.

¡Gracias!

EDITAR: solucionado el problema del banco de pruebas. Y mi problema es que la matriz de resultados no se está actualizando, lo que significa que todavía es 0

EDITAR: trabajando!

Hice pocos cambios en el código, pero el que hizo el trabajo (creo) estaba cambiando siempre_ff siempre diré la verdad, no tengo idea de por qué ... y estaré súper interesado si alguien sabe.

Gracias de nuevo.

    
pregunta albert1905

1 respuesta

0

Después de un tiempo de depuración y simulación, puedo decir que debes mover la inicialización de result al módulo conv2d :

module conv2d (
    input clk,
    input logic [7:0] img[3:0][3:0],
    input logic [7:0] kernel[2:0][2:0],
    output logic [7:0] result [4:0][4:0]
    );//#(parameter img_size=16,kernel_size=4)()

int i,j;

initial begin
    for(int i=0;i<5;i++) begin
        for(int j=0;j<5;j++) begin
            result[i][j]=8'b0;
        end
    end
end

always_ff @(posedge clk) begin
    for(i=0;i<5;i++) begin
        for(j=0;j<5;j++) begin
            for(int k=0;k<3;k++) begin
                for(int l=0;l<3;l++) begin
                    if ((i-k > -1)&&(j-l>-1)&&(i-k < 3)&&(j-l < 3))begin
                        result[i][j] <= result[i][j] + kernel[i-k][j-l]*img[k][l];
                    end
                end
            end
        end
    end
end

Realmente me pregunto cómo pudo simular su código original porque mi ModelSim simplemente da el error escrito por asignaciones continuas y de procedimiento en el result (al intentar inicializarlo en test luego modifique en conv2d ).

    
respondido por el Anonymous

Lea otras preguntas en las etiquetas