我是靠谱客的博主 迷路往事,这篇文章主要介绍testbench常用语法总结,现在分享给大家,希望可以做个参考。

1.testbench总体代码结构

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
`timescale 1ns/1ps //时间精度 `define clk_perilod 20 //时钟周期可变 module test_file_tb; //==================<端口>================================================== reg clk ; //时钟,50Mhz reg rst_n ; //复位,低电平有效 reg [XX:0] in ; // wire [XX:0] out ; // //-------------------------------------------------------------------------- //-- 模块例化 //-------------------------------------------------------------------------- my_design u_my_design ( .clk (clk ), .rst_n (rst_n ), .in (in ), .out (out ) ); //---------------------------------------------------------------------- //-- 时钟信号和复位信号 //---------------------------------------------------------------------- initial begin clk = 0; forever #(`Clock/2) clk = ~clk; end initial begin rst_n = 0; #(`Clock*20+1); rst_n = 1; end //---------------------------------------------------------------------- //-- 设计输入信号 //---------------------------------------------------------------------- initial begin in = 0; #(`Clock*20+2); //初始化完成 $stop; end endmodule在这里插入代码片

2.时钟激励的编写

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
`timescale 1ns/1ps //时间精度 `define Clock 20 //时钟周期 //========================================================================== //== 方法一,50%占空比 //========================================================================== initial begin clk = 0; forever #(`Clock/2) clk = ~clk; end //========================================================================== //== 方法二,50%占空比 //========================================================================== initial begin clk = 0; always #(`Clock/2) clk = ~clk; end //========================================================================== //== 方法三,产生固定输入的时钟脉冲 //========================================================================== initial begin clk = 0; repeat(6) #(`Clock/2) clk = ~clk; end //========================================================================== //== 方法四,非50%占空比 //========================================================================== initial begin clk = 0; forever begin #((`Clock/2)-2) clk = 0; #((`Clock/2)+2) clk = 1; end end

3.复位信号

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
`timescale 1ns/1ps //时间精度 `define Clock 20 //时钟周期 //========================================================================== //== 方法一,异步复位 //========================================================================== initial begin rst_n = 0; #(`Clock*20+1); rst_n = 1; end //========================================================================== //== 方法二,同步复位 //========================================================================== initial begin rst_n = 0; #(`Clock*20); rst_n = 1; end

4.task使用

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//========================================================================== //== 输入信号任务封装 //========================================================================== 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) @(posedge clk) //等待 times 个时钟上升沿 c=a+b; end endtask //调用方法:more_input(x,y,t,z); //按声明顺序

5.repeat ,wait函数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//========================================== //== repeat重复执行 //========================================== initial begin start = 1; repeat(5) @(posedge clk) //等待5个时钟上升沿 start = 0; end initial begin repeat(10)begin ...//执行10次 end end //=========================================== //== wait为电平触发 //========================================== initial begin start = 1; wait(en); //等待en==1 start = 0; end

6.随机数产生

复制代码
1
2
3
4
5
6
7
$random //产生随机数 $random % n //产生范围 {-n,n} 的随机数 {$random} % n //产生范围 { 0,n} 的随机数

7.文本输入输出

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
reg [a:0] data_mem [0:b]; //定义位宽为(a+1)深度为(b+1)的存储器 $readmemb/$readmemh("<读入文件名>",<存储器名>); $readmemb/$readmemh("<读入文件名>",<存储器名>,<起始地址>); $readmemb/$readmemh("<读入文件名>",<存储器名>,<起始地址>,<结束地址>); $readmemb /*------------------------------------------------------------------------* 读取二进制数据,读取文件内容只能包含:空白位置,注释行,二进制数 数据中不能包含位宽说明和格式说明,每个数字必须是二进制数字。 *------------------------------------------------------------------------*/ $readmemh /*------------------------------------------------------------------------* 读取十六进制数据,读取文件内容只能包含:空白位置,注释行,十六进制数 数据中不能包含位宽说明和格式说明,每个数字必须是十六进制数字. *------------------------------------------------------------------------*/ //========================================================================== //== 输出txt文件 //========================================================================== integer fp_write; //定义 initial begin begin fp_write = $fopen("output.txt"); //打开输出文件 begin $fwrite(fp_write, "n%h", output_data); //写入数据16进制 #(`clk_period); end end $fclose(fp_write); //关闭文件,不可少 end

8.打印信息

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$monitor //仿真打印输出,打印出仿真过程中的变量,使其终端显示 /*------------------------------------------------------------------------* $monitor($time,,,"clk=%d reset=%d out=%d",clk,reset,out); *------------------------------------------------------------------------*/ $display //终端打印字符串,显示仿真结果等 /*------------------------------------------------------------------------* $display(” Simulation start ! "); $display(” At time %t,input is %b%b%b,output is %b",$time,a,b,en,z); *------------------------------------------------------------------------*/ $time //返回 64 位整型时间 $stime //返回 32 位整型时间 $realtime //实行实时模拟时间

================================================部分转载自https://www.cnblogs.com/xianyufpga/======如有问题请联系删除谢谢

最后

以上就是迷路往事最近收集整理的关于testbench常用语法总结的全部内容,更多相关testbench常用语法总结内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部