Verilog验证平台的通用结构和验证代码编写的基本结构,还有注意事项(持续更新)
Verilog通用验证结构:
1、Testbench:顶层测试模块,验证中必须有的存在,特别简单的模块测试可以只用这个模块。
2、DUT:RTL设计代码;也就是被测试的对象
3、BFM:接口驱动,具有交互的功能。
4、Monitor:显示重点信号,监视器的功能。
5、Compare:比较模型。
6、Testcase:验证激励基于总线功能模型实现对设计代码的特定交互驱动。
文件结构:
如下图:
这个参考文件模型仅仅是参考,具体操作还是看公司安排。要是设计没有要求就只需要搭建RTL和Testbench文件就可以了。
测试平台的描述(Testbench的搭建):
`timescale 1ns/100ps //时间单位是1ns;时间精度是100ps。
module abc_tb; //测试模块名,“abc”表示被测试模块名
//-----------驱动信号连接------------------------------------
reg clk ;
reg rst ;
reg [位宽] a ; //假设模块abc具有三个输入分别是a,b,c
reg [位宽] b ; // 具有两个输出分别是d,e
reg [位宽] c ;
wire [位宽] d ;
wire [位宽] e ;
wire [位宽] f ; //中间的连接线
//-------------信号初始化和时钟的设置------------------------
//--------具体初始化是什么看设计的需求-----------------------
initial
begin
a=0 ;b=0 ;c=0 ; //信号初始化
clk=0 ;rst=0 ; //时钟和复位初始化
end
always #<半时钟周期> clk=~clk ; //时钟周期=半时钟周期X2
//---------被测试代码的实例化----------------
<被验证模块1> <实例化模块名> (<端口连接>); //实例化模块1
<被验证模块2> <实例化模块名> (<端口连接>); //实例化模块2
//--------验证激励----------------------------
initial
begin
<加载需要的激励模块、任务> //调用模块和任务可以提高仿真的精简和稳定
<直接加载a,b,c的值>
end
//------------暂停和停止-------------------
initial
begin
#<时间> $stop ; //暂停仿真
#<时间> $finish ; //停止仿真
end
endmodule
注意事项:
1、代码风格要统一;
2、最大限度的遍历性设计;
3、多写注释;提高代码的可读性和可维护性。
4、块语句的握手,举例:
initial //块1
begin
wait(en)
end
initial //块2
begin
wait(!en)
end
en是握手的方法
总结:
持续更新
感想:
千里之行始于足下