Почему XST оптимизирует мои регистры и как мне это остановить?
Вопрос
У меня есть простая программа verilog, которая увеличивает 32-битный счетчик, преобразует число в строку ASCII с помощью $ sformat, а затем отправляет строку на хост-машину по 1 байту за раз, используя FTDI FT245RL.
К сожалению, Xilinx XST продолжает оптимизировать вектор строкового регистра.Я пытался возиться с различными процедурами инициализации и доступа, но безуспешно.Кажется, я не могу отключить оптимизацию, и все примеры, которые я нахожу в Интернете, очень мало отличаются от моих процедур инициализации.Что я делаю не так?
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
Загрузочное устройство для приложения Rf_Device из файла '3s100e.nph' в environment /opt/Xilinx/10.1/ISE.ПРЕДУПРЕЖДЕНИЕ: Xst:1293 - FF/Защелка str_0 имеет постоянное значение 0 в блоке .Этот FF / Latch будет обрезан в процессе оптимизации .
ПРЕДУПРЕЖДЕНИЕ: Xst: 1896 - Из-за другого Обрезка FF / Latch, str_1 FF / Latch имеет постоянное значение 0 в блоке .Этот FF / Latch будет обрезан в процессе оптимизации .
ПРЕДУПРЕЖДЕНИЕ: Xst: 1896 - Из-за другого Обрезка FF / Latch, FF /Latch str_2 имеет постоянное значение 0 в блоке .Этот FF / Latch будет обрезан в процессе оптимизации .
Решение
Задача $ sformat вряд ли поддается синтезированию - подумайте, какое аппаратное обеспечение потребуется создать компилятору для реализации этой функции!Это означает, что ваш регистр 'str' никогда не обновляется, поэтому компилятор считает, что может оптимизировать его.Рассмотрим счетчик BCD и, возможно, таблицу подстановки для преобразования кодов BCD в коды ASCII.
AFAIK "начальные" блоки не поддаются синтезированию.Чтобы инициализировать провалы, используйте сигнал сброса.Воспоминаниям нужен цикл 'for', как у вас, но который срабатывает только после сброса.