Почему XST оптимизирует мои регистры и как мне это остановить?

StackOverflow https://stackoverflow.com/questions/763224

  •  11-09-2019
  •  | 
  •  

Вопрос

У меня есть простая программа 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', как у вас, но который срабатывает только после сброса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top