X14:Verilog中的3002

时间:2016-03-27 09:03:13

标签: verilog synthesis

我在ISE 14.7上创建了一个downcounter。 我设置了一个异步复位(rst_n),每当它变为0时,counter的值将被设置为init_value。

但是当我合成代码时, 出现警告:Xst3002

代码:

`timescale 1ns / 1ps

module downcounter(value, borrow, clk, rst_n, decrease, init_value, limit);
    output reg [3:0]value;              //value of counter
    output reg borrow;                  //borrow indicator
    input clk, rst_n, decrease;         //clock; active low reset; to decrease
    input [3:0]init_value, limit;       //initial value; counter limit

    reg [3:0]value_tmp, init_value_tmp; //for always block

    //Combinational logic
    always @(value or decrease or limit or borrow)begin
        if(~decrease) begin value_tmp = value; borrow = 0; end      //if decrease is 0, the counter stops counting down.
        else begin
            if(value == 0)begin value_tmp = limit; borrow = 1; end  //if the value is 0, the next value would be the limit.
            else begin value_tmp = value + 4'b1111; borrow = 0; end //Ex: limit = 9, so that value(now) = 0, then value(next) = 9 in decimal.
        end
    end
    //Sequentical logic
    always @(posedge clk or negedge rst_n) begin
        if(~rst_n) value <= init_value_tmp;             //asynchronous reset. set the value to initial value
        else begin
            value <= value_tmp;
        end
    end
endmodule

和警告信息:

  

警告:Xst:3002 - 此设计包含一个或多个寄存器/锁存器   与Spartan6架构直接不兼容。该   造成这种情况的两个主要原因是所描述的寄存器或锁存器   同时使用异步设置和异步复位,或者使用寄存器   或者用异步设置或复位描述的锁存器   具有相反极性的初始化值(即   异步复位,初始化值为1)。       虽然可以构建该电路,但它在面积,功率和性能方面创建了次优实现。更多   最佳实现Xilinx强烈推荐其中之一   以下内容:

      1) Remove either the set or reset from all registers and latches
         if not needed for required functionality
      2) Modify the code in order to produce a synchronous set
         and/or reset (both is preferred)
      3) Ensure all registers have the same initialization value as the
         described asynchronous set or reset polarity
      4) Use the -async_to_sync option to transform the asynchronous
         set/reset to synchronous operation
         (timing simulation highly recommended when using this option)
     

请参阅http://www.xilinx.com搜索字符串&#34; Spartan6   异步设置/重置&#34;了解更多详情。

     

具有异步设置和重置的寄存器实例列表:       value_0单位       value_1单位       value_2 in unit       value_3 in unit

似乎因为[3:0]值而出现警告。但我不知道。 我试图将异步重置更改为0,警告消失了。 但这不是我想要的。

1 个答案:

答案 0 :(得分:0)

此设计存在一些问题。首先,init_value_tmp似乎没有设置值。其次,由于它是非常数,Spartan-6架构可能无法使用内置的重置功能实际重置为该值。更改value <= init_value_tmp;,以便为value分配一些有意义的常量。

至于异步重置,它似乎是有效的,但由于我没有Spartan-6设备,你必须合成它并自己尝试。我担心的是,无论你使用什么恒定值,都可能会遇到你之前得到的极性警告。同步重置很可能只是工作&#34;因为它只是CLB进入数据输入的多路复用器。

编辑:关于使用非常量重置值的目标,您几乎一定需要同步重置(更多的是分配而不是重置):< / p>

always @(posedge clk) begin
    if(~rst_n) value <= init_value_tmp;
    else begin
        value <= value_tmp;
    end
end