verilog程序设计及SystemVerilog验证

1.Verilog测试程序设计基础

1.1Testbench及其结构

在仿真的时候Testbench用来产生测试激励给待验证设计( Design Under Verification, DUV),或者称为待测设计(Design UnderTest, DUT) 。

测试程序的一般结构:

Testbench是一个测试平台,信号集成在模块内部,没有输入输出。在Testbench模块内,例化待测设计的顶层模块,并把测试行为的代码封装在内,直接对待测系统提供测试激励。

例:T触发器测试程序

module TFF_tb;

reg clk, rst_n, T;

wire data_out;

TFF U1(.data_out(data_out), .T(T), .clk(clk), .rst_n(rst_n)); //对被测模块实例化

always

#5 clk = ~clk;

Initial

begin

clk = 0;

#3 rst_n = 0;

#5 rst_n = 1;

T = 1;

#30 T = 0;

#20 T = 1;

end

Initial

begin

monitor(time,"T=%b, clk=%b,rst_n=%b,data_out=%b", T, clk, rst_n,data_out);

end

endmodule

T触发器的波形仿真和文本输出:

从下图可以清晰地看出Testbench的主要功能:

(1)为DUT提供激励信号0。

(2)正确实例化DUT。

(3)将仿真数据显示在终端或者存为文件,也可以显示在波形窗口中以供分析检查。

(4)复杂设计可以使用EDA工具,或者通过用户接口自动比较仿真结果与理想值,实现结果的自动检查。

在编写Testbench时需要注意的问题:

(1)testbench代码不需要可综合

Testbench代码只是硬件行为描述不是硬件设计。

(2)行为级描述效率高

Verilog HDL语言具备5个描述层次,分别为开关级、门级、RTL级、算法级和系统级。

(3)掌握结构化、程式化的描述方式

结构化的描述有利于设计维护,可通过initial、always以及assign语句将不同的测试激励划分开来。

一般不要将所有的测试都放在一个语句块中

2.2测试平台举例

测试平台需要产生时钟信号、复位信号和一系列的仿真向量,观察DUT的响应,确认仿真结果。

(1)组合逻辑电路仿真环境搭建

全加器真值表:

module adder1 (a, b, ci, so, co);

input a, b, ci ;

output so, co ;

assign { co , so } = a + b + ci ;

endmodule

根据全加器的真值表编写的全加器测试程序如下:

module adder1_tb ;

wire so, co;

reg a, b, ci;

adder1 U1(a, b, ci, so, co); //模块例化

initial //测试信号产生

begin

a = 0; b = 0; ci = 0;

#20 a = 0; b = 0; ci = 1;

#20 a = 0; b = 1; ci = 0;

#20 a = 0; b = 1; ci = 1;

#20 a = 1; b = 0; ci = 0;

#20 a = 1; b = 0; ci = 1;

#20 a = 1; b = 1; ci = 0;

#20 a = 1; b = 1; ci = 1;

#200 $finish;

end

endmodule

全加器的输入a、b和ci定义为reg型变量,把输出so和co定义为wire型变量;用模块例化语句

"adder1 U1(a,b,ci,so,co);"把全加器设计电路例化到测试仿真环境中;用initial块语句改变输入的变化并生成测试条件,输入的变化语句完全根据全加器的真值表编写

(2)时序逻辑电路仿真环境的搭建

在于时序逻辑电路仿真环境中,需要考虑时序、定时信息和全局复位、置位等信号,并定义这些信号。

用Verilog编写的十进制加法计数器:

module cnt10(cIk ,rst, ena, q, cout);

input clk,rst,ena;

output [3:0] q;

output cout;

reg [3:0] q;

always@(posedge clk or posedge rst)

begin

if(rst)q=4'b0000;

else if(ena)

begin

if(q<9)

q=q+1;

else

q=0;

end

end

assign cout=q[3]&q[0];

endmodule

测试程序代码:

module cnt10_tb;

reg clk, rst, ena;

wire [3:0] q;

wire cout;

cnt10 U1(clk ,rst, ena, q, cout);

always #50 clk = ~clk;

initial

begin

clk=0;rst=0;ena=1;

#1200 rst=1;

#120 rst=0;

#2000 ena=0;

#200 ena=1;

#20000 $finish;

end

endmodule

实例化语句"cnt10 U1(clk,rst,ena,q,cout);"把十进制计数模块例化到仿真环境中;

在always中用语句"#50 clk=~clk;"产生周期为100(标准时间单位)的时钟方波;

用initial块生成复位信号rst和使能控制信号ena的测试条件。

测试结果如图:

2.3Verilog仿真结果确认

(1)直接观察波形

通过直接观察各信号波形的输出,比较测试值和期望值的大小,来确定仿真结果的正确性。

(2)打印文本输出法

module adder1_tb;

wire so,co;

reg a,b,ci;

adderl U1(a,b,ci,so,co);

initial

begin

a=0;b=0;ci=0;

#20 a=0;b=0;ci=1;

#20 a=0;b=1 ;ci=0;

#20 a=0;b=1 ;ci=1;

#20 a=1 ;b=0;ci=0;

#20 a=1 ;b=0;ci=1;

#20 a=1 ;b=1 ;ci=0;

#20 a=1;b=1;ci=1;

#200 $finish;

end

monitor(time, "%b %b %b -> %b %b",a, b, ci, so, co);

endmodule

输出结果:

0 0 0 0 -> 0 0

20 0 0 1 -> 1 0

40 0 1 0 -> 1 0

60 0 1 1 -> 0 1

80 1 0 0-> 1 0

系统任务打印任务:

$display:直接输出到标准输出设备;

$monitor:监控参数变化;

$fdisplay:输出到文件等。

(3)自动检查仿真结果

自动检查仿真结果是通过在设计代码中的关键节点添加断言监控器,形成对电路逻辑综合的注释或是对设计特点的说明,以提高设计模块的观察性。

(4)使用VCD文件

Verilog提供一系列系统任务用于记录信号值变化保存到标准的VCD(Value Change Dump)格式数据库中。VCD文件是一种标准格式的波形记录文件,只记录发生变化的波形。

2.4Verilog仿真效率

因为要通过串行软件代码完成并行语义的转化,Verilog行为级仿真代码的执行时间比较长。

提高Verilog HDL代码的仿真代码执行时间:

(1)减小层次结构

仿真代码的层次越少,执行时间就越短。

(2) 减少门级代码的使用

由于门级建模属于结构级建模,建议仿真代码尽量使用行为级语句,建模层次越抽象,执行时间就越短。

(3) 仿真精度越高,效率越低

计时单位值与计时精度值的差距越大,则模拟时间越长。`timescale仿真时间标度。

(4) 进程越少,效率越高

代码中的语句块越少仿真越快,这是因为仿真器在不同进程之间进行切换也需要时间。

(5) 减少仿真器的输出显小

Verilog语言包含一些系统任务,可以在仿真器的控制台显示窗口输出一些提示信息,但会降低仿真器的执行效率。

相关推荐
浮梦终焉2 天前
VS Code下开发FPGA——FPGA开发体验提升__下
ide·fpga开发·verilog·vs code
迎风打盹儿4 天前
FPGA同步复位、异步复位、异步复位同步释放仿真
verilog·fpga·vivado·复位
肯德基疯狂星期四-V我505 天前
【FPGA】状态机思想实现LED流水灯&HDLbits组合逻辑题训练
fpga开发·verilog·de2-115
可编程芯片开发6 天前
基于FPGA的特定序列检测器verilog实现,包含testbench和开发板硬件测试
fpga开发·verilog·特定序列检测
超级大咸鱼14 天前
verilog实现32位有符号流水乘法器
verilog·乘法器
超级大咸鱼15 天前
verilog实现十进制正数与ASCII码互转
verilog·fpga·ascii
我爱C编程17 天前
基于FPGA的16QAM+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
fpga开发·verilog·16qam·帧同步·误码统计·高斯信道
早睡身体好~17 天前
FPGA原型验证,从零开始直到入门全过程
fpga开发·verilog·soc
9527华安22 天前
Xilinx系列FPGA视频采集转HDMI2.0输出,基于HDMI 1.4/2.0 Transmitter Subsystem方案,提供6套工程源码和技术支持
fpga开发·verilog·视频采集·hdmi2.0·4k
双料毒狼_s1 个月前
【FPGA实战】Verilog实现DE2-115的流水灯控制
fpga开发·verilog