本文授权转发自知乎用户 橘子汽水 链接:https://www.zhihu.com/people/xing-qi-55-65/posts
一、前言
本文主要介绍VCS门级网表的仿真。当我们把所写的RTL进行的功能仿真通过之后,便输入到 Design Compiler工具中进行逻辑综合,逻辑综合的结果便是RTL代码转化为由与、或、非等门电路和触发器组成的电路,称为门级网表(netlist)。门级网表中便包含了电路的实际信息,例如逻辑门单元的扇入扇出系数,延迟等等。因此在逻辑综合完成之后,需要对网表再进行仿真验证,防止出现意想不到的错误。
二、逻辑综合
在此对逻辑综合做简单的介绍,具体细节可以去公众号查看相关链接:
对于实际电路,时钟信号并不是理想的“陡直”,门电路也存在延迟,这些电路的实际信息需要在逻辑综合的时候考虑到。RTL代码转换为门级电路,我们需要对电路施加一些约束。例如时序电路的工作频率,电路中组合逻辑块的延迟等等。综合工具会根据我们施加的约束做时序上的优化,从工艺库中挑选合适的单元,在面积,时序和功耗三个方面进行折衷。当然满足时序的要求是首要的,面积和功耗要越小越好。 为简单起见,以一个Moore状态机为实例,做最基本的不添加约束的逻辑综合,用以生成门级仿真所需要的文件。设计电路框图如下:
图1
由一个计数器和moore状态机组成。 RTL仿真图如下
图2
q_o 为三位计数器的输出,dout_out为状态机的输出,按 0000 0010 0100 1000 的顺序循环。
之后便在Design Compiler中进行综合生成后端和门级仿真的文件,我们在此关心VCS门级仿真所需要的文件。SDF文件包括设计中的时序信息,.v文件是以工艺库单元例化形成的verilog文件。
图3 sdf文件示例(部分)
图4 网表形式的verilog文件(部分)
由上图我们可以看到网表形式的verilog文件,由门电路和触发器例化组成。
三、网表仿真
下面进行网表仿真
图5 makefile更改
上图中,我们把入门教程(三)中的makefile模板添加了一个开关选项,由于网表.v文件是由工艺库单元例化的,工艺库中给出了一个verilog文件,包含各个单元。
图6 makefile更改
定义NET_SIM这个宏。用于testbench中代码块的打开和关闭。
代码语言:javascript复制initial begin
`ifdef NET_SIM
$sdf_annotate("/mnt/hgfs/LINUX_EDA_Share/DC_Projects/netlist_simulation/Top.sdf",
Top,,,
"TYPICAL",
"1:1:1",
"FROM_MTM");
`endif
end
在testbench中添加上面的代码块,使用sdf_annotate()系统函数将sdf文件“反标”到设计中,第一个参数指定sdf文件,第二个参数指定反标到哪一层的module上,这里我们选择顶层文件。其他参数保持默认即可。具体sdf_annotate()各个参数的介绍可查阅相关博客。aijishu.com/a/106000000
设置完毕后使用 make com sim debug 命令查看门级仿真波形。
图7 门级仿真波形
我们可以看到输出信号的跳变与时钟上升沿已有一段延迟,这与RTL仿真是不同的。
四 结束语
本篇介绍使用VCS 进行门级网表仿真的基本操作,想更为深入了解的朋友可以再查看 user guide的相关资料,到此为止,面向新手的VCS入门教程系列结束。有错误的地方还请各位批评指正。
VCS教程源码链接:后台回复 VCS入门 即可