1. xHDL仿真器
常用的硬件描述语言的仿真器有很多种,例如,VCS,Ncsim,Affirima,Verilog-XL,SpeedWave,Finisim和 ModelSim。个人认为比较流行的就是ModelSim和Ncsim,像opencores提供的源码大部分都含有Ncsim仿真支持,或者 ModelSim仿真支持。
1.1 ModelSim简介
ModelSim仿真器在FPGA/CPLD设计中的使用得到了广泛的应用,这是因为Model Technology公司为各个FPGA/CPLD厂家都提供了OEM版本的ModelSim工具。ModelSim仿真原理是基于事件驱动的,它可支持Verilog和VHDL语言的的单独仿真与混合仿真。
1.2 ModelSim版本
ModelSIm仿真工具有许多版本,首先就是他的版本号很多,这里不多介绍,因为它无非就是软件性能,功能的升级。这里主要是要说明ModelSim PE/LE/SE之间的区别:
为了满足不同用户的需要,ModelSim每个版本号都可以分为PE,LE和SE等类别。其中SE功能是比较完善的,但是它有一个特点就是,在进行仿真前,要首先编译相应的仿真库(通过设置,也可以一老永逸),后面会专门介绍。
在进行Xilinx FPGA产品开发时,我们有时会遇到ModelSim XE版本,这是ModelSim的Xilinx OEM版本,里面集成了Xilinx的仿真库。同样道理也适用于Altera。
2. 仿真库的生成
结合自己的实际经验,本文以Verilog + ModelSim SE + Xilinx ISE为例来说明仿真库的生成。
2.1 仿真库的命名
在ModelSim中编译器件的仿真库时,使用的仿真库的名称可以随意定义,只要满足操作系统的命明规则就行。但是在实际操作中,则不然。
当我们使用Xilinx ISE + ModelSim进行仿真时,Xilinx ISE会产生一些对ModelSim进行控制的文件,而在这些文件中,包含仿真库的映射机制,因此为了兼容性,这里的仿真库的命名就是固定的了,而不是任意定义。他们分别是Unisim_ver,Simprim_ver,Xilinxcorelib_ver。
2.2 仿真库文件的说明
上面提到了ModelSim仿真所需要的3个基本的库,这里主要介绍一下他们的作用。
Unisim_ver:如果要做综合后的仿真,还要编译这个库。即UNISIM,Library of Unified Component simulation models,这个库用来做功能仿真。这个库包含了Xilinx的所有的标准元件,可以被绝大多数的综合工具推论。UNISIM库被分为VHDL和Verilog两种。以Verilog为例:Verilog UNISIM库文件中每一个元件使用一个独立的文件。根据器件的不同,这个库分为两个目录,对于FPGA器件家族,源文件位置在$Xilinx\Verilog\src\unisims目录下,对于CPLD家族,源文件位置在$Xilinx\Verilog\src\uni9000目录下。
Simprim_ver:这个库用于布局布线后的仿真。对于Verilog来说,这个库位于$Xilinx\Verilog\src\simprimes,对于VHDL来说,这个库位于$Xilinx\VHDL\src\simprimes。
Xilinxcorelib_ver:这个库仅仅用来做功能仿真。 但其和Unisim_ver不同,如果设计中调用了CoreGen产生的核,则需要编译这个库。Core Generator HDL Library models, 它包含了适用Core Generator产生的各种IP核的仿真模型。Xilinx的IP核都针对不同的器件结构作了很好的优化,但是对于使用者来说,大部分只能够做为黑合来 处理。对于Verilog来说,其对应的源文件位置所在的位置是$Xilinx\Verilog\src\xilinxcorelib,对VHDL来说, 其对应的源文件所在的位置是$Xilinx\VHDL\src\xilinxcorelib。
2.3 仿真库的建立
本节将以Verilog语言中时序仿真库simprimes为例来说明,为ModelSim建立仿真库。
第一步:将ModelSim根目录下的配置文件Modelsim.ini属性由只读改为可读写。这样做的目的就是为了让软件可以记录仿真库建立的路径以及 映射关系。以后每次启动Modelsim时,软件会根据ModelSim.ini中的配置寻找仿真库,并且形成映射关系。
第二步:在这一步,有2种方法可以作。
(1) 在modelsim环境下,新建工程,工程的路径与你想把库存储的路径一致。这里Project Name: Xilinx_lib;
Project Location: D:/My_Work/ModelSim_Simulation/Xilinx—即仿真库保存的路径。如下图所示:
(2): 在主窗口中选择[File] / [Change Directory]命令,将工作目录改到我们想要保存仿真库的目录下,即D:/My_Work/ModelSim_Simulation/Xilinx。
以上两个方法均可,最终的结果都是一样的。
第三步:新建库,库名起作simprim_ver。我们首先就是要建的就是这个库。
即在主窗口选择[File] / [New] / [Library]命令,然后根据下图设置[Create]选项,[Library Name]选项,以及Libray Physical Name]选项(软件自动生成)。如下图所示:
这一操作实际上相当于在ModelSim主窗口的脚本区域输入命令
vlib simprimes_ver
vmap simprimes_ver simprimes_ver
第四步:这一步有两种方法实现,这两种方式是等效的
(1): 在modelsim的命令栏上,打下如下命令:
vlog -work simprim_ver $xilinx/verilog/src/simprims/*.v
其中的$xilinx是Xilinx ISE的安装路径,你把这个改成你的就行了。编译完之后,你会发现你的工程文件夹下出现了一个simprim文件夹,里面又有很多个文件夹。这些就是我们要的库了。
(2): 在主窗口选择[Compile] / [Compile]命令,弹出[Compile Source Files]窗口,然后选择$xilinx/verilog/src/simprims/目录下的所有*.v文件,点击Compile按钮执行编译。
第五步:按照第三步中的任意一种方式编译其它两个库,对应的命令行是:
vlog -work unisim_ver $xilinx /verilog/src/unisims/*.v
vlog -work xilinxcorelib_ver $xilinx /verilog/src/XilinxCoreLib/*.v
第六步:库文件编译好了以后,为了方便以后使用,可以修改ModelSim.ini配置文件,打开配置文件之后,可添加对Xilinx仿真库的映射。经过修改后,Xilinx ISE+ ModelSim进行各个阶段的仿真就不会出现任何的错误了。PS:有的人反映,在仿真过程中,有时还需要指定库的路径,其原因就是ModelSim.ini文件没有配置正确。
如果还需要其它的仿真库支持,例如abel_ver, cpld_ver,可按照上述的1~5步完成这些仿真库的添加。
完成上面的步骤后,如果重新打开ModelSim,发现下面的库文件的话,就说明,你的仿真环境建立好了,接下来就可以做你该做的事情了。
3. ModelSim常用命令
在作FPGA开发时,由于需要屡次的修改源文件进行调试,因此,每次仿真都不可避免的要进行编译。这道程序比较麻烦,ModelSim提供了一个捷径,即我们只需要编写一个*.do文件,然后再ModelSim命令行里键入do *.do就可以替代这一麻烦过程。
下面以Giga Eth MAC开发仿真为例,说明一下*.do的语法结构,如下图所示:
(1) vlib work >> 由于vlib<库名>,表示创建一个库,因此vlib work表示创建一个work库,这里的work是库的名称。
(2) vmap work work >>vmap表示映射库,前一个work表示以创建的库的名称,后一个work表示当前ModelSim工作目录下的文件夹,即将一个名为work的库映射到当前目下的work文件夹。
(3) vlog -work work C:/Xilinx91i/verilog/src/glbl.v >> vlog表示编译源代码,”-work”表示其后面跟着的参数表示编译完的源文件要存放的位置,最后的参数表示源文件的位置,即该语法表示,将文件 C:/Xilinx91i/verilog/src/glbl.v编译,得到的编译后的文件,存放在当前工作目录下的work目录下。
最终的仿真结果如下图所示: