第一课
仿真事件队列
- Verilog内建仿真规范
同一个代码在不同的仿真器当中,或者同一个仿真器的不同版本结果可能是不同的,因为仿真器的内建规范不同。
verilog的仿真队列如上图所示:
1.VCS首先会读取所有的initial和always block,并执行一些没有延时的语句。
2.将时间设置成t=0
3.进入active region:(1)首先执行原语(包括UDP即用户定义的原语),例如简单的与门或门、上拉下拉等。
(2)$display
(3)continuous assignments例如assign
(4)阻塞赋值,先计算右边的表达式再赋给左边
***非阻塞赋值在这个部分只计算右边的表达式,没有完成赋值过程。
4.进入inactive region:处理#0语句
5.进入nonblocking assign region:非阻塞赋值在这个模块执行
6.进入monitor region:$monitor在这个模块执行,与$display不同,只有变量值出现变化才会输出监测值。
因此$monitor显示的一定是赋值之后的新值,$display可能显示的是旧值。
7.进入future region
- Example
`define CASE1
`timescale 1ns/1nsmodule sim_event;reg clk,a,z,zin;always @(posedge clk) begina = 1'b1;#0;a = 1'b0;end`ifdef CASE1always @ (a) #0 z = zin;always @ (a) zin = a;`elsealways @ (a) z = zin;always @ (a) #0 zin = a;`endifinitial begin#50 clk = 1'bz;#50 clk = 1'b0;#50 clk = 1'b1;#50 $finish();endendmodule
**编译型仿真器和解释型仿真器的区别:
编译型仿真器必须要先经过编译的过程;
解释型仿真器可以不经过编译,边解释边仿真,相当于执行一个脚本。
在vcs中仿真出的结果如下图所示:
视频中仿真出的结果如下图所示:
对于上述这种代码,仿真结果没有绝对的对错,区别只在于仿真规范的不同。
- 代码规范
1.在时序逻辑中(即always模块中)不推荐/不要使用阻塞性语句,而是用非阻塞性<=符号。
2.always模块中(整个RTL级代码中)不推荐/不要使用#0语句。
3.对于一个时序逻辑要记得加上rst信号。
4.用always描述组合逻辑电路时用always @(*)
数字逻辑仿真工具实践——VCS
真正写代码的时间很少,大部分时间会花在debug上
代码覆盖率/功能覆盖率
Compiles with IEEE-1364, including PLI1.0/VPI(PLI2.0) (Programming Language Interface)
→VCS提供了接口供用户debug
VCS可以支持多种级别的描述方式:
- 行为级描述
- RTL(寄存器传输级)
- Gate-level(门级),与具体工艺库有关
- VCS Compilation Command Format
$vcs source_files[options]
- -Mupdate 增量编译,对大量文件进行编译以后,如果只想修改其中的个别文件可以启用这个选项,避免重复编译。
- -R 立即执行仿真
- -gui 启用DVE图形界面
- -l <filename> 生成指定名字的log文件,大型项目必备
- -sverilog 支持SV语言
- +v2k 支持verilog 2001标准
编译时的选项:-v -y -f -o等,详情见lab1教程文章
- VCS Run-time Command Format
$simv [options]
- -s 时间为0时暂停仿真
- $plusargs() +userswitch 从键盘或者脚本动态地接受一个参数
- -E 返回生成当前simv文件时所用的编译选项
- -l 生成logfile,大型项目必备
- Using DesignWare Library with VCS
DesignWare是软件自带的库,可以在vcs安装目录下找到
$ Dwpart # (parameters) u1(.porta(a), .portb(b));//例化一个名为u1的文件
需要配合-y选项寻找DesignWare的库,否则软件会提示找不到
- 加入定义define的三种方法
1.文件中加入 `define INC_COUNTER。
2.新建立一个文件,在文件中加入 `define INC_COUNTER 并在原文件中引用这个文件 `include "file"
需要启用+incdir+选项指定目录。
3.编译时启用选项+define+INC_COUNTER