TA的每日心情 | 开心 2019-11-4 13:48 |
---|
签到天数: 14 天 连续签到: 1 天 [LV.3]偶尔看看II
|
逻辑仿真
考虑到性能和易用性,首选的逻辑仿真器是Mentor Graphics的modelsim。
3.1 测试程序(test bench)
测试程序对于设计功能和时序的验证有着举足轻重的影响,测试激励的完备性和真实性是关键所在,有以下原则须遵循:
(1)测试激励输入和响应输出采集的时序应当兼顾功能仿真(无延时)和时序仿真(有延时)的情况。
(2)对于周期较多的测试,为提高效率,尽可能采用程序语句来判断响应与标准结果是否一致,给出成功或出错标志,而不是通过观察波形来判断。
(3)采用基于文件的测试是很好的办法,即由matlab或spw等系统工具产生测试数据,测试程序将其读入产生激励,再把响应结果写入到文件,再交给上述工具进行处理或分析。
(4)仿真器支持几乎所有的Verilog HDL语法,而不仅仅是常用的RTL的描述,应当利用这一点使测试程序尽可能简洁、清楚,篇幅长的要尽量采用task来描述。
3.2 使用预编译库
在进行功能仿真和后仿真时都需要某些模块的行为仿真模型和门级仿真模型,如altera
Quartus里的220model.v(LPM模块行为仿真模型)和apex20ke_atoms.v(20KE系列门级仿真模型),为避免在不同的设计目录中多次编译这些模型,应当采用一次编译,多次使用的方法。具体做法如下(以20KE门级库为例):
1:在某个工作目录下新建一库名 apex20ke,将apex20ke_atoms.v编译到其中。
2:在图形界面中的Load Design对话框中装入仿真设计时,在Verilog 标签下指定预编译库的完整路径。(见下图)
逻辑综合
目前可用的FPGA综合工具有Mentor Graphics 的 LeonardoSpectrum,Synplicity的SynplIFy和Synopsys 的FPGA CompilerII/FPGA Express,LeonardoSpectrum由于性能和速度最好,成为我们首选的综合器,FPGA
CompilerII/FPGA Express由于可以和Design Compiler代码兼容也可用。见参考[9]
4.1 逻辑综合的一些原则
HDL代码综合后电路质量的好坏主要取决于三个方面:RTL实现是否合理、对厂家器件特点的理解和对综合器掌握的程度。参考[url=]10[/url]中有比较全面的讨论。
4.1.1 关于LeonardoSpectrum
LeonardoSpectrum对综合的控制能力比较强,但使用也略为复杂,故需要在使用前尽量熟悉其功能,才能取得较好的综合结果。
当出现综合结果不能满足约束条件时,不要急于修改设计源文件,应当通过综合器提供的时序和面积分析命令找出关键所在,然后更改综合控制或修改代码。
在LeonardoSpectrum 2000.1b以前的版本输出的 .v 网表都不能用于仿真。
4.1.2 大规模设计的综合
l 分块综合
当设计规模很大时,综合也会耗费很多时间。如果设计只更改某个模块时,可以分块综合。如有设计 top.v 包含 a.v和b.v两个模块,当只修改a.v的话,可以先单独综合b.v,输出其网表b.edf,编写一个b模块的黑盒子接口b_syn.v,每次修改a.v后只综合top.v、a.v、b_syn.v,将综合后的网表和b.edf送去布线,可以节约综合b模块的时间。
l 采用脚本命令
当设计规模比较大时,综合控制也许会比较复杂,可以考虑采用脚本控制文件的方式进行综合控制,modelsim、LeonardoSpectrum和Quartus都支持TCL(Tool Command
Language)语言,采用脚本控制可以提供比图形界面更灵活和更方便的控制手段。
4.1.3 必须重视工具产生的警告信息
综合工具对设计进行处理可能会产生各种警告信息,有些是可以忽略的,但设计者应该尽量去除,不去除必须确认每条警告的含义,避免因此使设计的实现产生隐患。
这个原则对仿真和布局布线同样适用。
4.2 调用模块的黑盒子(Black box)方法
使用黑盒子方法的原因主要有两点:
一是HDL代码中调用了一些FPGA厂家提供的模块(如Altera的LPM模块)或第三方提供的IP,这些模块不需要综合,而且有些综合器也不能综合(如FPGA CompilerII/FPGA Express可以综合包含LPM的代码而LeonardoSpectrum不能)。因此须提供一个黑盒子接口给综合器,所调用的模块到布局布线时才进行连接。
二是方便代码的移植,由于厂家提供的模块或第三方提供的IP通常都是与工艺有关的,直接在代码中调用的话将不利于修改,影响代码移植。
下面以调用Altera的LPM库中的乘法器为例来说明。调用这样一个模块需要这样一个文件:mult8x8.v(可由Quartus的MegaWizer Plug-in Manager产生),代码如下:
// mult8x8.v
module mult8x8 (dataa, datab, result);
input [7:0] dataa;
input [7:0] datab;
output [15:0] result;
// exemplar translate_off
// synopsys translate_off
lpm_mult lpm_mult_component(
.dataa (dataa),
.datab (datab),
.aclr (1''''b0),
.clock (1''''b0),
.clken (1''''b0),
.sum (1''''b0),
.result (result)
); defparam lpm_mult_component.lpm_widtha = 8, lpm_mult_component.lpm_widthb = 8, lpm_mult_component.lpm_widths = 16, lpm_mult_component.lpm_widthp = 16, lpm_mult_component.lpm_representation= "SIGNED", // exemplar translate_on
// synopsys translate_on
endmodule
注意上述的代码有两对编译指示:
// exemplar translate_off 和 // exemplar translate_on (LeonardoSpectrum支持)
// synopsys translate_off 和 // synopsys translate_on(LeonardoSpectrum和FPGA CompilerII都支持)
对于相应的综合器,在这些编译指示中间的语句将会被忽略,那我们可以看到在综合过程中模块mult8x8实际变成了一个只有I/O定义的空盒子(即blackbox),所以该部分的代码没有连接,在Quartus布局布线的时候,lpm模块的代码才连接到整个设计,在仿真的时候,编译指示不影响模块的完整性。
参考
[1]:中国台湾清华Verilog HDL教程
[2]:Verilog HDL硬件描述语言
[3]:文件头注释块示例
[4]:C语言的风格
[5]:Verilog HDL Reference manual
[6]:Actel HDL coding style guide
[7]:LeonardoSpectrum HDL Synthesis
[8]:ASIC Design Partitioning
[9]:三种FPGA综合工具的比较
Synthesis Training Course
|
|