IC 设计 验证 -学习笔记

本文详细介绍了IC设计验证中测试激励的编写,包括时钟、复位信号和特殊信号的设计方法,以及如何在testbench中处理双向信号。内容涵盖了不同类型的时钟产生、异步和同步复位,以及输入信号任务封装。此外,还讨论了仿真控制语句、系统任务以及内存数据的读取方法。
摘要由CSDN通过智能技术生成

IC 设计 验证
编写 TESTBENCH 的目的是为了对使用硬件描述语言设计的电路进行仿真验证,测试
设计电路的功能、性能与设计的预期是否相符。通常,编写测试文件的过程如下:
• 产生模拟激励(波形);
• 将产生的激励加入到被测试模块中并观察其响应;
• 将输出响应与期望值相比较。
完整的test bench 文件结构

时钟激励
/----------------------------------------------------------------
时钟激励产生方法一:50%占空比时钟
----------------------------------------------------------------
/
parameter ClockPeriod=10;
initial
begin
clk_i=0;
forever
#(ClockPeriod/2) clk_i=~clk_i;
End

/----------------------------------------------------------------
时钟激励产生方法二:50%占空比时钟
----------------------------------------------------------------
/
initial
begin
clk_i=0;
always #(ClockPeriod/2) clk_i=~clk_i;
End

/----------------------------------------------------------------
时钟激励产生方法四:产生固定数量的时钟脉冲
----------------------------------------------------------------
/
initial
begin
clk_i=0;
repeat(6)
#(ClockPeriod/2) clk_i=~clk_i;
End

/----------------------------------------------------------------
时钟激励产生方法五:产生非占空比为 50%的时钟
----------------------------------------------------------------
/
initial
begin
clk_i=0;
forever
begin
#((ClockPeriod/2)-2) clk_i=0;
#((ClockPeriod/2)+2) clk_i=1;
end
End

复位信号设计:
/----------------------------------------------------------------
复位信号产生方法一:异步复位
----------------------------------------------------------------
/
initial
begin
rst_n_i=1;
#100;
rst_n_i=0;
#100;
rst_n_i=1;
end
/----------------------------------------------------------------
复位信号产生方法二:同步复位
----------------------------------------------------------------
/
initial
begin
rst_n_i=1;
@(negedge clk_i)
rst_n_i=0;
#100; //固定时间复位
repeat(10) @(negedge clk_i); //固定周期数复位
@(negedge clk_i)
rst_n_i=1;
end
/----------------------------------------------------------------
复位信号产生方法三:复位任务封装
----------------------------------------------------------------
/
task reset;
input [31:0] reset_time; //复位时间可调,输入复位时间
RST_ING=0; //复位方式可调,低电平或高电平
begin
rst_n=RST_ING; //复位中
#reset_time; //复位时间
rst_n_i=~RST_ING; //撤销复位,复位结束
end
Endtask

特殊信号设计
/----------------------------------------------------------------
特殊激励信号产生描述一:输入信号任务封装
----------------------------------------------------------------
/
task i_data;
input [7:0] dut_data;
begin
@(posedge data_en); send_data=0;
@(posedge data_en); send_data=dut_data[0];
@(posedge data_en); send_data=dut_data[1];
@(posedge data_en); send_data=dut_data[2];
@(posedge data_en); send_data=dut_data[3];
@(posedge data_en); send_data=dut_data[4];
@(posedge data_en); send_data=dut_data[5];
@(posedge data_en); send_data=dut_data[6];
@(posedge data_en); send_data=dut_data[7];
@(posedge data_en); send_data=1;
#100;
end
endtask
//调用方法:i_data(8’hXX);
/----------------------------------------------------------------
特殊激励信号产生描述二:多输入信号任务封装
----------------------------------------------------------------
/
task more_input;
input [7:0] a;
input [7:0] b;
input [31:0] times;
output [8:0] c;
begin
repeat(times) //等待 times 个时钟上升沿
@(posedge clk_i)
c=a+b; //时钟上升沿 a,b 相加
end
endtask
//调用方法:more_input(x,y,t,z); //按声明顺序
/----------------------------------------------------------------
双向信号描述一:inout 在 testbench 中定义为 wire 型变量
----------------------------------------------------------------
/
//为双向端口设置中间变量 inout_reg 作为 inout 的输出寄存,其中 inout 变
//量定义为 wire 型,使用输出使能控制传输方向
//inout bir_port;
wire bir_port;
reg bir_port_reg;
reg bi_port_oe;
assign bi_port=bi_port_oe ? bir_port_reg : 1’bz;
/----------------------------------------------------------------
双向信号描述二:强制 force
----------------------------------------------------------------
/
//当双向端口作为输出口时,不需要对其进行初始化,而只需开通三态门
//当双向端口作为输入时,只需要对其初始化并关闭三态门,初始化赋值需
//使用 wire 型数据,通过 force 命令来对双向端口进行输入赋值
//assign dinout=(!en) din :16’hz; 完成双向赋值
initial
begin
force dinout=20;
#200
force dinout=dinout-1;
end
/----------------------------------------------------------------
特殊激励信号产生描述三:输入信号产生,一次 SRAM 写信号产生
----------------------------------------------------------------
/
initial
begin
cs_n=1; //片选无效
wr_n=1; //写使能无效
rd_n=1; //读使能无效
addr=8’hxx; //地址无效
data=8’hzz; //数据无效
#100;
cs_n=0; //片选有效
wr_n=0; //写使能有效
addr=8’hF1; //写入地址
data=8’h2C; //写入数据
#100;
cs_n=1;
wr_n=1;
#10;
addr=8’hxx;
data=8’hzz;
end
/----------------------------------------------------------------
Testbench 中@与 wait
----------------------------------------------------------------
/
//@使用沿触发
//wait 语句都是使用电平触发
initial
begin
start=1’b1;
wait

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值