Testbench的作用,在于给我们编写的可综合代码的模块送入激励。即在我们波形仿真中用编写testbench来代替拖拽波形。其中还包括了我们硬件仿真与matlab仿真的联调建立(将matlab产生的数据读入,或者将模块的输出写入到文本,供matlab调用检测)。

对于testbench的编写的几点总结:

1.利用`timescale设置仿真时间单位和时间精度。格式:

`timescale 时间单位/时间精度

2.用localparam、parameter来定义测试模块中需要定义的常数。

定义常数往往是为了使测试代码可复用,如N点的FFT可将N常数化,这样不同的N则可用相同的代码来测试。

3.读取由matlab产生的数据,

Initial  $readmemb(“D:/……”,input);//或者用readmemh,即二进制与十六进制的差别。

4.时钟块

always

begin

clk = 1’b0;

#30  forever

#50 clk=~clk;

end

很多书上都是直接:always #50 clk=~clk;这样虽然简单,可是时钟从0开始就已经跑了,总有些不合适。凡事留些余地的好。另外,为了测试方便,我们都加上时钟计数块。

always

begin

clk_cnt = 0;

#30  forever

#100 clk_cnt = clk_cnt + 1;

end

这样我们可以在仿真波形出来后,清晰的看到第几个时钟各个端口、变量是个什么样的状况。

5.控制信号的赋值

每个控制信号都由单独的一个initial块来管理。如:

initial

begin

clrn = 1;

#30 clrn = 0;

#130 clrn = 1;

end

6.控制仿真总时间,用$stop;

#10000 $stop;

7.将仿真结果输出到txt文本,以供matlab读取进行比对。

integer w_file;

initial w_file = $fopen(“data_out.txt”);//在当前目录新建文本,并打开。

always @ (posedge clk)

begin

#10 if(en_out)//此处延时是因为激励信号经过被测试模块后都会有小段延时,延时时间可自己斟酌。

begin

$fdisplay(w_file,”%h”,data_out);

end

end

例如:这是个DTMB系统中LDPC编码器的其中一个模块的测试文件。

`timescale 1ns/1ps

module tb_circmatrix;

reg clk,reset,data_in,en_in;

reg [126:0]g;

reg load;

wire [126:0]data_out;

wire en_out;

reg [126:0]matlab_in;

//5DCE86622D846BF272215A792AF31A3E

integer w_file;

initial w_file = $fopen("data_out.txt");

always @ (posedge clk)

begin

if(en_out)

$fdisplay(w_file,"%h",data_out);

end

initial

begin

reset = 1'b0;

clk = 1'b0;

load = 1'b0;

en_in = 1'b0;

data_in = 1'b0;

g = 0;

matlab_in = 127'h5DCE86622D846BF272215A792AF31A3E;

end

initial

begin

#50 reset = 1'b1;

#100 reset = 1'b0;

end

initial

begin

#150 load = 1'b1;

g = 127'h44DB4147E6075A92E878EB68C44DD51F;

#100 load = 1'b0;

end

integer in_num;

initial

begin

#250 en_in = 1'b1;

for(in_num = 126;in_num>=0;in_num=in_num-1)

begin

data_in = matlab_in[in_num];

#100;

end

data_in = 1'b0;

en_in = 1'b0;

load = 1'b1;

#100 load = 1'b0;

#1000 $stop;

end

always

begin

#50 forever

#50 clk = ~clk;

end

integer clk_cnt;

always

begin

clk_cnt = 0;

#150;

forever

#100 clk_cnt = clk_cnt + 1;

end

circmatrix u1(

.clk(clk),

.reset(reset),

.data_in(data_in),

.en_in(en_in),

.g(g),

.load(load),

.data_out(data_out),

.en_out(en_out)

);

最新文章

  1. 收集常用的.net开源项目
  2. SpringMVC实现查询功能
  3. SQL——触发器——插入触发器——边学边项目写的。
  4. 一些sql语句的常用总结(重要)
  5. swappiness
  6. pyQuery
  7. 关于How,刷墙和亲戚
  8. java输入输出流(内容练习)
  9. 数据逆向传递 unwind segue
  10. php 初学笔记
  11. Perl处理和收走子进程(退出状态码和wait)
  12. html 引入页面公共部分(header、footer)
  13. springboot上传文件并检查图片大小与格式
  14. uiautomator viewer
  15. 配置Info.plist (设置状态栏样式、自定义定位时系统弹出的提示语、配置3DTouch应用快捷菜单)
  16. SAP ABAP编程 取得用户中文名称
  17. dos 批处理中%cd% 和%~dp0%的区别
  18. Couchbase进阶-集群与版本升级
  19. linux——制作本地yum源
  20. Java图片转字符

热门文章

  1. 剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面
  2. 转:Oracle GoldenGate学习之Goldengate介绍
  3. c11---位运算相关
  4. 百度开源其NLP主题模型工具包,文本分类等场景可直接使用L——LDA进行主题选择本质就是降维,然后用于推荐或者分类
  5. oracle 实时查询最耗CPU资源的SQL语句
  6. js接收文件流并下载
  7. BZOJ 2141 分块 线段树
  8. T7314 yyy的巧克力(钟)
  9. DirectUI界面编程(一)创建第一个应用
  10. PHP魔术方法__call()篇