Creando el módulo SystemVerilog usando un módulo personalizado independiente y de bucle

0

Estoy tratando de crear un cambiador de barril de n bits usando el diagrama en la respuesta a esta pregunta: enlace

He leído que si la variable en un bucle for tiene un solo nombre, entonces cada iteración de bucle tiene un alcance y una variable separados; sin embargo, no estoy seguro de si el rows en mi módulo barrel se creará en el mismo estilo que el diagrama de referencia de arriba. Este es mi módulo barrel :

module barrel
    #(parameter n = 8; parameter control = $clog2(n))
    (input logic[n-1:0] data, input logic [control-1:0] select,
    output logic [n-1:0] result);

    for(genvar i = 0; i < control; i++) begin : label
            logic [n-1:0] tempResult;

            always_comb
                    if(i == 0) row #(n,2**i) shiftLevel(data,select[i],tempResult);
                    else if(i == control-1) row #(n,2**i) shiftLevel(label[i-1].shiftLevel.tempResult,select[i],result);
                    else row #(n,2**i) shiftLevel(label[i-1].shiftLevel.tempResult,select[i],tempResult);
    end

endmodule

Mi pregunta es esta: ¿el bucle label ed for conservará los módulos row que creo en cada iteración? ¿O cada row se destruye una vez que finaliza la iteración?

Aquí están los otros módulos que estoy usando para implementar esto:

módulo row :

module row
    #(parameter n=8, parameter shift=4) // n is the number of bits
                                            // shift is the max amount of shift at this level
    (input logic [n-1:0] data,
    input logic select,
    output logic [n-1:0] end);

    for(genvar i = 0; i < n; i++) begin : label
            logic [1:0] dataTemp;

            always_comb
                    dataTemp[0] <= data[i]; // 0 option of the mux is set to the normal data value

                    if(i+shift < n) dataTemp[1] <= data[i+shift]; // assigns the shifted bit
                    else dataTemp[0] <= 0; // assigns 0

            mux2 bit(dataTemp,select,end[i]); // Assembles a mux for a bit of the row output

endmodule

2-1 módulo Mux:

module mux2(input logic [1:0] data, select,
            output logic y);

    assign y = select ? data[1] : data[0];
endmodule
    
pregunta rafafan2010

1 respuesta

1

Las sentencias SystemVerilog generate se elaboran en tiempo de compilación, no son códigos de procedimiento. Eso significa que se procesan como una macro o una declaración 'ifdef , excepto que pueden evaluar parámetros, comprender el alcance y crear nuevos ámbitos. Necesitas deshacerte de la construcción always_comb . El if / else if / else también es un bloque generado que produce solo una instancia de fila por iteración. Suponiendo que n = 8, obtendrá tres bloques de bucle for generados llamados label[0] , label[1] y label[2] . Su código se elabora como si pudiera haber escrito algo como lo siguiente (suponiendo que n se anule a 16 .:

module barrel
    #(parameter n = 8; parameter control = $clog2(n))
    (input logic[n-1:0] data, input logic [control-1:0] select,
    output logic [n-1:0] result);

            logic [n-1:0] logic[0].tempResult;
            logic [n-1:0] logic[1].tempResult;
            logic [n-1:0] logic[2].tempResult;
            row #(n,1) logic[0].shiftLevel(
                    data,select[0],label[0].tempResult);
            row #(n,2) label[1].shiftLevel(
                    label[0].tempResult,select[1],label[1].tempResult);
            row #(n,4) label[1].shiftLevel(
                    label[1].tempResult,select[2],label[2].tempResult);
            row #(n,8) label[3].shiftLevel(
                    label[2].tempResult,select[3],result);
endmodule

Tenga en cuenta que no puede declarar identificadores (los nombres de variable o los nombres de instancia de módulo) con la etiqueta [x]. prefijo sin utilizar la construcción de bloque generar .

    
respondido por el dave_59

Lea otras preguntas en las etiquetas