我试图用一个初始块赋值给一个只读推断RAM:如何在Yosys的初始块中分配RAM值?
module rom (
input clk,
input [5:0] addr,
output reg [15:0] data);
reg [15:0] mem [0:63];
initial begin
mem[0] = 1;
mem[1] = 2;
end
always @(posedge clk)
data <= mem[addr];
endmodule
Yosys给出了这样的警告消息:
$ yosys -q -p "synth_ice40 -blif rom.blif" rom.v
Warning: Blocking assignment to memory in line rom.v:9 is handled like a non-blocking assignment.
Warning: Blocking assignment to memory in line rom.v:10 is handled like a non-blocking assignment.
如果我忽略警告(或改变初始分配给非阻塞),我通过实验发现,在加电后的一些时钟周期之前,RAM并没有得到正确的值。
是没可能使用初始块这样?在yosys github回购中讨论问题#50提供了一个示例模块mem2reg_with_two_always_blocks
,这表明它应该是。但编译该模块会引发相同的警告消息。
是的,上下文是使用SPI从编程的ICE40(在myStorm板上,这是唯一的选择)。我将通过使用计数器来解决配置后延迟启动的问题。但我仍然不理解关于在非时钟初始块内处理阻塞分配的警告消息。我想表示初始化发生在时间步0开始时(或之前!)。 –
@ R.Miller请参阅编辑。 – CliffordVienna