Pourquoi XST mes registres loin l'optimisation et comment puis-je arrêter?
Question
J'ai un programme simple Verilog qui incrémente un compteur 32 bits, convertit le nombre en une chaîne ASCII à l'aide de sformat $ et pousse alors la chaîne à la machine hôte 1 octet à la fois à l'aide d'un FTDI FT245RL.
Malheureusement Xilinx XST maintient l'optimisation de loin le vecteur de registre de chaîne. J'ai essayé de bidouiller avec diverses routines d'initialisation et d'accès sans succès. Je ne peux pas sembler désactiver l'optimisation, et tous les exemples que je trouve en ligne diffèrent très peu de mes routines d'initialisation. Qu'est-ce que je fais 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
Dispositif de chargement pour l'application Rf_Device de fichier « 3s100e.nph » en environnement /opt/Xilinx/10.1/ISE. AVERTISSEMENT: Xème: 1293 - FF / Latch str_0 a une valeur constante de 0 à bloc . Cette FF / Latch sera parés lors de l'optimisation processus.
AVERTISSEMENT: Xème: 1896 - En raison d'autres FF / parage Loquet, FF / Latch Str_1 a une valeur constante de 0 à bloc . Cette FF / Latch sera parés lors de l'optimisation processus.
AVERTISSEMENT: Xème: 1896 - En raison d'autres FF / parage Loquet, FF / Latch str_2 a une valeur constante de 0 à bloc . Cette FF / Latch sera parés lors de l'optimisation processus.
La solution
La tâche sformat de $ est peu susceptible d'être synthétisable - considérer ce matériel le compilateur aurait besoin de produire pour mettre en œuvre cette fonction! Cela signifie que votre « str » registre n'est mis à jour, de sorte que le compilateur pense qu'il peut optimiser l'écart. Considérons un compteur BCD, et peut-être une table de consultation pour convertir les codes BCD aux codes ASCII.
blocs 'initial' ne sont pas afaik synthétisable. Pour initialiser flops, utilisez un signal de réinitialisation. Les souvenirs ont besoin d'un « pour » la boucle comme vous avez, mais qui déclenche uniquement après la réinitialisation.