求教用Verilog写testbench测试文件

module e_piano(iclk_50,keyin,buzzout);
input iclk_50;
input [7:0] keyin;
output buzzout;
reg [17:0] N;
reg [17:0] cnt;
reg clk_buzz;

initial
begin
clk_buzz=0;
cnt=0;
end

always@(posedge iclk_50)
begin
if(!keyin[7]) //----do
N<=191132;
else if(!keyin[6]) //----ri
N<=170242;
else if(!keyin[5]) //----mi
N<=151700;
else if(!keyin[4]) //----fa
N<=143184;
else if(!keyin[3]) //----so
N<=127552;
else if(!keyin[2]) //----la
N<=113636;
else if(!keyin[1]) //----si
N<=101236;
else if(!keyin[0]) //----#do
N<=95548;
else begin
clk_buzz<=0;
cnt<=17'd0;
end

//always@(posedge iclk_50)
// begin
if(cnt==N/2-1)//--//div clock by N
begin
clk_buzz<=~clk_buzz;
cnt<=0;
end
else
cnt<=cnt+1;
end

assign buzzout=clk_buzz;
endmodule
这是一个电子琴电路的程序,要用Modelsim仿真,不知道测试文件要怎么写。下面是Vim的testbench模板,有几个地方不知道该怎么填啊T.T求教求教
`timescale 1 ns/1 ns
module e_piano_tb();
//时钟和复位
reg clk ;
//uut的输入信号
reg iclk_50 ;
reg[7:0] keyin ;

//uut的输出信号
wire buzzout;
//时钟周期,单位为ns,可在此修改时钟周期。
parameter CYCLE = 20;
//复位时间,此时表示复位3个时钟周期的时间。
parameter RST_TIME = 3 ;
//待测试的模块例化
e_piano uut(
.clk (clk ),
.din0 (iclk_50 ),
.din1 (buzzout ),

//生成本地时钟50M
initial begin
clk = 0;
forever
#(CYCLE/2)
clk=~clk;
end
//产生复位信号
initial begin
rst_n = 1;
#2;
rst_n = 0;
#(CYCLE*RST_TIME);
rst_n = 1;
end
//输入信号din0赋值方式
initial begin
#1;
//赋初值
din0 = 0;
#(10*CYCLE);
//开始赋值
end
//输入信号din1赋值方式
initial begin
#1;
//赋初值
din1 = 0;
#(10*CYCLE);
//开始赋值
end

endmodul

测试就是往DUT接口上加激励,通过DUT的输出判断是否正确。
对应到你的模块就是
input iclk_50;
input [7:0] keyin;
这两个input,时钟端口就给一个时钟
keyin给独热码0000000,,0000001,0000010..1000000就可以了
不知道你需不需要判断buzzout输出是否正确,需要的话还要更麻烦些追问

需要判断buzzout输出的话还要添什么吗

追答

那就麻烦一些了
因为你buzzout输出是一个特定频率的方波,你需要做一个频率计才行,比如1us内数一下接收到了多少个上升沿,算一下频率这样

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答