【每周一问】initial可以被综合吗?

2020-12-08 17:07:39 浏览数 (1)

前言

先说明下这个【每周一问】,并不是我每周都一定会发一个,这个话题下的其他号主也会发,然后每周就会有个一两个问题以及相关解答的文章,所以如果我没发,其他号主也是在发的

如果回答有错误之处,请指出~

说下今天的问题吧,今天在一个技术讨论群里看到有人问“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的话,网上的言论一致,那就是一定无法综合。

0 人点赞