为什么这个 Verilog RAM 修改在资源使用方面更好?

电器工程 FPGA 验证日志 优化 格子 yosys
2022-01-23 10:34:21

我正在使用开源工具链Yosys > NextPnr > IcePack来合成 Lattice HX8K FPGA 的代码。这是 1Kb RAM 的通用版本(我将其用作 VGA 模块的视频 RAM):

module text_ram #(
    parameter A = 10,
    parameter D = 8
  ) (
    input  clk,
    input  we,
    input  [A-1:0] addr,
    input  [D-1:0] din,
    output reg [D-1:0] dout
  );

  reg [D-1:0] vram [0:(1<<A)-1];   // 2^A memory spaces of D bits

  initial
    $readmemh("lib/video.hex", vram, 0, 1024);

  always @(posedge clk) begin
      if (we) vram[addr] <= din;
      dout <= vram[addr];
  end
endmodule

分析资源icebox_stat(连同我拥有的所有其他逻辑;对不起,但我不知道如何隔离单个组件的统计信息),它报告:

DFFs:     21
LUTs:    204
CARRYs:   26
BRAMs:     3
IOBs:      4
PLLs:      0
GLBs:      3

现在,通过这个简单的修改(当然,这dout有所不同,但符合我的预期目的):

  always @(posedge clk)
      if (we) vram[addr] <= din;

  always @(*)
      dout <= vram[addr];

它报告:

DFFs:     21
LUTs:    151
CARRYs:   26
BRAMs:     0
IOBs:      4
PLLs:      0
GLBs:      1

不仅减少了 53 个 LUT,而且真正让我吃惊的是 BRAM 的使用似乎消失了!有人可以解释一下为什么吗?此外,我如何检查此类案例以确保我了解Yosys 和 NextPnr 的基本决策?

2个回答

正如约书亚所说,这里显然有问题。综合工具明显优化了你的记忆。

在对 ice40 blockram 进行快速阅读后,它似乎已经注册了输出,因此使输出组合将迫使该工具使用一大堆寄存器而不是 blockram。

在这里推测一下,但我想知道 readmemh 是否只适用于综合工具能够推断为 blockram 的东西,而不适用于“大块寄存器”。

另一种可能性是您忘记正确连接某些输入和/或输出。通过综合工具所做的积极优化,如果没有功能设计,您将无法真正测试资源使用情况。

通常,如果我的设计显示资源减少,则意味着它实际上“优化”了某些东西。我怀疑这里也发生了同样的事情。

典型的 FPGA 工具链会删除不直接或间接影响输出引脚的所有内容。

检查 Yosys 正在做什么的最佳方法似乎包括使用“显示”命令: http ://www.clifford.at/yosys/files/yosys_appnote_011_design_investigation.pdf