Verilog 如何防止ISE编译器优化我的数组?
我是Verilog、ISE、FPGA的新手。我试图在FPGA中实现一个简单的设计,但整个设计都在优化中。它基本上是一个具有一些任意值的二维数组。代码如下: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
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中,或者类似的东西中?谢谢大家的帮助