zoukankan      html  css  js  c++  java
  • 5.防止FPGA设计中综合后的信号被优化

         随着FPGA设计复杂程度越来越高,芯片内部逻辑分析功能显得越来越重要。硬件层次上的逻辑分析仪价格十分昂贵,而且操作比较复杂。目前,FPGA芯片的两大供应商都为自己的FPGA芯片提供了软件层面上的逻辑分析仪,可以帮助我们在线分析芯片内部逻辑。而且操作简单方便。但是往往因为某些原因,有些信号在综合的时候就会被优化掉,就可能会导致我们的设计失败,当然在为逻辑分析仪添加观察信号的时候也无法找到该信号。从而对设计、调试人员的工作带来一定的不便。下面就分别以Xilinx公司的逻辑分析仪ChipScope和Altera公司的SignalTap做以下总结:

    一、使用Xilinx公司的ChipScope

    ChipScope中添加一些引脚的信号,但列表中并没有显示,原因是综合的地方没设置好,应该将XST的属性设置成如下:keep hierarchy 处为YES

      使用ChipScope观察芯片内部的信号的之前先要在把需要观察的信号添加到ChipScope信号观察列表当中。也就是说,我们必须能够在综合的网表文件中找到相应的信号。如果是使用XST综合的话,最好保留芯片内部结构的层次,这样就可以在相应的子模块查找需要观察的信号。默认情况下,Chipscope只能观察reg类型的信号。但是通过设置属性也是可以观察wire型信号的。使用不同的综合工具需要添加的属性也不一样。

    1、使用XST综合。

    (1)对于reg型信号,如果被ISE优化掉,一般有可以把这个信号和其他没有被优化的信号进行“与”、“或”等操作。这样就可以达到观察信号的目的。

    (2)对于wire型号,对于ISE12.3以后的版本,XST综合,以Spartan3为例,可以使用(* KEEP="TRUE"*) wire [15:0] CPLD_ _AD;这样就可以在查找信号的信号找到wire类型的CPLD_ _AD信号进行观察。再不行就用reg引出。

    2、使用Synplify Pro综合

    也可参考:http://hi.baidu.com/vvbaba/item/94bb1b33af6c4b33b3c0c56e

    Synplify Pro对wire、reg类型的信号有着不同的综合属性。

    (1) 对于wire型信号,使用/* synthesis syn_keep=1 */综合属性,例如下面的语句:

    1 wire  [7:0]  data_in  /* synthesis syn_keep=1 */;

    (2) 对于reg型信号,使用/* synthesis preserve = 1 */综合属性,例如下面的语句:

    1 reg  [7:0]   data_in  /* synthesis preserve = 1 */;

    二、使用Altera公司的SignalTap

    1、使用Altera自带的综合器综合

    Altera自带的综合器为了防止某些信号综合器优化掉,也有自己的一套综合约束属性。

    (1)对于reg型信号,为了防止Altera自带综合器将其优化掉,可以添加noprune属性。这样就可以防止某些寄存器信号被优化掉。也可以使用/*synthesis noprune*/综合属性。

    01 `include "define.v"
    02 module SignalTap_test(
    03                 Clk     ,
    04                 Rst     ,
    05                 Cnt
    06                 ) /*synthesis noprune*/ ;
    07
    08 input   wire        Clk ;
    09 input   wire        Rst ;
    10 output  reg [7:0]     Cnt ;
    11 always@(posedge Clk or posedge Rst)
    12 begin
    13     if( Rst == 1'b1)
    14         Cnt <= 8'h0;
    15     else
    16         Cnt <= #`ULDY Cnt + 1'b1;
    17 end
    18 endmodule

    如上例(假设Cnt信号会被优化掉),这样添加综合属性之后,整个module的reg信号都不会被优化掉。

    跟reg相关的综合属性,除了/*synthesis noprune*/可用,还有一个/*synthesis preserve*/可用

    二者的差别在于:

    /*synthesis noprune*/ 避免Quartus II优化掉output 型的reg信号。

    /*synthesis preserve*/ 避免Quartus II把reg信号当成VCC或者GND等常数

    同时单独的reg信号也可以: (*preserve*) reg [3:0] cnt;防止被优化掉。

    (2) 对于wire类型的信号

    对于wire型信号来说,要想观察此类信号,Altera综合器提供了/*synthesis keep*/ 综合属性。如 wire [7:0] Cnt /*synthesis keep*/; 对于Quartus II 9.0以后的版本也可以使用(“keep”) wire [7:0] Cnt ;的写法。

    此外,/*synthesis keep*/也支持对reg型信号,使用它也可以防止reg型信号被优化掉。但是也有可能出现这样的情况,有的信号即使经过此处理,仍然会被综合工具优化掉,致使无法找到它。这个时候就需要对其使用“测试属性”,可以加入probe_port属性,把这两个属性结合在一起,即就是:

    ( *synthesis, probe_port,keep *) 即可,这种方法同时适应于wire和reg型信号类型。

    2、使用Synplify Pro综合

    使用Synplify Pro综合时防止信号被优化掉的方法和使用Xilinx公司 ChipScope使用Synplify Pro综合时添加的综合约束一样,因为Synplify Pro是专业的综合厂商,所以对主流的FPGA厂商都支持。

    三、总结

    1、以上的方法也不一定是全部都可以使用,有时候因为版本不对应就会导致信号依然会被优化掉。不过经过轮询之后发现,ISE 12.3以后的版本、Quartus II 9.0之后的版本、Synplify Pro 9.0.1以后的版本都可以使用。

    2、一般情况下,信号经常被优化掉,还是与代码风格或者逻辑设计有冗余有关的,所以还是应该尽量提供代码质量。在不能解决的时候再添加综合约束。

  • 相关阅读:
    (转)【web前端培训之前后端的配合(中)】继续昨日的故事
    ural(Timus) 1136. Parliament
    scau Josephus Problem
    ACMICPC Live Archive 6204 Poker End Games
    uva 10391 Compound Words
    ACMICPC Live Archive 3222 Joke with Turtles
    uva 10132 File Fragmentation
    uva 270 Lining Up
    【转】各种字符串哈希函数比较
    uva 10905 Children's Game
  • 原文地址:https://www.cnblogs.com/geekite/p/4266851.html
Copyright © 2011-2022 走看看