前言
先说明下这个【每周一问】,并不是我每周都一定会发一个,这个话题下的其他号主也会发,然后每周就会有个一两个问题以及相关解答的文章,所以如果我没发,其他号主也是在发的
如果回答有错误之处,请指出~
说下今天的问题吧,今天在一个技术讨论群里看到有人问“initial可以被综合吗?为什么ise里头还提供了使用initial初始化ram的代码?”
解答
initial这个语法一般使用于仿真所用的激励文件中,只是给寄存器类型的变量赋初值用的,因此理论上是不可以被综合的。
那为什么还会有用initial进行ram的初始化的官方代码呢?
先解释下FPGA的运行机制,大部分的FPGA是基于SRAM查找表结构实现,即上电后需要从外部加载配置信息等,所以这就相当于有了一个空隙,然后initial在这种情况下让存储器载入了一个初始化文件,因此这种给存储器赋初值的行为属于一种可综合的行为。
以上都是比较教科书式的回答,接下来我们用实际的测试说话吧。
代码语言:javascript复制//测试代码
module dzkr_test(
output reg out
);
initial begin
out = 1'b1;
end
endmodule
直接在vivado里运行这串简单的代码,可以看到,综合和电路的实现都成功通过了。
打开综合后的RTL图,可以看到out实际上是连到了一个高电平,也就是说该种赋值成功了。
然后稍微改一下代码;
代码语言:javascript复制module dzkr_test(
output reg [3:0]out,
output reg [3:0]out2
);
initial begin
out = 4'hf;
out2 = 4'h2;
end
endmodule
继续综合,并看生成的RTL图:
然后你是不是有点怀疑各种教程的回答了......
其实那些教程文档并没错,只是编译器对这些语法有进行类似预处理的操作(message里面发现的,看下图),使得该语法能够成功映射到实际电路中~
于是最后我得到的结论就是:initial下可综合的语句最终在FPGA中其实是可以被综合的,不过我依然不建议用这种进行赋初值,有些编译器就会出现警告或者直接报错,使用复位赋初值它不香吗?
ASIC的话,网上的言论一致,那就是一定无法综合。