为什么XST优化了我的寄存器以及如何阻止它?

MrE*_*vil 1 embedded verilog fpga xilinx

我有一个简单的verilog程序,它增加一个32位计数器,使用$ sformat将数字转换为ASCII字符串,然后使用FTDI FT245RL一次将字符串推送到主机1字节.

不幸的是,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 
Run Code Online (Sandbox Code Playgroud)

在环境/opt/Xilinx/10.1/ISE中从文件'3s100e.nph'加载应用程序Rf_Device的设备.警告:Xst:1293 - FF/Latch str_0在块中的常量值为0.在优化过程中将修剪此FF/Latch.

警告:Xst:1896 - 由于其他FF/Latch修整,FF/Latch str_1在块中的常量值为0.在优化过程中将修剪此FF/Latch.

警告:Xst:1896 - 由于其他FF/Latch修整,FF/Latch str_2在块中的常量值为0.在优化过程中将修剪此FF/Latch.

Mar*_*rty 6

$ sformat任务不可能是可综合的 - 考虑编译器为实现这个功能需要生成哪些硬件!这意味着您的'str'寄存器永远不会更新,因此编译器认为它可以优化它.考虑一个BCD计数器,可能还有一个查找表,用于将BCD代码转换为ASCII代码.

AFAIK'初始'块不可合成.要初始化触发器,请使用复位信号.记忆需要像你一样的'for'循环,但只有在重置后才会触发.