上篇文章的testbench的方法有些冗杂,这篇中使用随机函数。随机函数可以用在测试仿真中,产生激励,不可被综合。
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/07/06 16:45:46
// Design Name: czy
// Module Name: key_filter_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module key_filter_tb();
reg Clk;
reg Reset_n;
reg key;
wire key_flag;
wire key_state;
key_filter key_filter(
Clk,
Reset_n,
key,
key_flag,
key_state
);
//产生时钟
initial Clk=1;
always#10 Clk=~Clk;
initial begin
Reset_n = 0;
key=1;//按键正常情况高电平
#201;//避开时钟的上升沿
Reset_n = 1;//释放复位
#30000;
press_key(2);
$stop;
end
//抖动在20ms = 0001001100010010110100000000 25位
reg [24:0]rand;
task press_key; //task中 input的值便于改变
input [3:0]seed;
begin
key =1;
#20_000_000;
repeat(5)begin
rand= {$random(seed)}%10_000_000;//random 可以产生一个32位的随机数 有符号种子 $random 随机 0~10_000_000-1之间的值 防止值为0 零次延迟加起来 超过20ms
#rand key=~key;
end
key = 0;
#50_000_000;
repeat(5)begin
rand= {$random(seed)}%10_000_000;//random 可以产生一个32位的随机数 有符号种子 $random 随机 0~10_000_000-1之间的值 防止值为0 零次延迟加起来 超过20ms
#rand key=~key;
end
key =1;
#50_000_000;
end
endtask
endmodule
仿真结果
有些 问题?!看一下子模块的内部信号
修改一下模块的设计 回到idle状态要记得清零