测试平台是个没有输入输出端口的模块。仿真在一个模块设计中是很关键的步骤,而testbench是仿真的很好工具。 与待测模块接口 与输入端口相连接的变量定义为reg 与输出端口相连的定义为wire initial块中初始化变量,必须的。 用$stop或$finish暂停或结束仿真 wait(z==1’b1);//等待变量值改变,变量可以是待测试模块的输出或者内部变量 时钟产生: always # 10 clk =~clk;产生时钟 initial repeat(13) #5 clk =~clk; //控制只产生13个时钟。 同步数据: initial forever @ (posedge clk) #3 x = $random; 为了降低多个输入同时翻转的概率,对时序电路的输入一般采用素数作为时间间隔。 同步显示: l initial $monitor (“%d is changed at %t”,MUT.current,$time);// 一般在 initial中调用,采用$monitor显示模块MUT内部current的值以及发生变化的时间,$monitor是一个后台运行任务函数,多个模块下,任意时间只能有一个$monitor起作用,可用$monitoron $monitoroff来控制。 l always @(z) $display(“Output changed at %t to %b”,$time,z);当z发生变化输出z值以及变化时间,自动换行。 l always @(z) $strobe(“Output changed at %t to %b”,$time,z);//仿真结束后显示输出,查看非阻塞赋值变量的值。 随机数据 initial repeat(5) #7 x = $random; a = $random%60; //产生-59~59之间随机数 a = {$random}%60; //产生0~59之间随机数 产生随机时间间隔 always begin t= $random; #(t) x = $random; end 数据缓存 initial buffer = 16’b1110_0001_1011_0101;//将测试数据进行初始化 always @ ( posedge clk) #1 {x,buffer} = {buffer,x};//可以在控制的数据下输入信号x 读取数据文件 reg [7:0] mem1[0:1024]; initial begin $readmemh( “data1.dat” , mem1); 模板: `timescale 1ns/100ps `include “*.v” module t; 参数定义 输入测试模块的测试信号定义 reg,wire 内部变量定义 initial begin 初始化变量 $monitor (“%d is changed at %t”,MUT.current,$time);//监控数据 forever @ (posedge clk) #3 x = $random;//同步数据 repeat(5) #7 x = $random; end always @(z) $display(“Output changed at %t to %b”,$time,z); always @(z) $strobe(“Output changed at %t to %b”,$time,z); always # 10 clk =~clk;//产生时钟 always begin// t= $random; #(t) x = $random; end 模块实例化 defparam module. WIDTH = 32; endmodule |
Testbench编写技巧
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:MySQL里null与空值的辨析
下一篇:VC滑动条(滑块)控件颜色变化

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章