最近被VCS的编译选项搞的有点发疯,记录一下,让同行少踩坑。
如果你的设计是sc+sv+uvmc的,而且sc里面包含有一个静态库或者动态库函数,想想这东西怎么才能编到一起。
坑1. 首先,不要把syscan和gcc想象成一个玩意!最大区别就是syscan编译之后的文件放在了csrc里面,而gcc默认放在当前路径。虽然你可以在sysan里面通过选项-cpp -cc来选择使用什么版本的g++或者gcc,但是二者真不是一个东西,你可以在sysan后面加上-full64,-tlm2等。
坑2. 如果你觉得双顶层和sv例化sc没啥大区别,那就又错了。双顶层的模式不支持-partcomp,搞过soc的人都知道这个选项的含金量。所以uvmc和uvm-ml给出的examples里面,都使用的是sv例化sc_module模式,而非双顶层。
坑3. 记着坑2再挖一个坑,你如果想在sv里面例化sc_module,需要在syscan编译top层的时候这样写:syscan ... top.cpp:top 。这冒号的意思是说,要把sc的顶层变成Verilog格式的wrapper,才能被sv顶层例化。这是什么脑洞?歪果仁的奇葩之处不得不佩服。你生成库的时候,一个带sc一个带v,难死你么?
坑4. 如果你想用vlogan编译自己的verilog,那就又入坑了。想想vlogan,只能吃verilog,不能吃C。那也就解释了为什么你加了ntb_opts之后,仍然不起作用。原因就是ntb_opts不但引入uvm库,同时引入当前uvm版本下面的dpi.cc文件。环境