【问题标题】:Why is XST optimizing away my registers and how do I stop it?为什么 XST 优化了我的寄存器,我该如何阻止它?
【发布时间】:2009-04-18 09:52:06
【问题描述】:

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

不幸的是,赛灵思 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 

应用装载装置 来自文件“3s100e.nph”的 Rf_Device 环境/opt/Xilinx/10.1/ISE。 警告: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 将是 在优化期间修剪 过程。

【问题讨论】:

    标签: embedded verilog fpga xilinx


    【解决方案1】:

    $sformat 任务不太可能是可综合的 - 考虑编译器需要生产什么硬件来实现这个功能!这意味着您的“str”寄存器永远不会更新,因此编译器认为它可以优化它。考虑一个 BCD 计数器,也许还有一个将 BCD 代码转换为 ASCII 代码的查找表。

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

    【讨论】:

    • 好的!我最初不明白你所说的一半,但我花了最后几分钟查找 BCD 是什么,它看起来完全符合我的要求。我现在只需要弄清楚如何进行查找表。我对 $sformat 持怀疑态度,但编译器没有抱怨,它在模拟中完美运行,但我想我现在知道了。谢谢!
    • 查找表很简单——它们是case 语句!在模拟中,您可以做任何事情——它将代码视为程序。对于你想要综合的东西,你必须记住你描述的是硬件,而不是编程本身。
    猜你喜欢
    • 2014-05-21
    • 2012-09-29
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多