在最近的一段时间里,我遇到了一些麻烦,因为这个项目经常使用查找表数组,并让你把它们作为块块来推断。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?我需要避免什么?
发布于 2021-11-28 16:59:41
我读过数组需要有一个注册的输出,或者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发布于 2020-07-03 08:22:00
假设您使用的是for循环,如上一个示例所示,硬件中的for循环不像在软件中那样按顺序运行,而是在一个时钟中执行整个副本。您需要使用计数器和状态机来复制副本,而不是使用Verilog for循环。
发布于 2020-07-07 17:57:19
在这种情况下,解决方案是实现异步fifo。
当我连接两个模块时,我正在跨越时钟域,这两个模块需要同步从数组中读取和写入。读写数组之间缺乏协调导致yosys推断该数组不作为块ram实现。
https://stackoverflow.com/questions/62703942
复制相似问题