北大数字集成电路15Verilogtestbench写法21页PPT
TestBench

模拟界面控制
库文 件
逻辑模拟结果一致性的确定
在TestBench中加入预期结果比较
利用波形比较工具检测逻辑模拟波形的 一致性
$display $time $fopen $finish
$fdisplay $write $fclose $stop
$monitor $strobe $dump
利用虚拟原型、估计综合及后设计的结果;
HDL代码调试
逻辑模拟验证
在TestBench中加入$strobe系统任务,记 录、探测所关心的信号波形; 在逻辑模拟验证前,利用模拟器提供的 功能,选择需要观察的信号并加以记录; 在TestBench中增加模拟结果与预期的正 确结果的比较,检测不正确的HDL代码
Verilog HDL提供的支持
Verilog HDL提供了几个系统任务支持从 文件中直接读取输入激励码向量 $readmemb(“File_Name”, Test_Vector); 从文件中读取二进制输入激励码向量
$readmemh(“File_Name”, Test_Vector); 从文件中读取二进制输入激励码向量
Reg Reg …… [7:0] A, B; Start;
二进制表示的 输入激励码及 其输出预期结 果表示
Reg [33:0]
…….
……
Vector, Test_Vector[0:Test_Length];
$readmemb(“Test_Fixed.v”, Test_Vector); For (I=0; I<Test_Length; I = I+1) 按一定时序将Test_Vector[I]送入Vector并送入A、B、 Start;
数字逻辑testbench描述

end
1 initial 2 begin 3 进程语句; 4 end
always块可用来模拟抽象的电路,包括:用以指定与不同结构之间的传播延 迟等同的时序结构;或等待指定事件的时序结构。敏感列表有时可忽略。 initail块仅在仿真之初执行,常用于设置变量的初始值。
⚫ 基本的Testbench结构
1 always块和initial块 ➢ 当always块用来描述组合逻辑时,应当使用阻塞赋值。例如
信号或变量定义声明 使用initial或always语句来产生激励波形 实例化设计模块 监控和比较输出响应
endmodule
⚫ 基本的Testbench结构
例:
1 `timescale 1ns/1ns 2 3 module logic_gates_tb; 4 5 reg i_a; 6 reg i_b; 7 wire o_and; 8 wire o_or; 9 wire o_not; 10 11 initial 12 begin 13 i_a = 0; 14 #40 i_a = 1; 15 #40 i_a = 0; 16 #40 i_a = 1; 17 #40 i_a = 0; 18 end
6 end
⚫ 产生激励的一些描述方式
2 产生复位信号的几种方式
➢ 异步复位
➢ 同步复位
1 initial
2 begin
3
Rst = 1;
4
#100;
5
Rst = 0;
6
#500;
7
Rst = 1;
8 end
1 2 3 4 5 6 7 8
initial
begin
Rst = 1; @(negedge clk); Rst = 0; #30; @(negedge clk);
《数字集成电路》课件

1 滤波
去除噪声、增强信号的关键技术。
2 变换
将信号在时域与频域之间转换的方法。
3 压缩
减少数据量,方便存储和传输。
数字信号处理中的滤波器设计
FIR滤波器
时域响应仅有有限个点,稳定性好。
IIR滤波器
时域响应呈指数衰减,延时较小。
模拟/数字混合信号集成电路
1
基础理论
混合信号电路设计所需的模拟电路与数字电路基础知识。
时序逻辑电路
触发器与锁存器
用于存储时钟信号冲突消除和数 据暂存。
计数器
移位寄存器
用于计算和记录触发事件的数量。
用于数据移位操作,实现数据的 串行传输。
数字信号处理技术
数字信号处理(DSP)是用数字计算机或数字信号处理器对原始信号进行处理、分析和存储的一 种技术。它在通信、音频处理和图像处理等领域具有广泛应用。
《数字集成电路》PPT课 件
数字集成电路PPT课件大纲: 1. 什么是数字集成电路 2. 数字集成电路的分类和结构
数字电路设计的流程
1
需求分析
确定数字电路的功能与性能要求,并定义输入输出及约束条件。
2
电路设计
利用逻辑门、触发器等基本组件进行数字电路设计。
3
电路仿真
使用仿真软件验证数字电路中的电气特性和功能。
2 低功耗设计
3 增强型通信
减少功耗,延长电池寿命。
提升通信性能和速度。
2
模拟数字转换
模拟和数字信号之间的转换方法和技术。
3
功耗与噪声
如何平衡功耗Βιβλιοθήκη 噪声性能。电路模拟与仿真SPICE仿真
使用电路仿真软件模拟电路 的工作状态。
参数提取与建模
Verilog HDL语言PPT课件

end
else //read continue
if(ph+ 8'b00000001 ==pe) // empty
begin
wr<=0;rd<=0;state<=stop;busy<=0;full<=0;
end
else // not empty
begin
wr<=0;rd<=1;state<=read;busy<=1;
同步清零?
第4页/共234页
例3:分频器的设计
module
nfrequency( rst, clk, q );
input rst, clk;
output [3:0] q;
reg [3:0] q;
always @( posedge clk or negedge rst )
if (!rst)
q<=0;
end
第21页/共234页
read:
begin
ph<=ph+ 8'b00000001;
if(fifo_rd==0) //end of read
begin
wr<=0;rd<=0;state<=stop;busy<=0;full<=0;
if(ph+ 8'b00000001 ==pe) empty <=1; else empty<=0;
reg[1:0] state; reg[7:0] fifo_out,data; reg wr,rd,empty,full,busy; //fifo write , read ,empty , full reg[7:0]pe,ph; //fifo point:P_end,P_head parameter write=1,read=2,stop=0;
verilogtestbench写法

Verilog测试平台(testbench)技术(一) 收藏对设计进行功能仿真和时序仿真时,需要给待测模块提供激励输入。
对于由V erilog语言描述的设计模块,最好的方法自然同样是用Verilog语言对待测模块施加激励和检测模块的输出响应。
实际应用中,Verilog测试平台(testbench)就是用来提供上述功能的。
Verilog测试平台是一个例化的待测(MUT)Verilog模块,给它施加激励并观测其输出。
由于测试平台是用Verilog语言描述的,因此可以应用到不同的仿真环境中。
待测模块和与之对应的测试平台组成一个仿真模型,应用这个模型可以在不同的测试环境中用相同的激励对待测模块进行调试。
下面就对不同电路类型分别介绍verilog测试平台的语言结构。
一、测试平台1.组合电路测试设计组合电路的测试平台时,待测模块及其功能决定了激烈的选择与测试次数。
对于一个已有的待测模块,测试平台中需要声明与待测模块输入输出端口对应的变量。
与输入端口相连接的变量定义为reg,与输出端口相连接的变量定义为wire,例化时将测试平台中声明的变量与待测模块的输入输出端口相关联。
使用initial语句控制程序运行,initial语句是一种过程结构,在initial块中可使用延迟控制语句来控制initial块中的程序流动。
这里对一个简单的算术逻辑单元(ALU)为例进行测试,下面是该单元Verilog 描述。
/***************************************************************** ********///多动能ALU的Verilog代码'timescale 1ns/100psmodule alu_4bit(a,b,f,oe,y,p,ov,a_gt_b,a_eg_b,a_lt_b);input [3:0] a,b;input [1:0] f;input oe;input [3:0] y;output p,ov,a_gt_b,a_eg_b,a_lt_b; reg [4:0] im_y;always @(a or b or f)beginov=1'b0;im_y=0;case(f)2'b00:beginim_y=a+b;if(im_y>5'b01111)ov=1'b1;end2'b01:beginim_y=a-b;if(im_y>5'b01111)ov=1'b1;end2'b10:im_y[3:0]=a&b;2'b11:im_y[3:0]=a^b;default:im_y[3:0]=4'b0000;endcaseendalways @(a or b)beginif(a>b){a_gt_b,a_ge_b,a_lt_b}=3'b100;else if(a<b){a_gt_b,a_ge_b,a_lt_b}=3'b001;else{a_gt_b,a_ge_b,a_lt_b}=3'b010;endassign p=^im_y[3:0];assign y=oe?im_y[3:0]:4'bz;endmodule/***************************************************************** ********/模块alu_4bit是四功能的算术逻辑单元,输入包括数据信号a、b和功能信号f,输出包括数据信号y和ALU生成的奇偶校验信号p、溢出信号ov及比较信号。
北大数字集成电路课件--15_Verilog-testbench的写法

于敦山
北大微电子学系
Bench使用简介 第十五章 Verilog Test Bench使用简介
学习内容: 学习内容: • 用一个复杂的 用一个复杂的test bench复习设计的组织与仿真 复习设计的组织与仿真 • 建立 建立test bench通常使用的编码风格及方法 通常使用的编码风格及方法
数组激励
• 从数组产生激励有以下特性: 从数组产生激励有以下特性: 在每次反复中, 在每次反复中,修改同一组激励变量 激励数组可以直接从文件中读取
module array_ tb; reg [7: 0] data_ bus, stim_ array[ 0: 15]; // 数 组 integer i; DUT u1 (results, stimulus); initial begin // 从数组读入数据 #20 stimulus = stim_array[0]; #30 stimulus = stim_array[15]; // 线激励 #20 stimulus = stim_array[1]; for (i = 14; i > 1; i = i - 1) // 循环 #50 stimulus = stim_array[i] ; #30 $finish; end endmodule
在上面的例子中,公共参数在一个独立的文件中定义。 在上面的例子中,公共参数在一个独立的文件中定义。此文件在不同 的仿真中可被不同的测试文件调用。 的仿真中可被不同的测试文件调用。
施加激励
种方法。一些常用的方法有: 产生激励并加到设计有很多 种方法。一些常用的方法有: • 从一个 从一个initial块中施加线激励 块中施加线激励 • 从一个循环或 从一个循环或always块施加激励 块施加激励 • 从一个向量或整数数组施加激励 • 记录一个仿真过程,然后在另一个仿真中回放施加激励 记录一个仿真过程,
北大数字集成电路课件--4_verilog_testfixture的编写

为什么没 有端口?
// Instantiate modules
// Apply stimulus
// Display results
由于testfixture是最顶层模 块,不会被其它模块实例化。 因此不需要有端口。
endmodule
Test Fixture — 如何说明实例
module testfixture; // Data type declaration 多路器实例化语句
// Instantiate modules MUX2_1 mux (out, a, b, sel); // Apply stimulus
Time
0 5 10 15
Values a b sel 0 1 0 0 0 0 0 1 1 1 1 1
DUT 被测器件 (device under test)
module MUX2_1 (out, a, b, sel); 注释行 // Port declarations output out; input a, b, sel; 多路器由关键 wire out, a, b, sel; 词module和 wire sel_, a1, b1; endmodule 开始及结束。 // The netlist not (sel_, sel); and (a1, a, sel_); and (b1, b, sel); or (out, a1, b1); 已定义的 Verilog基 endmodule 本单元的 实例
•
a, b, sel是输入端口,out是输出 端口。所有信号通过这些端口从模 块输入/输出。
另一个模块可以通过模块名及端口 说明使用多路器。实例化多路器时 不需要知道其实现细节。这正是自 上而下设计方法的一个重要特点。 模块的实现可以是行为级也可以是 门级,但并不影响高层次模块对它 的使用。
VerilogHDL及其Testbench编写方法

Verilog HDL及其Testbench总结(欢迎批评指正:jackhuan@)1 Verilog HDL的基本观点1) 观点1:module内每个基本模块之间是并行运行的。
2) 观点2:每个模块相当于一个连续赋值的过程。
3) 观点3:方程和任务是共享代码的最基本方式。
4) 观点4:同语言可用于生成模拟激励和指定测试的验证约束条件。
5) 观点5:库的概念相当于Visual C++中的DLL概念。
6) 观点6:文件与文件之间的关系可以使用C++中的*.h和*.cpp之关系理解。
2 设计建模的三种方式1) 行为描述方式。
过程化结构,每个结构之间是并行的。
2) 数据流方式。
连续赋值语句方式,每个赋值语句之间是并行的,且赋值语句和结构之间是并行的。
3) 结构化方式。
门和模块实例化语句。
3 两者数据类型1) 线网数据类型wire:表示构件间的物理连线;2) 寄存器数据类型reg:表示抽象的数据存储元件。
4 几个概念1) 模块(module)。
模块是Verilog HDL的基本描述耽误,用于描述某个设计的功能或结构及其与其它模块通信的外部端口。
一个设计的结构可以使用开关级原语、门级原语和用户定义的原语方式描述;数据流行为使用使用连续赋值语句进行描述;时序行为使用过程结构描述。
模块的声明部分和语句可以散布在模块中的任何地方,但变量、寄存器、线网和参数说明必须在使用前出现。
2) 只有寄存器类型数据(reg/integer)能够在initial和always语句中被赋值。
3) 阻塞性和非阻塞性赋值。
理解这两个概念在学习verilog HDL中非常重要。
决定了时序的正确与否。
阻塞性赋值的概念是在该条赋值语句执行完成后再执行后面的语句,也就是说在执行该语句时,后面的语句是挂起的。
而非阻塞性赋值的结果在何时执行是不知道的,但是可以预见在某个时间步内该语句一定能够执行完成,从这个意义上来看,非阻塞性赋值的语句类似于并行语句,稍有处理不当,会引发多驱动源问题。
Verilog测试平台的简介(Testbenches)PPT

#15 start = 1;
end
Designing Your Testbench
You can make your testbench as simple or as comolex as you want. A comolex testbench would perform response berifivation “on-the-fly”.
Chapter 15:Introduction to Verilog Testbenches
Objectives In this section,you will learn about designing a testbench: ▪ Creating clocks ▪ Including files ▪ Strategic use of tasks and concurrent statements ▪ Controlling and observing the design ▪ Reporting warnings and errors
end
end
reg start;
nand #10 (clk,clk,start);
initial begin
#10 start = 0;
#10 start = 1;
end
Creating Clocks
Example 3
Here are examples of an asymmetric clock with delayed startup:
You can define the clock in either the design or its testbench. You can define the clock either behaviorally or structurally. Here are examples of a symmetric clock:
Verilog示例教程PPT教学课件

begin case(opcode) //算术运算 `plus: out =a + b; `minus: out = a - b; //位运算 `band: out = a & b; `bor: out = a | b; `unegate: out = ~a; //单目运算 default: out = 8'hx;
endmodule
设计示例四(续) 用四个T触发器组成一个进位计数器
module ripple_carry_counter(q, clk, reset); output [3:0] q; input clk, reset; //4 instances of the module TFF are created. TFF tff0(q[0],clk, reset); TFF tff1(q[1],q[0], reset); TFF tff2(q[2],q[1], reset); TFF tff3(q[3],q[2], reset); endmodule
//延迟200个单位时间,触发事件end_first_pass
end
$finish;
//结束仿真
end
设计示例三 (续)
always @(end_first_pass) clearb = ~ clearb; //清零信号电平翻转
always @(posedge clock) $display (“ at time %0d clearb= %b data= %b qout= %b ”, $time,clearb,data,qout);
宏定义stim引用,等同于 #100 data=4'b 注意引用时要用 `符号。
Testbench文件编写纪要(Verilog)

Testbench⽂件编写纪要(Verilog)之前在使⽤Verilog做FPGA项⽬中、以及其他⼀些不同的场合下,零散的写过⼀些练⼿性质的testbench⽂件,开始⼏次写的时候,每次都会因为⼀些基本的东西没记住、写的很不熟练,后⾯写的时候稍微熟练了⼀点、但是整体编写下来⽐较零碎不成体系,所以在这⾥简要记录⼀下⼀般情况下、针对⼩型的verilog模块进⾏测试时所需要使⽤到的testbench⽂件的编写要点。
本⽂主要参考了在⽹上找到的Lattice公司的“A Verilog HDL Test Bench Primer”⼿册中的有关内容。
谢谢!模块实例化、reg&wire声明、initial和always块的使⽤需要测试的模块(Verilog-module)被称为DUT(Design Under Test),在testbench中需要对⼀个或者多个DUT进⾏实例化。
Testbench中的顶层module不需要定义输⼊和输出。
Testbench中连接到DUT instance的输⼊的为reg类型、连接到DUT instance的输出的为wire类型。
对于DUT的inout类型变量,在testbench中需要分别使⽤reg、wire类型的变量进⾏调⽤。
例如,对于下⾯这样⼀个待测试module:module bidir_infer (DATA, READ_WRITE);input READ_WRITE ;inout [1:0] DATA ;reg [1:0] LATCH_OUT ;always @ (READ_WRITE or DATA) beginif (READ_WRITE == 1)LATCH_OUT <= DATA;endassign DATA = (READ_WRITE == 1) ? 2'bZ : LATCH_OUT;endmodule为其设计的testbench⽂件可以是:module test_bidir_ver;reg read_writet;reg [1:0] data_in;wire [1:0] datat, data_out;bidir_infer uut (datat, read_writet);assign datat = (read_writet == 1) ? data_in : 2'bZ;assign data_out = (read_writet == 0) ? datat : 2'bZ;initial beginread_writet = 1;data_in = 11;#50 read_writet = 0;endendmodule和普通的Verilog模块中⼀样、使⽤assign对wire类型的变量进⾏赋值。
(verilog和vhdl)Testbench编程指南

(verilog和vhdl)Testbench编程指南TestBench编程指南如今数字设计的规模变得越来越庞大,设计的复杂程度也越来越高,这就使得设计的验证变得越来越困难,而且费时费力。
为了应对这种挑战,验证工程师依靠各种验证工具和方法。
对于大型设计,如几百万门的设计,通常采用一整套正式的验证工具。
然而,对于小一些的设计,设计工程师发现往往采用带TestBench的HDL仿真工具是最好的途径。
TestBench已经变成验证高级语言设计的一种标准的方法。
通常,TestBench执行以下任务:z例化设计,使其可测试(DUT-design under test);z通过将测试向量应用到模型来仿真例化后的可测试的设计;z将结果输出到终端,或者输出波形窗口;z将真实的结果和期望的结果进行比较;一般,TestBench采用工业标准的VHDL或者Verilog硬件描述语言来编写。
TestBench调用功能设计,然后仿真。
复杂的测试文件执行附加功能――例如,他们包含逻辑以决定合适的设计激励或者比较真实的结果和期望的结果。
以下章节将讨论一个组织良好的测试文件的组成,以及例举了一个带有自检的测试文件(自动将真实的结果和预期的结果进行比较)。
下图是一个标准的HDL验证的流程。
自从测试文件可以用VHDL或者Verilog编写以来,测试验证流程就可以在平台和供应商的工具交叉进行。
同时,由于VHDL和Verilog都是标准的公用的语言,所以用VHDL或者是Verilog描述的验证可以很简单的被再使用。
图1. HDL验证流程测试文件构成:测试文件可以采用VHDL或者Verilog语言编写。
由于测试文件只是用来仿真的,他们就不被用于综合的RTL语言子集的语法所约束。
相反,所有行为结构都可以被使用。
这样,测试文件可以被写的更通用,更易于维护。
所有的测试文件都包含以下基本内容,如表1。
如上所属,测试文件经常同时包含附加功能,如结果的可视化显示和内建错误检测。
Verilog-HDL-如何编写TESTBENCH

08:292主要内容Verilog 对验证的支持系统函数和系统任务如何编写模块的TESTBENCH08:293系统任务和系统函数是Verilog中预先定义好的,用于调试和编译预处理的任务或函数。
以$开头,用于控制和检测仿真模拟过程主要有:(1)用于获取仿真时间的系统函数(2)支持文本输出(检测信号、显示信号)的系统任务(3)用于文件输入、输出操作的系统任务(4)用于暂停和退出仿真的系统任务(5)用于产生随机数的系统任务08:294获取当前仿真时间的系统函数$time,$realtime,$stime:返回当前仿真时间。
$time返回一个64位的整数时间值,$realtime返回的结果是实数时间值,是更为精确的仿真时间 $stime返回一个32位整数时间值。
(对大于232的时间,返回模232的值。
使用它可以节省显示及打印空间。
)这些函数的返回值使用调用模块中`timescale 定义的模块仿真时间尺度为单位08:295例..\..\verilog_example\Dec2x4.v..\..\verilog_example\Dec_Test.v # At time 0, input is 0,0,0, output is,xxxx # At time 4, input is 0,0,0, output is,1111# At time 10, input is 0,0,1, output is,1111# At time 13, input is 0,0,1, output is,0111# At time 20, input is 1,0,1, output is,0111# At time 23, input is 1,0,1, output is,0101# At time 26, input is 1,0,1, output is,1101# At time 30, input is 1,1,1, output is,1101# At time 33, input is 1,1,1, output is,1100# At time 36, input is 1,1,1, output is,1110# At time 40, input is 0,1,1, output is,1110# At time 44, input is 0,1,1, output is,1011# At time 50, input is 0,0,1, output is,1011# At time 54, input is 0,0,1, output is,011108:296Verilog 支持的文本输出的系统任务显示任务:用于仿真模拟期间显示信息。
Verilog第四讲 逻辑验证与Testbench编写(P)

河海大学常州校区河海大学常州校区Verilog 中级篇1/ 43Verilog 中级篇1/ 43第四讲逻辑验证与Testbench编写1 概述2 建立Testbench 3实例:CPU接口仿真河海大学常州校区河海大学常州校区Verilog 中级篇2/ 43Verilog 中级篇2/ 43河海大学常州校区河海大学常州校区Verilog 中级篇3/ 43Verilog 中级篇3/ 43河海大学常州校区河海大学常州校区Verilog 中级篇4/ 43Verilog 中级篇4/ 43河海大学常州校区河海大学常州校区Verilog 中级篇5/ 43Verilog 中级篇5/ 43¾编写仿真激励z 仿真激励与被测对象的连接z 使用initial 语句和always 语句z 时钟、复位的写法z 产生值序列z 利用系统函数和系统任务z 从文本文件中读出和写入数据z 并行激励z 利用for 语句实现遍历测试z 封装功能模块河海大学常州校区河海大学常州校区Verilog 中级篇6/ 43Verilog 中级篇6/ 43河海大学常州校区河海大学常州校区Verilog 中级篇7/ 43Verilog 中级篇7/ 43z 使用initial 语句和always 语句•被动地检测响应时使用always 语句,主动地产生激励时则使用initial 语句•区别:initial 语句只执行一次,always 语句不断地重复执行河海大学常州校区河海大学常州校区Verilog 中级篇8/ 43Verilog 中级篇8/ 43z 时钟、复位的写法 普通时钟信号//产生一个周期为10的时钟parameter FAST_PERIOD = 10;reg Clock;initial beginClock = 0;forever# (FAST_PERIOD/2) Clock = ~Clock;end河海大学常州校区河海大学常州校区Verilog 中级篇9/ 43Verilog 中级篇9/ 43河海大学常州校区河海大学常州校区Verilog 中级篇10/ 43Verilog 中级篇10/ 43河海大学常州校区河海大学常州校区Verilog 中级篇11/ 43Verilog 中级篇11/ 43 固定数目时钟信号//两个高脉冲的时钟parameter PulseCount = 4,FAST_PERIOD = 10;reg Clock;initial beginClock = 0;repeat (PulseCount)# (FAST_PERIOD/2) Clock = ~Clock;end河海大学常州校区河海大学常州校区Verilog 中级篇12/ 43Verilog 中级篇12/ 43河海大学常州校区河海大学常州校区Verilog 中级篇13/ 43Verilog 中级篇13/ 43 异步复位信号//异步复位信号parameter PERIOD = 10;reg Rst_n;initial beginRst_n = 1;# PERIOD Rst_n = 0;# (5*PERIOD) Rst_n = 1;end//Rst_n 低有效,10ns 时开始复位,持续时间为50ns河海大学常州校区河海大学常州校区Verilog 中级篇14/ 43Verilog 中级篇14/ 43 同步复位信号//同步复位信号initial beginRst_n = 1;@(negedge Clock);//等待时钟下降沿Rst_n = 0;# 30;@(negedge Clock); //等待时钟下降沿Rst_n = 1;end河海大学常州校区河海大学常州校区Verilog 中级篇15/ 43Verilog 中级篇15/ 43河海大学常州校区河海大学常州校区Verilog 中级篇16/ 43Verilog 中级篇16/ 43//另一种同步复位信号实现方法initial beginRst_n = 1;@(negedge Clock);//等待时钟下降沿Rst_n = 0;repeat (3) @(negedge Clock);//等待3个时钟下降沿Rst_n = 1;end河海大学常州校区河海大学常州校区Verilog 中级篇17/ 43Verilog 中级篇17/ 43河海大学常州校区河海大学常州校区Verilog 中级篇18/ 43Verilog 中级篇18/ 43z 产生值序列河海大学常州校区河海大学常州校区Verilog 中级篇19/ 43Verilog 中级篇19/ 43//值序列模型Parameter SLOW PERIOD = 24;reg [5:0] Mpi_addr;reg Mpi_cs_n;reg Mpi_rw;reg Mpi_oe;tri [7:0] Mpi_data;reg [7:0] Data_out;assign Mpi_data = (Mpi_oe)? Data_out:8'bz;河海大学常州校区河海大学常州校区Verilog 中级篇20/ 43Verilog 中级篇20/ 43initial //在initial 语句块中产生值序列beginMpi_addr = 0;Mpi_cs_n = 1;Mpi_rw = 1;Mpi_oe = 0;Data_out = 0;# SLOW_PERIOD;Data_out = MY_DATA;Mpi_addr = MY_ADDR;Mpi_rw = 0;河海大学常州校区河海大学常州校区Verilog 中级篇21/ 43Verilog 中级篇21/ 43# SLOW_PERIOD;Mpi_oe = 1;# (SLOW_PERIOD/4);Mpi_cs_n = 0;# ((2*SLOW_PERIOD)+(SLOW_PERIOD/2));Mpi_cs_n = 1;# (SLOW_PERIOD/4);Mpi_addr = 0;Mpi_rw = 1;Mpi_oe = 0;# SLOW_PERIOD;end河海大学常州校区河海大学常州校区Verilog 中级篇22/ 43Verilog 中级篇22/ 43z 利用系统函数和系统任务可帮助产生测试激励,显示调试信息,协助定位 使用display 语句在仿真器中打印出地址和数据$display ("Addr:%b -> DataWrite:%d ",Mpi_addr,Data_out );利用时序检查的系统任务来检查时序$setup (Sig_D,posedge Clock,1);// 如果在Clock 上升沿到达之前的lns 时间内Sig_D发生跳变,则将给出建立时间违反告警$hold(posedge Clock,Sig_D,0.1); //如果在Clock 上升沿到达之后的0.1ns 时间内Sig_D 发生跳变,则将给出保持时间违反告警利用$randomO 系统函数来产生测试激励数据Data_out = {$random} % 256; / /产生0~255 的数据 $time 系统函数可以用来返回当前的仿真时间河海大学常州校区河海大学常州校区Verilog 中级篇23/ 43Verilog 中级篇23/ 43z 从文本文件中读出和写入数据将Read_In_File 文件中的数据读入到DataSource 数组中reg [7:0] DataSource [0:47];//定义一个二维数组$readmemh ( "Read_In_File.txt",DataSource ); 向文件中写入数据integer Write_Out_File ; //定义一个整数的文件指针Write_Out_File = $fopen ("Write_Out_File.txt "); //打开文件$fdisplay (Write_Out_File,“@%h \n%h ”,Mpi_addr,Data_in );//往文件中写入内容$fclose(Write_Out_File ); //关闭文件河海大学常州校区河海大学常州校区Verilog 中级篇24/ 43Verilog 中级篇24/ 43z 并行激励仿真的某一时刻同时启动多个任务,可采用fork …join 语法结构例:仿真开始100ns 后,同时启动发送和接收任务//并行激励initial begin#100;fork //并行操作Send_task ;Receive_task ;join end河海大学常州校区河海大学常州校区Verilog 中级篇25/ 43Verilog 中级篇25/ 43z 利用for 语句实现遍历测试设计的工作模式很多时,需对各种模式进行遍历测试,此时采用for 循环语句来减少工作量for (i=0;i<m;i =i+ 1) //遍历模式1至m -1for (j=0;j<n;j =j+1) //遍历子模式1至n -1begincase (j) //设置每种模块的配置值0 : Conf_Value = a;1 : Conf_Value = b;...endcase //共用的测试向量end河海大学常州校区河海大学常州校区Verilog 中级篇26/ 43Verilog 中级篇26/ 43z 封装功能模块 任务(Task )格式:task 任务名称;输入,输出声明;语句;endtask ;河海大学常州校区河海大学常州校区Verilog 中级篇27/ 43Verilog 中级篇27/ 43//例如一个读CPU 接口的任务task Read;output [ 7:0] Rtask_Data;//data read out input [5:0] Rtask_Addr;beginuP_rw = 0;# SLOW_PERIOD;uP_addr = Rtask_Addr;uP_rw = 1;# SLOW_PERIOD;…endendtask //调用格式Read (Data, Addr);河海大学常州校区河海大学常州校区Verilog 中级篇28/ 43Verilog 中级篇28/ 43 函数(Function )格式:function [bitwidth -1:0]函数名称;输入声明;语句;endfunction ;与任务不同,函数将返回一个bitwidth 宽度的值河海大学常州校区河海大学常州校区Verilog 中级篇29/ 43Verilog 中级篇29/ 43function [7:0] Product ;input [3:0] Sig_A;input [3:0] Sig_B;beginProduct = Sig_A * Sig_B;endendfunction//调用格式ProductResult = Product (A, B);//将A 和B 的乘积赋值给ProductResult 变量河海大学常州校区河海大学常州校区Verilog 中级篇30/ 43Verilog 中级篇30/ 43¾搭建仿真环境z 测试平台顶层z 时钟激励产生z 复位激励产生z 各种测试用例z 设计模块实例河海大学常州校区河海大学常州校区Verilog 中级篇31/ 43Verilog 中级篇31/ 43河海大学常州校区河海大学常州校区Verilog 中级篇32/ 43Verilog 中级篇32/ 43module Testbench ;//测试平台顶层//时钟激励产生initial begin …end//复位激励产生initial begin …end河海大学常州校区河海大学常州校区Verilog 中级篇33/ 43Verilog 中级篇33/ 43initial//各种测试用例begin …endMPI u_MPI(//设计模块实例.Clock (Clock),.Rst_n (Rst_n),.Mpi_data (Mpi_data),.Mpi_addr (Mpi_addr),.Mpi_cs_n (Mpi_cs_n),.Mpi_rw (Mpi_rw));endmodule河海大学常州校区河海大学常州校区Verilog 中级篇34/ 43Verilog 中级篇34/ 43河海大学常州校区河海大学常州校区Verilog 中级篇35/ 43Verilog 中级篇35/ 43¾编写Testbench 时需注意的问题z Testbench 不是硬件z 使用行为级描述方式描述Testbench z 设计高效的Testbench •避免使用无限循环•使用逻辑模块划分激励•避免不必要的输出显示•掌握程式化的仿真结构描述方法河海大学常州校区河海大学常州校区Verilog 中级篇36/ 43Verilog 中级篇36/ 43河海大学常州校区河海大学常州校区Verilog 中级篇37/ 43Verilog 中级篇37/ 43河海大学常州校区河海大学常州校区Verilog 中级篇38/ 43Verilog 中级篇38/ 43假设已知设计模块为MPI ,接口定义如下:'timescale lns/100ps moduleMPI(Clock,Rst_n,Mpi_data,Mpi_addr,Mpi_cs_n,Mpi_rw);input Clock;input Rst_n;inout [7:0] Mpi_data;input [5:0] Mpi_addr;input Mpi_cs_n;// Chip Select input Mpi_rw; // 1:read; 0:write endmodule河海大学常州校区河海大学常州校区Verilog 中级篇39/ 43Verilog 中级篇39/ 43测试方法:module NorTestBench;//testbench 顶层模块……//时钟激励产生initial beginClock = 0;Forever# (FAST_PERIOD/2) Clock =~Clock;end河海大学常州校区河海大学常州校区Verilog 中级篇40/ 43Verilog 中级篇40/ 43……//复位激励产生initial beginRst_n = 1;# FAST_PERIOD Rst_n = 0;# (5*FAST_PERIOD)Rst_n = 1;end//输出三态buffer ,用于和MPI 接口的数据总线相连assign Mpi_data = (Mpi_oe)?Data_out:8’bz;河海大学常州校区河海大学常州校区Verilog 中级篇41/ 43Verilog 中级篇41/ 43//仿真向量产生initialbegin:ACCESS//根据前面介绍的方法产生读写序列for (i=6’b101111;i>=0;i=i-1)//遍历47~0地址begin ……Mpi_addr = i ;//用$random 系统函数产生写入的数据Data_out = {$random} %256; //数据范围0~255//打印出写入的地址数据信息$display (“Addr:%b->DataWrite:%d”,Mpi_addr,Data_out);//打印出读出的地址数据信息$display (“Addr:%b->DataRead:%d”,Mpi_addr,Data_in);……$stop;//仿真停止end河海大学常州校区河海大学常州校区Verilog 中级篇42/ 43Verilog 中级篇42/ 43……$stop;end//设计模块实例MPI u_MPI(.Clock (Clock),//寄存器型变量.Rst_n (Rst_n),//寄存器型变量.Mpi_data (Mpi_data), //tri 型变量.Mpi_addr (Mpi_addr),//寄存器型变量.Mpi_cs_n (Mpi_cs_n),//寄存器型变量.Mpi_rw (Mpi_rw)//寄存器型变量);endmodule河海大学常州校区河海大学常州校区Verilog 中级篇43/ 43Verilog 中级篇43/ 43测试说明:在Testbench 中,使用系统函数$random 产生0~255之间的随机数,然后从地址47~0写入,并在同一地址读出。