如何在xilinx中使用动态变量

时间:2015-03-31 06:47:58

标签: verilog xilinx

我正在尝试使用带有动态变量的for循环来存储数组中的元素。但是当我合成代码时,它给了我动态变量的错误。 这是在modelsim中工作正常的代码。由于它只是一个模拟器,但我想在FPGA目标设备上下载此代码。

`define LENGTH 16       //length of array elements
`define WIDTH 8         //width of element in array

module multi;

integer i,j,k,f,l,n=0;
integer r=0;
integer c;

reg [`WIDTH-1:0] reuse [0:(`LENGTH/2)-1]; 
reg [`WIDTH-1:0] local [0:`LENGTH-1];
reg [`WIDTH-1:0] arr   [0:`LENGTH-1];

initial
begin
  $readmemh("block.txt", arr);

    for(i=0;i<`LENGTH;i=i+1)begin
        c=0;
        for(l=0;l<r;l=l+1)begin
            if(reuse[l] ==arr[i])begin
              c=c+1;
            end
        end
        if(c==0)begin
            f=0;
            for(j=0;j<n;j=j+1)begin
                if(local[j]==arr[i])begin
                reuse[r]=arr[i];
                r=r+1;
                f=1;
                    for(k=j;k<n-1;k=k+1)begin
                    local[k]=local[k+1];
                    end
                    local[n-1]=4'hx;
                    n=n-1;
                end
            end 
            if(f==0)begin
                local[n]=arr[i];
                n=n+1;
            end
        end
    end
    $display("reuse:");
    for (i=0; i < (`LENGTH/2); i=i+1)
      $display("%d:%h",i,reuse[i]);
    $display("local:");
    for (i=0; i < `LENGTH; i=i+1)
      $display("%d:%h",i,local[i]);
end
endmodule

1 个答案:

答案 0 :(得分:1)

编写行为Verilog代码和RTL Verilog代码(即可在ASIC或FPGA中实现的可综合代码)之间存在关键差异。 RTL的重要之处在于要记住,您使用Verilog作为硬件描述语言,而不仅仅是C或其他众多编程语言的替代品。所以你需要记住你想要描述的硬件类型。真正的硬件模块和芯片具有输入和输出,因此您必须指定这些。如果您没有任何输出,逻辑合成器将很乐意优化您的所有代码,因为如果现在有输出,模块不需要任何代码。所以你需要指定I / O.

您无需担心逻辑缩减和卡诺图;合成引擎将为您进行组合逻辑的这种优化。但是你应该知道你试图实现什么样的存储(寄存器,锁存器,RAM,ROM)以及组合逻辑的云将如何连接它。所有同步逻辑都需要时钟来驱动这些存储器元件。您应该有一些计划,以了解每个逻辑阶段的结果如何通过您的设计流水线化,即使只是粗略的草图。同步逻辑需要在“始终”块内定义,灵敏度列表中的时钟。初始模块通常不用于硬件(例外:某些FPGA允许您使用初始模块来指定RAM的上电状态,这是ASIC无法实现的)。

最后真正的硬件来来去去。您可以创建一个为特定函数实现足够逻辑的参数化模块,但是您无法像在此代码中尝试那样在运行时更改存在的逻辑量。在RTL中允许参数化结构,动态结构不是,因为一旦合成设计就无法创建新逻辑。如果您需要动态更改大小,那么您必须编写所需的最大设计,并在运行时有选择地使用它的子部分。