-1

最近一段时间,我在一个使用查找表数组并让 yosys 将它们推断为块 ram 的项目中遇到了麻烦。Yosys 一直认为我的阵列中的一个或另一个应该使用逻辑单元来实现。

例子:

reg signed [11:0] dynamicBuffer [0:2047];

被推断为 IceStorm LC,因此很快超出了我的逻辑单元预算。

Info: Device utilisation:
Info:            ICESTORM_LC: 83524/ 7680  1087%
Info:           ICESTORM_RAM:    18/   32    56%
Info:                  SB_IO:    36/  256    14%
Info:                  SB_GB:     8/    8   100%
Info:           ICESTORM_PLL:     2/    2   100%
Info:            SB_WARMBOOT:     0/    1     0%

我读过一个数组需要有一个注册的输出,或者 Yosys 不认为它是 ram(这是真的吗?)我试图修改一些东西,以便我的数组最终在每个时钟计数时路由到一个寄存器。但我仍然无法让它工作。使用多个阵列,将它们一个一个复制到另一个,并让 yosys 将它们推断为块 RAM 的正确方法是什么?我需要避免什么?

4

3 回答 3

0

假设您在上一个示例中使用 for 循环,硬件中的 for 循环不会像在软件中那样按顺序运行,而是在一个时钟内完成整个复制。您需要使用计数器和状态机进行复制,而不是 Verilog for 循环。

于 2020-07-03T08:22:00.457 回答
0

我读过一个数组需要有一个注册的输出,或者 Yosys 不认为它是 ram(这是真的吗?)

对,是真的。我可以让 Yosys 推断 BRAM 的唯一方法是使其成为具有输入和输出的异步 BRAM。我从我的 VFD 显示控制器项目中获取了这个

module GRAM(
input R_CLK,
input W_CLK,

input [7:0]GRAM_IN,
output reg [7:0]GRAM_OUT,

input [11:0] GRAM_ADDR_R,
input [11:0] GRAM_ADDR_W,

input G_CE_W,
input G_CE_R);

reg [7:0] mem [3002:0];// change this to what you want.

initial mem[0] <= 255;// fill the first byte to let Yosys infer to BRAM.

always@(posedge R_CLK) begin// reading from RAM sync with reading clock.
    if(G_CE_R)
        GRAM_OUT <= mem[GRAM_ADDR_R];   
end 

always@(posedge W_CLK) begin// writing to RAM sync with writing clock.
    if(G_CE_W)
        mem[GRAM_ADDR_W] <= GRAM_IN;
end

endmodule// GRAM
于 2021-11-28T16:59:41.897 回答
-1

在这种情况下,解决方案是实现异步 fifo。

当我连接两个模块时,我正在跨越时钟域,因此需要同步阵列的读取和写入。对数组的读取和写入之间缺乏协调导致 yosys 推断该数组不是作为块 ram 实现的。

于 2020-07-07T17:57:19.313 回答