使用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