Estaba leyendo sobre block ram y encontré la siguiente publicación. Aquí me doy cuenta de que quienquiera que haya escrito el código está usando negedge en la señal del reloj. Hasta ahora, casi todos los ejemplos que he visto de verilog usan posedge en señales de reloj. De hecho, no he visto ningún bloque always con negedge especificado. Me pregunto cuándo querría usar eso y por qué el código a continuación podría contener negedge.
module RAM_param(clk, addr, read_write, clear, data_in, data_out);
parameter n = 4;
parameter w = 8;
input clk, read_write, clear;
input [n-1:0] addr;
input [w-1:0] data_in;
output reg [w-1:0] data_out;
reg [w-1:0] reg_array [2**n-1:0];
integer i;
initial begin
for( i = 0; i < 2**n; i = i + 1 ) begin
reg_array[i] <= 0;
end
end
always @(negedge(clk)) begin
if( read_write == 1 )
reg_array[addr] <= data_in;
if( clear == 1 ) begin
for( i = 0; i < 2**n; i = i + 1 ) begin
reg_array[i] <= 0;
end
end
data_out = reg_array[addr];
end
endmodule
Si es un novato en el diseño digital, le recomendaría que solo use un registro activado por flanco negativo para conectarse a otros circuitos donde sea necesario para obtener la sincronización correcta. Un ejemplo de esto es una interfaz DDR como @Paebbels mencionó en su comentario.
Por supuesto, si es un diseñador digital experimentado, podría usar un registro activado por borde negativo en un diseño activado por borde positivo para interactuar entre dominios de reloj alineados.
El punto principal a recordar es que no debe mezclar registros activados por flancos positivos y negativos en un diseño a menos que esté absolutamente seguro de que sabe lo que está haciendo, de lo contrario, esto puede causar errores que pueden ser muy difíciles de encontrar.
PD: el código que muestra no se implementará en la mayoría de las herramientas de síntesis como un blockram debido a la señal clara que establece el contenido en cero. Lo más probable es que se implemente en registros discretos y sea muy lento.
Editar: Otra posibilidad de usar un reloj activado por flanco negativo en un diseño activado por flanco positivo es en un ariete de bloque síncrono. Si tiene un ariete de bloque síncrono entre dos registros activados por flanco positivo y sincroniza el ariete de bloque en el flanco negativo, elude el retraso de un ciclo de reloj del ariete de bloque síncrono.
cada vez que quieras hacer algo entre bordes positivos.
La RAM tiene RAS/~CAS en el borde negativo de lo que le gustaría bloquear la otra mitad de la dirección, etc.
Paebbels