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' 部分/应用说明,它将告诉您如何操作以及陷阱(例如,从同一位置同时写入和读取)