Почему XST оптимизирует мои регистры и как мне это остановить? - PullRequest
1 голос
/ 18 апреля 2009

У меня есть простая программа 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' в среда /opt/Xilinx/10.1/ISE. ВНИМАНИЕ: Xst: 1293 - FF / Latch str_0 имеет постоянное значение 0 в блоке , Этот FF / Latch будет обрезается при оптимизации процесс.

ВНИМАНИЕ: Xst: 1896 - В связи с другими FF / Обрезка защелки, FF / Защелка str_1 имеет постоянное значение 0 в блоке , Этот FF / Latch будет обрезается при оптимизации процесс.

ВНИМАНИЕ: Xst: 1896 - В связи с другими FF / Обрезка защелки, FF / Защелка str_2 имеет постоянное значение 0 в блоке , Этот FF / Latch будет обрезается при оптимизации процесс.

1 Ответ

6 голосов
/ 18 апреля 2009

Задача $ sformat вряд ли будет синтезируемой - подумайте, какое аппаратное обеспечение потребуется компилятору для реализации этой функции! Это означает, что ваш регистр 'str' никогда не обновляется, поэтому компилятор считает, что может его оптимизировать. Рассмотрим счетчик BCD и, возможно, справочную таблицу для преобразования кодов BCD в коды ASCII.

AFAIK «начальные» блоки не могут быть синтезированы. Для инициализации флопов используйте сигнал сброса. Воспоминаниям нужен цикл «для», как у вас, но который срабатывает только после сброса.

...