¿Por qué es la optimización de distancia XST mis registros y cómo puedo evitarlo?
Pregunta
Tengo un sencillo programa de Verilog que se incrementa un contador de 32 bits, convierte el número a una cadena ASCII usando $ sformat y luego empuja la cadena en el host de máquina 1 byte a la vez utilizando un FT245RL FTDI.
Desafortunadamente Xilinx XST se sigue optimizando el vector de distancia registro cadena. He intentado rededor diversas rutinas de inicialización y de acceso sin éxito. Me parece que no puede apagar la optimización, y todos los ejemplos que encuentro en línea difieren muy poco de mis rutinas de inicialización. ¿Qué estoy haciendo mal?
module counter(CK12, TXE_, WR, RD_, LED, USBD);
input CK12;
input TXE_;
output WR;
output RD_;
output [7:0] LED;
inout [7:0] USBD;
reg [31:0] count = 0;
reg [7:0] k;
reg wrf = 0;
reg rd = 1;
reg [7:0] lbyte = 8'b00000000;
reg td = 1;
parameter MEM_SIZE = 88;
parameter STR_SIZE = 11;
reg [MEM_SIZE - 1:0] str;
reg [7:0] strpos = 8'b00000000;
initial
begin
for (k = 0; k < MEM_SIZE; k = k + 1)
begin
str[k] = 0;
end
end
always @(posedge CK12)
begin
if (TXE_ == 0 && wrf == 1)
begin
count = count + 1;
wrf = 0;
end
else if (wrf == 0) // If we've already lowered the strobe, latch the data
begin
if(td)
begin
$sformat(str, "%0000000000d\n", count);
strpos = 0;
td = 0;
end
str = str << 8;
wrf = 1;
strpos = strpos + 1;
if(strpos == STR_SIZE)
td = 1;
end
end
assign RD_ = rd;
assign WR = wrf;
assign USBD = str[87:80];
assign LED = count[31:24];
endmodule
dispositivo de carga para aplicación Rf_Device de archivo '3s100e.nph' en /opt/Xilinx/10.1/ISE ambiente. ADVERTENCIA: Xème: 1293 - FF / Latch str_0 tiene un valor constante de 0 en el bloque . Esta FF / bloqueo será recortado durante la optimización proceso.
ADVERTENCIA: Xème: 1896 - Debido a la otra FF / Latch recorte, FF / Latch str_1 tiene un valor constante de 0 en el bloque . Esta FF / bloqueo será recortado durante la optimización proceso.
ADVERTENCIA: Xème: 1896 - Debido a la otra FF / Latch recorte, FF / Latch Str_2 tiene un valor constante de 0 en el bloque . Esta FF / bloqueo será recortado durante la optimización proceso.
Solución
La tarea $ sformat es poco probable que sea synthesisable - tener en cuenta el tipo de hardware necesitaría el compilador para producir implementar esta función! Esto significa que su 'str' Nunca registro se actualiza, por lo que el compilador cree que puede optimizar la basura. Considere un contador BCD, y tal vez una tabla de búsqueda para convertir los códigos BCD a los códigos ASCII.
bloques 'iniciales' yo sepa no son synthesisable. Para inicializar los fracasos, utilice una señal de reset. Recuerdos necesitan un 'para' bucle como que tiene, pero que se dispara sólo después de un reinicio.