如何在xilinx中使用动态变量
how to use dynamic variable in 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
编写行为 Verilog 代码和 RTL Verilog 代码(即,将在 ASIC 或 FPGA 中实现的可综合代码)之间存在一个关键区别。对于 RTL,重要的是要记住您正在使用 Verilog 作为一种硬件描述语言,而不仅仅是 C 或众多其他编程语言的另一种替代语言。因此,您需要牢记要描述的硬件类型。真正的硬件模块和芯片有输入和输出,所以你必须指定它们。如果您没有任何输出,逻辑合成器将愉快地优化您的所有代码,因为如果现在有输出,模块就不需要任何代码。所以你需要指定 I/O.
您无需担心逻辑归约和卡诺图;综合引擎将为您对组合逻辑进行这种优化。但是您应该对您尝试实现的存储类型(寄存器、锁存器、RAM、ROM)以及组合逻辑云将如何连接到它有所了解。所有同步逻辑都需要时钟来驱动这些存储元件。您应该对每个逻辑阶段的结果如何通过您的设计进行流水线化有一些计划,即使只是一个粗略的草图。同步逻辑需要在 "always" 块内定义,时钟在敏感列表中。初始块通常不用于硬件(例外:某些 FPGA 允许您使用初始块来指定 RAM 的上电条件,这是 ASIC 无法做到的)。
终于真正的硬件不来来去去。您可以创建一个参数化模块,为特定功能实现足够的逻辑,但您不能像您在此代码中尝试做的那样更改 运行 时间存在的逻辑量。 RTL 允许参数化结构,动态结构则不允许,因为一旦设计被综合就无法创建新逻辑。如果您需要即时更改某些东西的大小,那么您将不得不编写您需要的最大设计并在 运行ning 期间有选择地使用它的子部分。
我正在尝试使用带有动态变量的 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
编写行为 Verilog 代码和 RTL Verilog 代码(即,将在 ASIC 或 FPGA 中实现的可综合代码)之间存在一个关键区别。对于 RTL,重要的是要记住您正在使用 Verilog 作为一种硬件描述语言,而不仅仅是 C 或众多其他编程语言的另一种替代语言。因此,您需要牢记要描述的硬件类型。真正的硬件模块和芯片有输入和输出,所以你必须指定它们。如果您没有任何输出,逻辑合成器将愉快地优化您的所有代码,因为如果现在有输出,模块就不需要任何代码。所以你需要指定 I/O.
您无需担心逻辑归约和卡诺图;综合引擎将为您对组合逻辑进行这种优化。但是您应该对您尝试实现的存储类型(寄存器、锁存器、RAM、ROM)以及组合逻辑云将如何连接到它有所了解。所有同步逻辑都需要时钟来驱动这些存储元件。您应该对每个逻辑阶段的结果如何通过您的设计进行流水线化有一些计划,即使只是一个粗略的草图。同步逻辑需要在 "always" 块内定义,时钟在敏感列表中。初始块通常不用于硬件(例外:某些 FPGA 允许您使用初始块来指定 RAM 的上电条件,这是 ASIC 无法做到的)。
终于真正的硬件不来来去去。您可以创建一个参数化模块,为特定功能实现足够的逻辑,但您不能像您在此代码中尝试做的那样更改 运行 时间存在的逻辑量。 RTL 允许参数化结构,动态结构则不允许,因为一旦设计被综合就无法创建新逻辑。如果您需要即时更改某些东西的大小,那么您将不得不编写您需要的最大设计并在 运行ning 期间有选择地使用它的子部分。