Por que é XST otimizar os meus registos e como faço para pará-lo?
Pergunta
Eu tenho um simples verilog programa que incrementa um contador de 32 bits, converte o número para uma string ASCII usando $ sformat e depois empurra a corda para o host de máquina 1 byte de cada vez usando um FTDI FT245RL.
Infelizmente Xilinx XST continua otimizando afastado o vetor de strings registo. Eu tentei perder tempo com várias rotinas de inicialização e acesso sem sucesso. Eu não consigo desligar otimização, e todos os exemplos que eu encontrar on-line diferem muito pouco dos meus rotinas de inicialização. O que estou fazendo de errado?
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
Carregando dispositivo para aplicação Rf_Device de arquivo '3s100e.nph' em ambiente /opt/Xilinx/10.1/ISE. AVISO: Xst: 1293 - FF / Trava str_0 tem um valor constante de 0 no bloco . Este FF / Trava será aparadas durante a otimização processo.
AVISO: Xst: 1896 - Devido a outra FF / Trava rechego, FF / Trava str_1 tem um valor constante de 0 no bloco . Este FF / Trava será aparadas durante a otimização processo.
AVISO: Xst: 1896 - Devido a outra FF / Trava rechego, FF / Trava str_2 tem um valor constante de 0 no bloco . Este FF / Trava será aparadas durante a otimização processo.
Solução
A tarefa sformat $ é improvável que seja synthesisable - considerar o que hardware o compilador seria necessário para produzir para implementar esta função! Isso significa que seu 'str' registo nunca é atualizado, para que o compilador acha que pode otimizá-lo afastado. Considere um contador BCD, e talvez uma tabela de pesquisa para converter os códigos BCD para códigos ASCII.
blocos AFAIK 'iniciais' não são synthesisable. Para inicializar-flops, use um sinal de reset. Memórias precisa de um 'para' loop como você tem, mas que gatilhos só depois reiniciado.