vivado tutorial memoria esquema ejemplos desde code cero verilog system-verilog

tutorial - verilog desde cero



ANCHO DE DIRECCION DE LA PROFUNDIDAD RAM (2)

Estoy implementando un DPRAM configurable donde RAM DEPTH es el parámetro.

¿Cómo determinar el ancho de la dirección de la memoria RAM?

Conozco la relación PROFUNDIDAD RAM = 2 ^ (ANCHO DE DIRECCIÓN)

DIRECCIÓN ANCHO = log (base 2) RAM PROFUNDIDAD.

¿Cómo implementar la función log (base 2) en Verilog?


Si bien $ clog2 es la respuesta correcta, hasta que los proveedores de herramientas se pongan al día, puede implementar su propia función clog2 como una macro verilog-2001, que funcionará con todas las herramientas de síntesis y simulación.

Como:

`define CLOG2(x) / (x <= 2) ? 1 : / (x <= 4) ? 2 : / (x <= 8) ? 3 : / (x <= 16) ? 4 : / (x <= 32) ? 5 : / (x <= 64) ? 6 : / ..etc, as far as you need to go.. (x <= 4294967296) ? 32 : / -1 parameter FOO_MAX_VALUE = 42; parameter FOO_WIDTH = `CLOG2(FOO_MAX_VALUE);

Cuando se utiliza el "-1" final para producir un valor ilegal, el simulador debe marcar.

(Edición tardía: ¡Uy, arreglado mi error de apagado por uno!)


La tarea del sistema $clog2 se agregó a la extensión SystemVerilog a Verilog (IEEE Std 1800-2005). Esto devuelve un entero que tiene el valor del techo de la base de registro 2. La PROFUNDIDAD no necesita ser una potencia de 2.

module tb; parameter DEPTH = 5; parameter WIDTH = $clog2(DEPTH); initial begin $display("d=%0d, w=%0d", DEPTH, WIDTH); #5 $finish; end endmodule

Ejecutar una simulación mostrará esto:

d=5, w=3

Sin embargo, no conozco una herramienta de síntesis que admita $clog2 . Si necesita sintetizar su código, puede usar una function . Esto se copió de IEEE 1364-2001 Std, pero hay otras versiones flotando en la web:

function integer clogb2; input [31:0] value; begin value = value - 1; for (clogb2 = 0; value > 0; clogb2 = clogb2 + 1) begin value = value >> 1; end end endfunction

Mi experiencia ha sido que usar la function es más problemático de lo que vale la pena para el código sintetizable. Ha causado problemas para otras herramientas en el flujo de diseño (linters, verificadores de equivalencia, etc.).