使用irun的增量编译,可以在环境修改情况下,加快编译速度。在实际的使用过程中,在bind操作,遇到了编译的问题。下面将该问题进行分享。

TB部分,有bind的操作,将一些模块,或者interface,bind到RTL的一些模块上,此时如果使用增量编译,出现bind不成功。

如以下示例代码。

TB部分,有bind_tb模块,需要bind在RTL中。而bind_tb.v是在TB部分进行编译的。

增量编译命令为

#编译RTL
irun -sv  -mkprimsnap -f flist.rtl -top dut -snapshot dut
#增量编译TB
irun -sv -f flist.tb -primname dut -c 

irun的选项的说明:

◾-mkprimsnap: 表示生成primary snapshot

◾-snapshot: 指定生成snapshot的名字

◾-primname: 指定载入的primary snapshot

◾-c: 只生成snapshot,不仿真

在增量编译TB时,会打印信息,不能将bind_tb模块,bind到RTL中。既然没有bind成功,那仿真的过程中,那这个bind_tb模块,就不能进行仿真。

对于增量编译的bind,irun工具提供了 –nncbind 选项。

此时增量编译命令为

#编译RTL
irun -sv  -mkprimsnap -f flist.rtl -top dut -snapshot dut
#增量编译TB
irun -sv -f flist.tb -primname dut -c -nncbind 

重新增量编译,出现如下错误。

ncelab: *N,HREFAC (.xxxx): Hierarchical reference to primary partition requires permissions.
the referenced object needs permission to be read.
..
ncelab: *F,HREFIF: Terminating due to hierarchical reference permission problems(generated HREF file: autohref.txt)

待bind的模块bind_tb,要使用RTL中的clk信号,但是bind_tb却没有对该信号的读取权限。

这个就涉及到增量编译中,信号权限的问题了。对此,不介绍这块内容。因为,了解这部分内容,意义并不大。

下面,说一下,怎么解决这个问题。

增量编译,是将RTL和TB进行分开编译,RTL首先被编译,那么RTL在编译的时候,是不知道,自己的哪些内部信号,是会被环境所使用的,因此默认为,这些内部信号,对于TB部分,均是不能访问。

而bind操作,那么待bind的模块,肯定是会使用RTL中的内部信号,因此需要在RTL编译时,告诉irun工具,哪些信号,会被TB所使用,并且指定相应的权限,这样TB部分增量编译,才不会出错。irun工具,提供了href.txt文件,来执行信号的权限。并且搭配了-href选项,来指定href文件。

当然,我们是不会去手动填写这文件,因为太过麻烦,irun工具,提供了自动生成该文件的方法。使用-genhref选项。

增量编译的命令

#1、编译RTL
irun -sv  -mkprimsnap -f flist.rtl -top dut -snapshot dut
#2、生成href.txt文件
irun -sv -f flist.tb -primname dut -genhref href.txt -nncbind
#3、重新编译RTL
irun -sv  -mkprimsnap -f flist.rtl -top dut -snapshot dut -href href.txt
#4、增量编译TB
irun -sv -f flist.tb -primname dut -c -nncbind 

在第二步,-genhref,指定生成的href.txt文件。执行后,不会生成snapshot,但是会生成href.txt文件。

href.txt文件内容,将dut.clk信号,设置为可读。

在第三步,重新编译RTL,使用-href选项,指定href.txt文件。

在第四步,增量编译TB,编译成功。最后生成snapshot。

更多相关阅读

irun工具检测TB环境零延时无限循环
irun工具检测zero-delay组合逻辑
cadence验证仿真工具IUS和IES

原文首发于骏的世界博客
作者:卢骏
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。

发表评论

邮箱地址不会被公开。 必填项已用*标注