tag 标签: xst

相关博文
  • 热度 14
    2013-12-31 09:57
    1224 次阅读|
    0 个评论
    这里想说一下我对综合选项的设置。设置的依据是ISE的帮助,网上的资料,以及自己的理解。请大家能为我指正设置得不合理的地方。 没有提及的选项采用缺省设置。 采用的EDA软件是ISE 13.2,综合器为XST。   【Synthesis Options】   Use Synthesis Constraints File Synthesis Constraints File:   一般来说,会在implement之前,采用UCF文件对设计进行时序约束。实际上,在synthesis之前,可以先采用XCF文件对设计进行时序约束,以使XST针对时序约束进行synthesis,在synthesis时产生更好的网表。按照网上的说法,XCF中的时序约束应当要比实际需求更紧一些。   XCF文件的实际效果嘛。 我谈一下自己使用XST的情况吧。XST完成综合(synthesis)后,会产生一个估计的最大工作频率。某一次综合后,我使用XCF文件将最大工作频率约束的比XST的估值大一些,再重新进行综合后,XST给出的估值确实增大了少许。大部分时候,在重新综合后是看不到效果的。至于对最终结果的影响,就不得而知了。   XCF文件的语法与UCF文件完全一致。与UCF不同,ISE没有为XCF提供编辑的工具,只能自己用文本编辑器编辑。   Keep Hierarchy:   这个选项是设置是否在synthesis与implement中打破设计的层次结构。选项【yes】和【no】很容易理解。选项【soft】的意思则是在综合时不打破层次结构,而在之后打破层次结构。   个人理解。 打破层次结构后,有些信号就变了,不利于分析与约束。而打破层次结构,更有利于电路的优化。   【HDL Options】   FSM Encoding Algorithm:   有限状态机的编码方式。我采用了【One-Hot】(独热码)。其优缺点相信大家都非常清楚,不再赘述了。   Case Implementation Style:   case语句的实现方式。 使用verilog时,缺省状态下XST不会把case语句综合成你想象的结构。 这点,大家可以自己写一段简单的代码试试。   以一个独热码状态机为例: 以下是代码片段: reg sta; case(1'b1) sta : ...; sta : ...; sta : ...; endcase   首先,综合出来的电路不止判断一个比特。 XST不知道sta只会出现3'b100、3'b010、3'b001三种可能,它会把诸如3'b101这样的状态也考虑在内,大概把电路综合成如下的样子:   以下是代码片段: reg sta; case (sta) 3'b001: ...; 3'b010: ...; 3'b100: ...; default: ...; endcase   这样,采用独热码似乎没有什么意义。而且因为采用独热码时,sta的比特数比采用格雷码时更多,复杂度反而还增加了。   另外,XST也可能没有把case语句转换为并行结构,而是有优先级的结构。   【Case Implementation Style】中有三个选项:【Full】、【Parallel】与【Full-Parallel】。其中,【Full】针对上述的第一点,向XST说明有些状态是不可能出现的,让XST不要考虑太多;【Parallel】让XST将case语句综合为并行的电路结构;【Full-Parallel】则是两者的结合。   对于状态机,这项设置的影响很大。 器件为xc6vlx240t-1ff1156时,同样代码的8状态独热码状态机,缺省设置时占用11个寄存器、6个查找表,只能工作在575 MHz时钟频率下;改为【Full-Parallel】设置后,占用11个寄存器、3个查找表,可以工作在900 MHz时钟频率下。   【Xilinx Sepcific Options】   Max Fanout  Register Duplication:   寄存器的最大扇出。扇出是一个门需要驱动的门数目。如果一个门的扇出很大,那么它的输出布线将非常拥塞,布线的时延可能就会很长。在时序报告中,如果看到逻辑一条路径的逻辑时延很短,但布线时延很长,很可能的原因就是信号的扇出太大。这样,即使设计时保证了此处的组合逻辑很简单,也无法减少时延。   一个有效的方法是寄存器复制。也就是说,像下图一样,为大扇出的门加入一些副本,让这些完全相同的门来分担扇出。寄存器复制可以通过代码来实现,不过显然,这样做是非常麻烦的。而【Max Fanout】这个选项,能够使XST自动实现寄存器复制。在综合时,通过这个选项为所有寄存器都加上扇出的限制,一旦寄存器的扇出大于设置的值,XST会自动进行寄存器复制。在我的设计中,将最大输出设为20。     不过这么做没法解决所有的问题。一方面,XST只能做寄存器复制,对于扇出大的组合逻辑,就没有办法了;另一方面,XST也无法跨越模块进行优化。对于第一个问题,可以对大扇出的组合逻辑一级寄存器缓冲一下,这样就可以复制了。对于第二个问题,采用扁平化的设计是一种方法,不过这样会为设计带来很大的困难。 另一种方法,是在模块的边界处加入寄存器,即对模块的输入输出都进行缓存。 这是比较推荐的做法。   顺便提一句,在【Map Properties】中,同样有【Register Duplication】的选项。该选项是根据时序约束(而非对扇出的限制)来进行寄存器复制。   Equivalent Register Removal:   把设计中等效的寄存器去掉,合并为一个。显然,这个选项让人感觉与【Register Duplication】是互斥的。但是,在设置时,这两个选项是能够同时勾选的。因为不知道同时勾选的效果会是怎样的,我把这个选项前面的复选框去掉了。   要点总结 case 语句未必被综合为并行电路。需要并行电路的话,需要设置【HDL Options】中的【Case Implementation Style】。 配合【Max Fanout】与【Register Duplication】来进行全局的寄存器复制,以减小扇出。
  • 热度 25
    2012-3-30 08:51
    5538 次阅读|
    0 个评论
      Description General Description:  What type of clock statements does XST support?  XST does not support the use of a complex condition check inside an always block in Verilog. For example, the following code results in the error below:  always @( negedge input1 or negedge input2 or posedge clock )  begin  if ( ~input1 | ~input2 )   begin  output1 = 1'b1;  output2 = 1'b0;  end  else   begin  output1 = input1;  output2 = input2 input1;  end  end  "ERROR:Xst:899 - "file_name", line #: The logic for "net_name" does not match a known FF or Latch template." Solution To avoid this error, perform the combinatorial logic outside the always block to remove the complex clock statement from the sensitivity list, and then use that intermediate signal in the sensitivity list of the always block, as follows:  assign temp = ~input1 | ~input2;  always @( posedge temp or posedge clock )  begin  if ( temp )   begin  output1 = 1'b1;  output2 = 1'b0;  end  else   begin  output1 = input1;  output2 = input2 input1;  end  end When you infer hardware from HDL, it is important to keep the type of hardware you want in mind. The XST User Guide contains basic templates for the various types of FPGA/CPLD hardware that can be inferred with HDL code:  http://support.xilinx.com/support/software_manuals.htm    If your HDL code is modeled after the templates provided, you should be able to infer the desired hardware.  Another situation that causes this error (which is unrelated to the first example) is when the reset function in the always block has no effect on the register that will be inferred:  module misc(clk,rst,in1,out1);  input clk,rst,in1;  output out1;  reg out1;  always @(posedge clk or posedge rst)  begin  if (rst)  out1 = in1;  else  out1 = {in1,in1};  end  endmodule    change to:  module misc(clk,rst,in1,out1);  input clk,rst,in1;  output out1;  reg out1;  always @(posedge clk or posedge rst)  begin  if (rst)  out1 = 0;  else  out1 = {in1,in1};  end  endmodule The error message also appears when a dual-edge triggered FF is inferred in any device other than a CoolRunner-II. The CoolRunner-II is the only Xilinx device that contains dual-edge triggered FFs:  :  always @(posedge clk or negedge clk)  :   我遇到的情况是: always @ (posedgeodd_done or posedgeeven_done) begin 。。。 虽然综合时报错的是其它语句,但经人指点修改这个地方后,综合时不再报错。可见多个上升沿作为敏感源的做法确实不大值得推荐。但这样也不是一定会报错,因为我试过有的程序采用这样的写法也不会报错。
相关资源
  • 所需E币: 3
    时间: 2019-12-25 16:33
    大小: 1MB
    上传者: 2iot
    CICXilinxFPGAtrainning-HDLSynthesisCICXilinxFPGAtrainingJuly20041Aftercompletingthismodule,youwillbeableto…ListthesynthesisoptionsforXSTDescribehowtoinsertcodefromtheLanguageTemplateSpecifyvariousmethodsforenteringconstraints2XSTTemplatesandLibrariesXSTConstraintsEntryTimingConstraintsSummaryLab63Step1:DesignHDLcodeSchematic……