第8章 仿真 联系客服

发布时间 : 星期一 文章第8章 仿真更新完毕开始阅读89dde9240722192e4536f6cb

第8章 仿真

内容提要

◆ 仿真(Simulation) ◆ 系统任务和系统函数 ◆ 用户自定义元件(UDP) ◆ 延时的表示 ◆ 测试平台(TestBench) ◆ 组合电路的仿真 ◆ 时序电路的仿真

Verilog HDL不仅提供了设计描述的能力,而且提供对激励、控制、存储响应和设计验证的建模能力。Verilog HDL最先只是一种用于电路模拟和仿真的语言,后来,由于Verilog综合器的出现,才使得它具有了硬件设计和综合的能力。VerilogHDL能够提供完备的仿真验证功能。

本章介绍与Verilog HDL仿真相关的内容,包括Verilog HDL的系统任务和系统函数、用户自定义元件(UDP)、延时的表示等,并通过若干实例具体说明Verilog仿真程序的编写,以及如何对组合电路和时序电路进行仿真等。

8.1 概述

仿真(Simulation),或者称为模拟,是对所设计电路或系统的一种检测和验证。

仿真包括功能仿真和时序仿真。在设计输入阶段进行的仿真,不考虑信号时延等因素,称为功能仿真,又叫前仿真;时序仿真又称后仿真,它是在选择了具体器件并完成了布局布线后进行的包含定时关系的仿真。由于不同器件的内部时延不一样,不同的布局、布线方案也给延时造成了很大的影响,因此在设计实现后,对网络和逻辑块进行时延仿真,分析定时关系,估计设计性能是非常必要的。

要进行电路仿真,必须有仿真器的支持。按对设计语言的不同处理方式,可将仿真器分为两类:编译型仿真器和解释型仿真器。编译型仿真器的仿真速度快,但需要预处理,因此不能即时修改;解释型仿真器的仿真速度相对慢一些,但可以随时修改仿真环境和仿真条件。

按处理的HDL语言类型,仿真器可分为:VerilogHDL仿真器、VHDL仿真器和混合仿真器。混合仿真器能够处理VerilogHDL和VHDL混合编程的仿真程序。

常用的VerilogHDL仿真器包括:ModelSim、Verilog-XL、NC-Verilog和VCS等。

ModelSim能够提供很好的Verilog和VHDL混合仿真:NC-Verilog和VCS是基于编译技术的仿真软件,能够胜任行为级、RTL级和门级等各种层次的仿真,速度快;而Verilog-HDL是基于解释的仿真工具,速度相对慢一些。

在一些复杂的设计中,仿真验证比设计本身还要耗时费力,所以仿真器的仿真速度、仿真的准确性、易用性等成为衡量仿真器性能的重要指标。

1

8.2 系统任务与系统函数

Verilog HDL的系统任务和系统函数主要用于仿真。本节介绍常用的系统任务和系统函数。这些系统任务和系统函数提供了各种功能,比如实时显示当前仿真时间($time)、显示信号的值($display、$monitor)、暂停仿真($stop)、结束仿真($finish)等等。 系统任务和系统函数有以下一些特点。

◆系统任务和系统函数一般以符号“$”开头,如$monitor、$readmemh等。

◆使用系统任务和系统函数,可以显示模拟结果,对文件进行操作,以及控制模拟的执行过程等。 ◆使用不同的Verilog HDL仿真工具(如VCS、Verilog-XL、ModelSim等)进行仿真时,这些系统任务和系统函数在使用方法上可能存在差异,应根据使用手册来使用。 ◆一般在intial或always过程块中调用系统任务和系统函数。

◆用户可以通过编程语言接口(PLI)将自己定义的系统任务和系统函数加到语言中,以方便仿真和调试。

系统任务与系统函数的主要区别:

◆系统任务可以没有返回值,或有多个返回值,而系统函数只有一个返回值; ◆系统任务可以带有延迟,而系统函数不允许延迟,在0时刻执行。

由于系统任务和系统函数比较多,有的开发工具还有自己定义的系统任务和函数,因此只介绍常用的系统任务和系统函数,这些任务和函数大多数仿真工具都支持,且基本能够满足一般的仿真测试的需要。

1、$display与$write

$display和$write是两个系统任务,两者的功能相同,都用于显示模拟结果,其区别是$display在输出结束后能自动换行,而$write不能。 $display和$write的使用格式为: $display(“格式控制符”,输出变量名列表); $write(“格式控制符”,输出变量名列表); 例如:

$display ($time,,,“a=%h b=%h c=%h”,a,b,c);

上面的语句定义了信号显示的格式,即以十六进制格式显示信号a、b、c的值,两个相邻的逗号“,,”表示加入一个空格。显示格式的控制符见表8.1所示。

表8.1 格式控制符

格式控制符 %h或%H %d或%D %o或%O %b或%B %c或%C %s或%S %v或%V %e或%E %f或%F

2

说明 以十六进制形式显示 以十进制形式显示 以八进制形式显示 以二进制形式显示 以ASICII字符形式显示 以字符串形式显示 输出边线型数据的驱动强度 以指数形式显示实数 以浮点方式显示实数 也可以用$display显示字符串,比如: $display(“it's a example for display\n”);

上面的语句将直接输出引号中的字符串,而“\n”是转义字符,表示换行。表8.2中列举了常用的转义字符,这些转义字符也用于输出格式的定义。

表8.2 转义字符

转义字符 \\n \\t \\\\ \\“ \\ddd 例8-1 $display任务的例子 $display(“Hello Dr Blair”); … … output: Hello Dr Blair $display($time); … … output; 460 counter=4'b10;

$display(“The count is %b”, counter); … … output: The count is 0010 例8-2 $display与$write的区别

假设a,b,c的值分别是1,2,3 如果想用$write得到和$display相同的输出 $display(“a=%d”,a); $write(“a=%d”,a); $write(“a=%d\\n”,a)

$display(“b=%b”,b); $write(“b=%d”,b); $write(“b=%d\\n”,b); $display(“c=%c”,c); $write(“c=%d”,c); $write(“c=%d\\n”,c); 可以得到的输出: 可以得到的输出: 可以得到的输出: a=1 a=1b=2c=3 a=1 b=2 b=2 c=3 c=3

在Verilog HDL中,除了$display与$write这两种主要的输出任务之外,还有以下几种输出任务: (1)$displayb与$writeb(输出二进制数)

(2)$displayo与$writeo(输出八进制数) 不用格式定义 (3)$displayh与$writeh(输出十六进制数)

说明 换行 TAB键 符号\\ 符号“ 八进制的ASCII字符 2、$monitor与$strobe

$monitor、$strobe与$display、$write一样,也属于输出控制类的系统任务,$monitor与$strobe都提供了监控和输出参数列表中字符或变量的值的功能,其使用格式为: $monitor(“格式控制符”,输出变量名列表); $strobe(“格式控制符”,输出变量名列表);

3

这里的格式控制符、输出变量名列表等与$display、$write中定义的完全相同。 例如:$monitor($time,“a=%b b=%h”,a,b);

每次a或b信号的值发生变化都会激活上面的语句,并显示当前仿真时间、二进制格式的a信号和十六进制格式的b信号。

$monitor与$strobe的区别:

可将$monitor想象为一个持续监控器,一旦被调用,就相当于启动了一个实时监控器,如果输出变量列表中的任何变量发生了变化,则系统将按照$monitor语句中所规定的格式将结果输出一次。而$strobe相当于是选通监控器,只有在模拟时间发生改变时,并且所有的事件都已处理完毕后,$strobe才将结果输出。$strobe更多地用来显示用非阻塞方式赋值的变量的值。 例如:

$monitor($time,,,“A=%d B=%d C=%d”,A,B,C);

//只要A、B、C三个变量的值发生任何变化,都会将A、B、C的值输出一次。

例8-3 系统任务$monitor的例子 module myTest; integer a,b; initial begin a=2; b=4; forever begin #5 a=a+b; #5 b=b-1; end end initial #40 $finish; initial begin

$monitor($time,“a=%d,b=%d”,a,b); end endmodule

监控任务$monitor一旦开始执行,就将在整个仿真过程中监控参数,不过可以通过另外两个系统任务$monitoroff和$monitoron把监控任务关闭或开启。$monitoroff任务将关闭所有的监控任务,而$monitoron任务则可以重新开启所有的监控任务。

显示任务$display与探测任务$strobe不同之处在于:$display是遇到该语句时执行,而$strobe则要推迟到当前时刻结束时执行。

例8-4 $display与$strobe不同的例子 integer Cool; initial begin

4

输出结果为: 0 a=2, b=4 5 a=6, b=4 10 a=6, b=5 15 a=11, b=5 20 a=11, b=10 25 a=21, b=10 30 a=21, b=20 35 a=40, b=20