verilog防综合语句设置

我在XST综合时,未接输出端口的寄存器被优化掉了,
如何防止ISE综合时你想抓取的信号不被优化掉:

1.右键synthesis,在综合选项里将keep hierarchy选择YES ,或者选择soft(在综合时保持层次,在实现时有利用ISE软件自动进行优化),这样有利于你从模块中找到你想抓取的信号和信号名不被更改。

2.在Constraints Guide中,有防止信号被优化掉的说明。具体在X:\Xilinx\13.4\ISE_DS\ISE\doc\usenglish\isehelp文件夹下。里面介绍了如何解决信号被优化的问题。其实ISE的工程设置有“keep_hierarchy”。在程序里面,也可以通过添加一些语句。如果是Verilog :

      Place the Verilog constraint immediately before the module or instantiation . 
      Specify the Verilog constraint as follows:
      (* KEEP = “{TRUE|FALSE |SOFT}” *)

假如我们要观察的一个信号cnt:reg [10:0] cnt;,那么就按照文档中的介绍,要保持此信号不被综合,则:
(* KEEP = “TRUE” ) reg [10:0] cnt ,或者 ( keep= “true” *) reg [10:0] cnt
这样就可以实现ChipScope的观察而不被优化掉了。类似的VHDL:

     Declare the VHDL constraint as follows:
     attribute keep : string;
    Specify the VHDL constraint as follows:
    attribute keep of signal_name: signal is “{TRUE|FALSE|SOFT}”;

当然,这些都是针对ISE的综合器XST的,如soft只有在XST里才可以使用,其它的综合工具,可以参看相关的文档,这些问题都有专业而又明确的说明。

一、使用Xilinx公司的ChipScope
  使用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信号进行观察。
2、使用Synplify Pro综合
Synplify Pro对wire、reg类型的信号有着不同的综合属性。
(1) 对于wire型信号,使用/* synthesis syn_keep=1 */综合属性,例如下面的语句:
wire [7:0] data_in /* synthesis syn_keep=1 */;
(2) 对于reg型信号,使用/* synthesis preserve = 1 */综合属性,例如下面的语句:
reg [7:0] data_in /* synthesis preserve = 1 */;

二、使用Altera公司的SignalTap
1、使用Altera自带的综合器综合
Altera自带的综合器为了防止某些信号综合器优化掉,也有自己的一套综合约束属性。
(1)对于reg型信号,为了防止Altera自带综合器将其优化掉,可以添加noprune属性。这样就可以防止某些寄存器信号被优化掉。也可以使用/synthesis noprune/综合属性。
复制代码
`include “define.v”

module SignalTap_test(

            Clk     ,

            Rst     ,

            Cnt                        

            ) /*synthesis noprune*/ ;

input wire Clk ;

input wire Rst ;

output reg [7:0] Cnt ;

always@(posedge Clk or posedge Rst)

begin

if( Rst == 1'b1)

    Cnt <= 8'h0;

else

    Cnt <= #`ULDY Cnt + 1'b1;

end

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厂商都支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章