Perché XST ottimizzando via i miei registri e come posso fermarlo?
Domanda
Ho un semplice programma Verilog che incrementa un contatore a 32 bit, converte il numero in una stringa ASCII utilizzando $ sformat e poi spinge la stringa per l'host macchina 1 byte alla volta utilizzando un FTDI FT245RL.
Purtroppo Xilinx XST mantiene ottimizzando via il vettore registro stringa. Ho provato a gingillarsi con i vari inizializzazione e di accesso routine senza successo. Non riesco a disattivare l'ottimizzazione, e tutti gli esempi che ho trovato on-line differiscono pochissimo da mia routine di inizializzazione. Che cosa sto facendo di sbagliato?
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 di caricamento per l'applicazione Rf_Device da file '3s100e.nph' in ambiente /opt/Xilinx/10.1/ISE. ATTENZIONE: Xst: 1293 - FF / Latch str_0 ha un valore costante di 0 nel blocco . Questo FF / Latch sarà rifilato durante l'ottimizzazione processo.
ATTENZIONE: Xst: 1896 - A causa di altri FF / Latch rifilatura, FF / Latch str_1 ha un valore costante di 0 nel blocco . Questo FF / Latch sarà rifilato durante l'ottimizzazione processi.
ATTENZIONE: Xst: 1896 - A causa di altri FF / Latch rifilatura, FF / Latch str_2 ha un valore costante di 0 nel blocco . Questo FF / Latch sarà rifilato durante l'ottimizzazione processo.
Soluzione
Il compito $ sformat è improbabile che sia sintetizzabile - in considerazione ciò che l'hardware del compilatore avrebbe bisogno di produrre per implementare questa funzione! Questo significa che il 'str' Registra non viene mai aggiornato, in modo che il compilatore pensa di poter ottimizzare la via. Si consideri un contatore BCD, e forse una tabella di ricerca per convertire i codici BCD ai codici ASCII.
AFAIK blocchi 'iniziali' non sono sintetizzabile. Per inizializzare flop, utilizzare un segnale di reset. I ricordi hanno bisogno di un 'per' ciclo come avete, ma che innesca solo dopo il reset.