320 字
2 分钟
Testbench书写
总结一些testbench常用模块和语法以及仿真时出现的问题。
—————————————————————————————————————
1 testbench常用小模块
1.1 时钟产生模块
产生50MHz时钟模块:
`timescale 1ns/1ns`define CLK50M_PERIOD 20initial clk = 1'b1;always #(`CLK50M_PERIOD/2) clk = ~clk;2 testbench语法
2.1 task语法
task表示任务,里面的语句顺序执行,写好之后直接调用即可,注意加括号,该语法可以起到精简代码的作用。
initial begin rst_n = 0; #201; rst_n = 1; #20000; key_press(); //调用 #20000;end
reg key;task key_press; //定义 begin key = 1; #200000; key = 0; endendtask2.2 repeat语法
repeat表示重复,括号中为次数。 简单的重复10次的例子:
repeat(10) begin key = 1; #200000; key = 0;end含敏感信号的例子:
repeat(10) @(posedge clk) syn_rst = 1'b0;2.3 随机数$random(不可综合)
random函数仅用于测试验证,如果需要可综合的随机数,需要研究LSFR等随机数生成方法。 产生一个(-50,50)范围内的随机数:
reg [23:0] rand;rand = $random % 50产生一个(min,max)范围内的随机数:
reg [23:0] rand;rand = min + {$random} % (max - min + 1);2.4 wait语法
等待key=1时往下执行。
wait(key == 1);2.5 for语法
与C基本一致,注意不能i++,实例如下:
for(i=0;i<100;i=i+1) begin key = 1; #(i * 1000); key = 0;end—————————————————————————————————————
部分信息可能已经过时