Acceso a las filas de una matriz usando la variable en Verilog

2

Tengo un módulo que estoy escribiendo en Verilog que contiene efectivamente una matriz 2D de 16 por 10. En un punto y "fila" determinados, lo que quiero es que esos datos se transfieran a una red que pueda leerse fuera del módulo, sin embargo, cuando intento usar una entrada de variable para determinar qué fila quiero que mi sintetizador los devuelva errores:

Error (10734): Verilog HDL error at FontRom.v(12): ROW_NUM is not a constant

El error es bastante claro, pero ahora no estoy seguro de cómo puedo acceder a diferentes partes de la matriz si no puedo usar una variable. Además, normalmente cuando necesito precargar un registro con datos tengo una condición de restablecimiento que lo hace, ¿tengo que hacer lo mismo en este caso también? A continuación se muestra mi código. Gracias.

module FontRom(CLK, CHAR_IN, ROW_NUM, DATA_OUT);
   input    wire  [7:0]  CHAR_IN;
   input    wire  [3:0]  ROW_NUM;
   input    wire         CLK;
   output   reg   [0:9]  DATA_OUT;

   parameter   char       = 2'h48;
   parameter   font_value = 40'h000008120481204813FC81204812048120400000;

   reg [0:159] char_font  = font_value;

   always @(negedge CLK)
      if (CHAR_IN == char) begin
         DATA_OUT = char_font[2*ROW_NUM:2*ROW_NUM+10]; // +10 due to Big Endian
      end
      else begin
         DATA_OUT = 8'bZZ;
      end
endmodule
    
pregunta Jon.H

1 respuesta

8

Las selecciones de partes en Verilog pueden usar variables, siempre que el ancho de la selección sea una constante. La solución aquí es utilizar una sintaxis de selección de parte menos conocida, donde se especifica el desplazamiento y el tamaño.

DATA_OUT = char_font[2*ROW_NUM+:10]; // +10 due to Big Endian

Lo anterior selecciona 10 bits que comienzan en el bit 2*ROW_NUM

Extracto del SystemVerilog LRM, IEEE 1800-2012

  

Se proporciona una selección de parte indexada con la siguiente sintaxis:

logic [15:0] down_vect;
logic [0:15] up_vect;

down_vect[lsb_base_expr +: width_expr]
up_vect[msb_base_expr +: width_expr]

down_vect[msb_base_expr -: width_expr]
up_vect[lsb_base_expr -: width_expr]
     

El msb_base_expr y lsb_base_expr serán expresiones enteras, y el width_expr será una expresión entera constante positiva. Cada una de estas expresiones se evaluará en un contexto autodeterminado. Lsb_base_expr y msb_base_expr pueden variar en el tiempo de ejecución. Los dos primeros ejemplos seleccionan bits que comienzan en la base y ascienden en el rango de bits. El número de bits seleccionados es igual a la expresión de ancho. Los segundos dos ejemplos seleccionan bits que comienzan en la base y descienden del rango de bits.

    
respondido por el dwikle

Lea otras preguntas en las etiquetas

Comentarios Recientes

La función de campo 4B tiene un error en VBScript. He publicado un comentario aquí al respecto y su hilo allí que detalla cómo resolver esto y en el rastreador de errores de Guava, incluya lo que se menciona en la publicación n. ° 1 a continuación. Afortunadamente, esto NO es tan importante como puede leer sobre esto todo en el sitio de PSObject2D. Actualización: después de preguntarme si tener que incluir las características compiladas relevantes podría hacer que otros componentes de VBScript sean incompatibles,... Lees verder