没有合适的资源?快使用搜索试试~ 我知道了~
如何编写testbench的总结
需积分: 50 29 下载量 154 浏览量
2017-09-16
10:28:16
上传
评论 3
收藏 247KB PDF 举报
温馨提示
试读
23页
如何编写testbench的总结如何编写testbench的总结如何编写testbench的总结如何编写testbench的总结如何编写testbench的总结如何编写testbench的总结
资源推荐
资源详情
资源评论
如何编写 testbench 的总结(非常实用的总结)
1.激励的设置
相应于被测试模块的输入激励设置为 reg 型,输出相应设置为 wire 类型,双向
端口 inout 在测试中需要进行处理。
方法 1:为双向端口设置中间变量 inout_reg 作为该 inout 的输出寄存,inout
口在 testbench 中要定义为 wire 型变量,然后用输出使能控制传输方向。
eg:
inout [0:0] bi_dir_port;
wire [0:0] bi_dir_port;
reg [0:0] bi_dir_port_reg;
reg bi_dir_port_oe;
assign bi_dir_port=bi_dir_port_oe?bi_dir_port_reg:1'bz;
用 bi_dir_port_oe 控制端口数据方向,并利用中间变量寄存器改变其值。等于
两个模块之间用 inout 双向口互连。往端口写(就是往模块里面输入?/span>
方法 2:使用 force 和 release 语句,这种方法不能准确反映双向端口的信
号变化,但这种方法可以反映块内信号的变化。具体如示:
module test();
wire data_inout;
reg data_reg;
reg link;
#xx; //延时
force data_inout=1'bx; //强制作为输入端口
...............
#xx;
release data_inout; //释放输入端口
endmodule
从文本文件中读取和写入向量
1)读取文本文件:用 $readmemb 系统任务从文本文件中读取二进制向
量(可以包含输入激励和输出期望值)。$readmemh 用于读取十六进制文件。例
如:
reg [7:0] mem[1:256] // a 8-bit, 256-word
定义存储器 mem
initial $readmemh ( "mem.data", mem ) // 将.dat 文件读入寄存器 mem 中
initial $readmemh ( "mem.data", mem, 128, 1 ) // 参数为寄存器加载数
据的地址始终
$fopen 例如: 2)输出文本文件:打开输出文件用
integer out_file; // out_file 是一个文件描述,需要定义为 integer 类型
out_file = $fopen ( " cpu.data " ); // cpu.data 是需要打开的文件,也就
是最终的输出文本
设计中的信号值可以通过$fmonitor, $fdisplay,
6.Verilog Testbench 信号记录的系统任务:
1). SHM 数据库可以记录在设计仿真过程中信号的变化. 它只在 probes 有效
的时间内记录你 set probe on 的信号的变化.
ex). $shm_open("waves.shm"); //打开波形数据库
$shm_probe(top, "AS"); // set probe on "top",
$shm_close //关闭数据库
在记录信号或者波形时需要指出被记录信号的路径,如:tb.module.u1.clk.
编写高效的测试设计(testbenches)( 译)
Writing Efficient Testbenches
编写高效的测试设计(testbenches)
原文作者:Mujtaba Hamid
注:
一个设计的测试验证是非常重要的。有效的测试可以助我们快速的完成或改善
设计。Testbenches建议编写有效的测试代码来通过软件实现可靠的验证。无意
中发现,顺手译为中文,以备将来方便。也贴给没有找到更好中文版本的同道人。
Testbenches本意应该是测试平台更合理,但是在中文中阅读起来很不舒服。
所以本文中有时译为“测试设计”,“测试代码”,有时干脆是“测试”。
摘要:
应用笔记为HDL验证设计的新手,或者是没有丰富的测试设计经验的逻辑设计
者而编写。
测试设计是验证HDL设计的主要手段。本应用笔记为创建或准备和构建有效的
测试设计提供准则。它也提供一个为任何设计开发自较验测的测试设计的一个代
数方法。
涉及的所有设计文件可以从以下的站点获得:
PC: ftp://ftp.xilinx.com/pub/applications/xapp/xapp199.zip
UNIX: ftp://ftp.xilinx.com/pub/applications/xapp/xapp199.tar.gz
简介:
由于设计的规模越来越大和越来越复杂,数字设计的验证已经成为一个日益
困难和繁琐的事。面对挑战,验证工程师们依靠许多的验证工具和方法。对于大
的系统,如几百万门的设计,工程师们一般使用一套可靠的验证工具。当然,对
于一些小的设计,设计工程师常常发现带有测试的hdl仿真器就可以做得很好。
测试设计已经成为一个验证高级语言设计HLL (High-Level Language) 的标
准方法。
典型的,测试设计完成以下任务:
实现测试设计;
仿真通过使用模块的测试向量来仿真测试设计;
输出结果到终端或波形窗口以检视;
可选择的将实际结果和预期结果进行比较。
一般测试设计使用工业标准的VHDL或verilog硬件描述语言来编写。测试设计
调用功能设计,然后仿真。复杂的测试设计完成一些附加的功能----如它们包含
逻辑来为设计决定适当的设计激励或比较实际结果和预期结果。
后续的章节说明了一个非常稳定的测试设计的结构,并且提供了一个自较验
测例子----它将自动比较实际结果和测试设计的预期结果。
图 1 说明一个基于以上基本要求的标准的hdl验证流程。由于测试设计使用V
HDL或verilogHDL来描述,测试设计的验证过程可以在不同的平台或不同公司的
软件工具环境完成。另外,由于VHDL或verilogHDL是公开的通用标准语言,使用V
HDL或verilogHDL来描述验证设计可以毫无困难的在将来重用。
图 1 使用测试设计的HDL测试验证流程
构建测试设计:
测试设计可以用VHDL或verilogHDL来描述.因为测试设计只用来进行仿真,
它们没有那些适应综合中仅应用的rtl语言子集的语法约束的限制.而是所有的
行为结构都可以使用。从而测试设计可以编写的更为通用,使得它们可以更容易
维护。
所有的测试设计包含了如表 1 的基本程序段块。正如上面所提到的,测试设
计一般包含更多的附加功能,如在终端上可视的结果和内建的错误检测。
表 1 测试设计的基本程序段
下面的例子说明经常使用的测试设计的结构。
产生时钟信号
使用系统时钟来的时序逻辑设计必须产生时钟。重复的时钟信号可以很容易
的在 vhdl 或 verilog 源码中实现。以下是 vhdl 和 verilog 的时钟发生示例。
VHDL:
-- Declare a clock period constant.
Constant ClockPeriod : TIME := 10 ns;
-- Clock Generation method 1:
Clock <= not Clock after ClockPeriod / 2;
-- Clock Generation method 2:
GENERATE CLOCK: process
begin
wait for (ClockPeriod / 2)
Clock <= ’1’;
wait for (ClockPeriod / 2)
Clock <= ’0’;
end process;
Verilog:
// Declare a clock period constant.
Parameter ClockPeriod = 10;
// Clock Generation method 1:
initial begin
forever Clock = #(ClockPeriod / 2) ~ Clock;
end
// Clock Generation method 2:
initial begin
always #(ClockPeriod / 2) Clock = ~Clock;
end
准备激励信号
为了获得测试设计的验证结果,激励必须在测试设计中提供。在测试设计中
使用的并行激励块提供必要的激励。两个方法被考虑:绝对时间激励和相对时间
激励。在第一个方法里,仿真变量被详细描述为相对于仿真时间零点。通过比较,
相对时间激励提供初始值,然后在重触发激励前等待一个事件。根据设计者的需
要,两种方法可以在测试设计中组合使用。
点击浏览该文件
励 表 2 绝对时间激
表 2 和表 3 分别以vhdl和verilog提供了一个绝对时间激励和相对时间激励
的源代码。
点击浏览该文件
励 表 3 相对时间激
VHDL进程块和Verilog初始块与设计文件中的其他的进程块或初始块同时执
行。然而,在每一个进程块或初始块中,事件是按照书写的顺序有序的规划的。
这说明在仿真时间零点并发的每一个块激励的顺序。多模块应该被用来将复杂的
激励顺序分解为有更好的可读性和方便维护的代码。
显示结果
在verilog中推荐使用关键字$display 和 $monitor
显示结果。虽然vhdl没有等效的显示指令,它提供了std_textio标准文本输
入输出程序包。它允许文件的i/o重定向到显示终端窗口(作为这个技术的示例,
参看下面的自较验查验证设计)
下面是verilog示例,它将在终端屏幕上显示一些值。
// pipes the ASCII results to the terminal or text editor
initial begin
$timeformat(-9,1,"ns",12);
$display(" Time Clk Rst Ld SftRg Data Sel");
$monitor("%t %b %b %b %b %b %b", $realtime,
clock, reset, load, shiftreg, data, sel);
end
关键字
$display在终端屏幕上输出引用的附加的说明文字(“。。。”).关键字$
monitor操作不同。因为它的输出是事件驱动的。例中的变量$realtime(由用户
赋值到当前的仿真时间)用于触发信号列表中值的显示。信号表由变量
$realtime开始,跟随其他将要显示的信号名(clock, reset,load等)。以
%开始的关键字包含一个格式描述的表,用来控制如何格式化显示信号列表中的
每个信号的值。格式列表是位置确定的。每个格式说明有序地与信号列表中的信
号顺序相关。比如%t说明规定了$realtime的值是时间格式。并且第一个%b说明
符格式化clock的值是二进制形式。verilog提供附加的格式说明,比如%h用于说
明十六进制,%d说明十进制,%c说明显示为八进制。(参见verilog准则了解完
整的关键字及格式描述符)
点击浏览该文件
简单的测试设计
简单的测试设计实例化用户设计,然后提供相应的激励。测试输出被图形化
显示在仿真器的波形窗口里或者作为文本发送到用户的终端或者是管道输出文
本。
以下是一个简单的用 Verilog 实现的设计,它实现了一个移位寄存器的功
能。
module shift_reg (clock, reset, load, sel, data, shiftreg);
input clock;
input reset;
input load;
input [1:0] sel;
input [4:0] data;
output [4:0] shiftreg;
reg [4:0] shiftreg;
always @ (posedge clock)
begin
if (reset)
shiftreg = 0;
else if (load)
shiftreg = data;
else
case (sel)
2’b00 : shiftreg = shiftreg;
2’b01 : shiftreg = shiftreg << 1;
2’b10 : shiftreg = shiftreg >> 1;
default : shiftreg = shiftreg;
剩余22页未读,继续阅读
资源评论
博欧沥干Booligan
- 粉丝: 3
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功