叨叨
1、本来有打算写一篇长文来介绍的,但是无奈自身水平不足,再加上实在懒得写那么多字,所以本文相当于是一个缩减版,意思到了就行。
2、发现做验证如果想继续深入,可以去补充下编译原理的相关知识。
正文
先抛开vcs、systemverilog不谈。我们所编写的程序代码,需要经过编译和链接后才能得到可执行文件。
有关编译、链接的知识可以参考C语言中相关内容:
编译和链接的过程
当我们在用vcs进行仿真时,一般都会使用Makefile来控制编译仿真流程。
当我们敲下make compile后(target名字当然是你自己定的),Makefile会去调用vcs这个可执行文件,并把一堆参数丢给它:
当然,作为一个demo,上面这个参数算是少的了,正常的怎么说也有几十行。
而vcs这个可执行文件实际上是一个脚本,作为一个能处理上百个参数的脚本,自然也是庞大无比:
在打开这个文件之前我是有读一遍的打算的,打开后我果断理智地放弃了这个想法。。。
这个vcs会去调用真正的编译器来编译我们的verilog/systemverilog代码:
当我们的代码编译完成后,此时得到的是一些目标文件、动态库,存在放csrc文件夹里面(注意里面有一个文件还是叫Makefile,又是一个套娃- -!):
紧接着,敲重点!!!vcs会调用g++来完成目标文件、动态库的链接,而指导g++工作的,正是上面提到的套娃Makefile:
有关g++的参数解释,可以参考:
GCC参数详解
至此,我们得到了一个完整的simv。
打开套娃Makefile,我们能找到和编译log对应的信息:
这里还可以看到,当使用g++完成链接后,会使用touch来对一个空白文件”product_timestamp”打上时间戳,记录生成simv的时间。