Verilog 中的数组与长向量
Array vs long vectors in Verilog
我正在编写一个 Verilog 代码,需要将许多数据保存在类似内存的结构中。
我已经使用向量数组和非常长的单个向量实现了它们。
虽然我认为内部没有任何区别,如果有的话,哪种存储数据的方式更好?
我实际上是在编写将综合到电路板上的代码,因此那些对 FPGA 有丰富经验的人提供的任何实用建议都会有所帮助。
例如,我可以使用
存储 32x1024 数据
reg[31:0] temp_storage [0:1023]
或
reg[32767:0] temp_storage
数组方式对于程序员来说更容易管理,但是从硬件的角度来看有什么缺点吗?
如果我一一声明,实际上是不是一样?
reg[31:0] temp_storage0001
reg[31:0] temp_stoarge0002
.
.
.
reg[31:0] temp_storage1024
谢谢。
这两种格式有很大区别。
格式一:
reg[31:0] temp_storage [0:1023];
这可以映射* 到内存块上,因此将使用更少的 FPGA registers/recources。但是有一个惩罚:您一次最多可以读取或写入两个条目。
(如果你使用双端口内存,则有两个条目,如果你使用单端口内存,则有一个条目。现在 FPGA 中的所有嵌入式块 ram 都是双端口的)
格式二:
reg[31:0] temp_storage0001
reg[31:0] temp_stoarge0002
在这种情况下,每个 temp_storage...
都存储在一组单独的 32 个寄存器中。您可以访问任意数量的同时读写(或者直到您 运行 离开 FPGA 门为止)。因此灵活性要大得多,但这会更快地用完你的 FPGA gates/LUTS。
* 正如@B.Go 所说:检查你的 FPGA 文档 你是如何将它映射到内存的,或者推断内存 macro/IP 直接.
What do you exactly mean by maximum of two entries: temp_storage[0] <= t_data; temp_storage[1] <= t_data.
reg[31:0] temp_storage [0:1023];
上面的定义是针对一个有1024个条目的内存,每个条目32位宽。您可以 select 1024 的两个条目,您可以读取或写入每个条目。 (你的双端口内存通常有两个地址总线,两个读数据端口和两个写数据端口,每个端口通常还有两个时钟)。
您通常会使用类似以下内容访问此内存:
always @( posedge clk)
begin
if (write_enable_0)
temp_storage[address_0] <= write_data_0;
else
read_data_0 <= temp_storage[address_0];
if (write_enable_1)
temp_storage[address_1] <= write_data_1;
else
read_data_1 <= temp_storage[address_1];
end
找到您的 FPGA 系列的 'memory' 部分/应用说明,它将告诉您如何操作以及陷阱(例如,从同一位置同时写入和读取)
我正在编写一个 Verilog 代码,需要将许多数据保存在类似内存的结构中。
我已经使用向量数组和非常长的单个向量实现了它们。
虽然我认为内部没有任何区别,如果有的话,哪种存储数据的方式更好?
我实际上是在编写将综合到电路板上的代码,因此那些对 FPGA 有丰富经验的人提供的任何实用建议都会有所帮助。
例如,我可以使用
存储 32x1024 数据reg[31:0] temp_storage [0:1023]
或
reg[32767:0] temp_storage
数组方式对于程序员来说更容易管理,但是从硬件的角度来看有什么缺点吗?
如果我一一声明,实际上是不是一样?
reg[31:0] temp_storage0001
reg[31:0] temp_stoarge0002
.
.
.
reg[31:0] temp_storage1024
谢谢。
这两种格式有很大区别。
格式一:
reg[31:0] temp_storage [0:1023];
这可以映射* 到内存块上,因此将使用更少的 FPGA registers/recources。但是有一个惩罚:您一次最多可以读取或写入两个条目。 (如果你使用双端口内存,则有两个条目,如果你使用单端口内存,则有一个条目。现在 FPGA 中的所有嵌入式块 ram 都是双端口的)
格式二:
reg[31:0] temp_storage0001
reg[31:0] temp_stoarge0002
在这种情况下,每个 temp_storage...
都存储在一组单独的 32 个寄存器中。您可以访问任意数量的同时读写(或者直到您 运行 离开 FPGA 门为止)。因此灵活性要大得多,但这会更快地用完你的 FPGA gates/LUTS。
* 正如@B.Go 所说:检查你的 FPGA 文档 你是如何将它映射到内存的,或者推断内存 macro/IP 直接.
What do you exactly mean by maximum of two entries: temp_storage[0] <= t_data; temp_storage[1] <= t_data.
reg[31:0] temp_storage [0:1023];
上面的定义是针对一个有1024个条目的内存,每个条目32位宽。您可以 select 1024 的两个条目,您可以读取或写入每个条目。 (你的双端口内存通常有两个地址总线,两个读数据端口和两个写数据端口,每个端口通常还有两个时钟)。
您通常会使用类似以下内容访问此内存:
always @( posedge clk)
begin
if (write_enable_0)
temp_storage[address_0] <= write_data_0;
else
read_data_0 <= temp_storage[address_0];
if (write_enable_1)
temp_storage[address_1] <= write_data_1;
else
read_data_1 <= temp_storage[address_1];
end
找到您的 FPGA 系列的 'memory' 部分/应用说明,它将告诉您如何操作以及陷阱(例如,从同一位置同时写入和读取)