Verilog 如何防止ISE编译器优化我的数组?

Verilog 如何防止ISE编译器优化我的数组?,verilog,fpga,xilinx-ise,Verilog,Fpga,Xilinx Ise,我是Verilog、ISE、FPGA的新手。我试图在FPGA中实现一个简单的设计,但整个设计都在优化中。它基本上是一个具有一些任意值的二维数组。代码如下: module top( output reg out ); integer i; integer j; reg [5:0] array [0:99][0:31]; initial begin for(i=0;i<100;i=i+1) begin for(j=0;j<32;j=j+1) b

我是Verilog、ISE、FPGA的新手。我试图在FPGA中实现一个简单的设计,但整个设计都在优化中。它基本上是一个具有一些任意值的二维数组。代码如下:

module top(
    output reg out
);

integer i;
integer j;
reg [5:0] array [0:99][0:31];

initial begin
    for(i=0;i<100;i=i+1) begin
            for(j=0;j<32;j=j+1) begin
                    array[i][j] = j;
                    out = array[i][j];
            end
    end
end

endmodule
模块顶部(
输出寄存器输出
);
整数i;
整数j;
reg[5:0]数组[0:99][0:31];
初始开始

对于(i=0;i,您的设计被合成的原因是您没有在模块中描述任何逻辑

设计中唯一的块是
初始
块,除了有限的情况外,通常不用于合成;该构造主要用于模拟中的测试台(通过ModelSim或其他simluator运行Verilog)

您想要的是使用
始终
块或
赋值
语句来描述逻辑,以便XST合成为网表,供FPGA仿真。由于您提供的模块没有这两种结构,因此无法生成网表,因此无法合成任何内容

在你的例子中,不完全清楚你想要描述的逻辑是什么,作为你模块的结果,
out
总是等于31。如果你想要
out
在值0到31之间循环,你需要添加一些顺序逻辑来实现它。在网上搜索一些关于数字设计的教程,这样你就有了写下基本原理(组合逻辑、门、寄存器等)。然后,思考一下您希望设计做什么,并将其映射到这些组件。然后,编写描述该设计的Verilog

根据评论进行编辑:

您在报告中没有得到LUT/FF使用的原因是FPGA不需要使用任何资源(或没有这些资源)来实现您的模块。由于
out
绑定到常量31,它将始终具有值1,因此FPGA只需要将
out
绑定到Vdd(请注意,
out
不是31,因为它只是一个1位寄存器)。其他数组值从不使用也不访问,因此FPGA将它们合成掉(即,not output需要知道
array[0][1]
的值,因为
out
是一个常量,并且设计中不存在其他端口)。为了保留阵列,您只需以某种方式使用它来驱动某些输出。以下是一个基本示例:

module top( input [6:0] i_in, // Used to index the array like i
            input [4:0] j_in, // Used to index the array like j
            output reg [5:0] out // Note, out is now big enough to store all the bits in array
          );

  integer i;
  integer j;
  reg [5:0] array[0:99][0:31];

  always @(*) begin
    // Set up the array, not necessarily optimal, but it works
    for (i = 0; i < 100; i = i + 1) begin
      for (j = 0; j < 32; j = j + 1) begin
        array[i][j] = j;
      end
    end

    // Assign the output to value in the array at position i_in, j_in
    out = array[i_in][j_in];
  end

endmodule
moduletop(在中输入[6:0]i\u//用于像i一样索引数组
输入[4:0]j_in,//用于索引数组,如j
output reg[5:0]out//注意,out现在足够大,可以存储阵列中的所有位
);
整数i;
整数j;
reg[5:0]数组[0:99][0:31];
始终@(*)开始
//设置阵列,不一定是最优的,但它可以工作
对于(i=0;i<100;i=i+1)开始
对于(j=0;j<32;j=j+1)开始
数组[i][j]=j;
结束
结束
//将输出分配给数组中i_in,j_in位置的值
out=数组[i_in][j_in];
结束
端模

如果您将输入
i_in
j_in
连接到开关或其他东西,并将
out
连接到6个LED,您应该能够使用开关对阵列进行索引,并在LED上获得输出,以确认您的设计。

我同意,但是……
initial
在XST的合成中完全受支持(只要指定的值是常量)。对于寄存器,它是寄存器的
INIT
值,对于内存,它是它的初始内容。例如,它对ROM非常有用。您可以查阅XST用户指南了解更多详细信息:非常正确,这就是我说的有限情况的原因:)不过,您需要在
分配
始终
以实际读取ROM/RAM或寄存器(初始
不转换为任何逻辑)中执行另一个过程.由于OP对Verilog来说是新的,在他掌握了基本原理之前,我不想讨论它;但要记住这是一件好事。我将初始块更改为always块,并通过了合成和实现。然而,设计仍在完全优化。对此有什么想法吗?顺便说一句,我会确保找到一个好的入门级为了获得一些基本的VerilogIt优化了,因为out只有一个可能的值。你需要一个输入才能成为函数的一部分。是的,又是这样。最后一个问题:现在一切都正常工作了,但我的MAP报告告诉我没有使用LUT、FFs或任何端口。只有两个端口(一进一出)有道理吗?不管怎样,有没有办法将数组的每个值存储在FPGA中?存储在一个或多个REG中,或者类似的东西中?谢谢大家的帮助