原创 零基础学FPGA(十七)Testbenth 很重要,前仿真全过程笔记(上篇)

2014-11-26 15:34 3080 9 11 分类: FPGA/CPLD 文集: FPGA/CPLD

     刚刚做完了高频实验,说实话真是做的一头雾水。还是那种感觉,真是没什么用,所有人拿着早已经复制好的电路图,打开软件运行一下,再跟助教说一声做完了,随便打个分就可以走人,而且还要写一些无聊的实验报告。算了,不吐槽了,我们来说说今天的教学内容吧。

     上一篇文章我介绍了一下一片简易CPU的设计,今天的课程我讲仿真,也即前仿真。这次课程,小墨同学将和大家从建立工程开始,一步步梳理testbench的书写过程,帮助大家对仿真有一个深刻的概念。以后在做项目时,不要动不动就把程序下到板子里调试,看问题不对再去改程序,再下到板子里调试,如此往返,会浪费大量的时间,简单的项目还好,但是到了大型项目的话,是不可能有这么多时间让我们这样调的。因此,小墨同学在这里说,testbench很重要,做好了仿真,可以为我们节约大量的开发时间。

 

下面我们开始吧~

 

一、什么是testbench?

       从字面意思上来理解,testbench就是一个测试平台,我们之前已经设计好了我们需要的cpu模块,我们怎么知道我们设计的对于不对呢?我们可以给其施加一个测试激励,例如,给他送时钟和复位信号,由于时钟和复位信号是我们自定义的,因此我们可以产生任意频率的时钟信号和在任意时间给系统复位。

       当然我们还可以观察我们cpu的输出,将我们想要观察的输出信号引出来甚至是反馈到cpu内部,都可以,testbench没有像RTL代码设计那样严谨,我们可以在符合语法规则的前提下,随意编写我们的测试文件,有些在RTL代码中不可综合的语句,我们可以在testbench中实现。

360桌面截图20141122115631.jpg
 
 
二、testbench的结构
 
 小墨同学认为testbench的结构可以分为这几个方面:
      1.要先对接口进行例化,即模块之间的链接关系
      2.对我们的设计添加激励
      3.观察设计输出是否符合要求
 
三、测试模块设计
 
      要测试我们的cpu需要ROM和RAM模块,这就需要我们先做好这两个模块
360桌面截图20141122121423.jpg
 
这里定义了一个 1024 x 8 的RAM
360桌面截图20141122122057.jpg
 
再定义一个8192  x 8 的ROM
 
ROM和RAM都还没有装入数据,等会我们会调用函数给他们装数据
 
接下来是地址译码器,来控制ROM和RAM的打开与关闭
360桌面截图20141122122622.jpg
 
 
各模块建立好之后我们就开始仿真了
 
 
 
 
四、仿真
 
      这次教学我们用的是modelsim SE 10.0 版本进行教学,以下是小墨同学习惯的仿真过程,因个人习惯不同,各位朋友可以按照你们 的方法来做
 
     我习惯直接先在quartus II中建一个.v文件将其保存在原来的工程文件目录中,并命名为cpu_top.v,直接在这里写测试代码
 
360桌面截图20141126133646.jpg
 
 
下面大家可以跟着小墨的步骤一起做,来完成cpu 的仿真过程了
 
1.  首先,我们需要将我们刚写好的那几个模块包含进去,即CPU模块,ROM模块,RAM模块,地址译码器模块,并写好时间测量度,见下图
360桌面截图20141126133956.jpg
 
2.定义顶层模块
 
由于我们的设计只有两个输入,即时钟模块和复位模块,凡是输入信号在testbench中通一定义成reg型变量,凡是输出或者双向输入输出信号通一定义成wire型变量,我们的设计只有输入没有输出,故只定义输入和连线即可
360桌面截图20141126134439.jpg
 
下图便是我们要组成的测试顶层模块图,我们定义的wire型变量,实际就是我们顶层模块中,模块模块与模块间的连线。而这些连线就是我们cpu的输出,这样我们就可以用我们的测试模块来测试我们的cpu是否能正确工作
360桌面截图20141126134607.jpg
 
3. 元件例化
就是将各个模块连接起来即可,这里就不做太多的说明了,因为以前都写过很多次了
360桌面截图20141126135242.jpg
 
4.测试激励的书写
 
小墨同学习惯上上来先写好时钟产生模块和复位模块.并将复位模块用task任务封装,这样我们在测试过程中就可以随时调用复位任务进行复位
 
时钟为50Mhz,复位时间为20ns
 
360桌面截图20141126135613.jpg
 
 
然后,我们再用task封装我们需要的模块,我们来想一下,上电后,CPU会从ROM中读两个时钟周期的数据是吧,但是我们的ROM现在还是空的,所以我们需要一个任务是往ROM中装入程序,给ROM中装数据我们可以用系统函数$readmemb,即打开一个文件,并将其中的数据送到我们之前定义的ROM中去
 
360桌面截图20141126140142.jpg
 
而test1.pro文件时需要我们自己定义的,我们可以在quartusII中再新建一个.v文件,在里面写上我们自己定义的程序,并将其保存为.pro文件即可,至于写什么程序,是我们随便定义的,大家可以参考我之前在上一篇文章中上传的程序中,有一个test1.pro文件,打开之后可以看到是一些16位的数字码,这些码就是我们ROM的地址,从第一行开始,每8位数据位一个地址,注意我们每个地址的高三位是用下划线隔开的,这表明前三位是指令码,这三位会被状态机进行译码,控制CPU执行相应的操作
360桌面截图20141126140637.jpg
 
装完ROM和RAM的数据之后,按说就可以了进行波形仿真了,因为cpu是自动读取数据的,下面我们先来做第一步仿真,我先把之后的代码注释掉,大家先看没有被注释掉的代码
360桌面截图20141126141526.jpg
 
里面都是我们之前封装好的函数,刚开始进行复位,然后进行第一步测试,之后停止
 
 
将其保存之后,小墨同学习惯将cpu_top.v文件用modelsim打开,并默认为用其打开,打开后见下图
360桌面截图20141126142043.jpg
 
 
然后,file——new——library——ok即建好一个库
 
360桌面截图20141126142400.jpg
 
 
 
点击左上角的编译按钮,将我们之前写好的所有.v文件全部都编译进去
360桌面截图20141126142632.jpg
 
 
 
看到transcript一栏显示编译成功后即可,若没有transcript一栏,可以选择菜单中的view——transcript即可,若显示有红色错误,那就请读者按照它的要求进行修改代码,这说明你的代码有问题,一般是连接问题
 
360桌面截图20141126142858.jpg
 
编译成功后,双击cpu_top就可以开始波形仿真了
 
360桌面截图20141126143145.jpg
 
进入仿真页面后,我们右击cpu模块将其加入至波形
 
360桌面截图20141126143511.jpg
 
 
 
由于只能上传20张照片,请大家看下一篇文章,小墨同学会给大家继续讲解
 
 
以后小墨同学的文章将在EDNchina和北京至芯科技官方技术论坛同时更新,至芯科技的官方技术论坛也有很多的资料供大家下载,里面也有小墨的专题板块,希望广大网友和爱好者的大力支持~
http://www.fpgaw.com/
小墨同学专版网址
http://www.fpgaw.com/thread-78527-1-1.html
下面是至芯科技官方网站,夏宇闻教授和那里的老师都超好的~有意愿接受FPGA培训的可以找工作人员咨询
http://www.zxopen.com/
       以后小墨同学的教程会跟这款开发板配套,想跟小墨同学一起学习,一起进步的的可以考虑一下购买一块开发板,毕竟学习要舍得投资嘛,下面是开发板淘宝链接
http://item.taobao.com/item.htm? ... ;abbucket=13#detail
 
 
 
 

文章评论2条评论)

登录后参与讨论

用户1528367 2015-4-22 17:23

对博主的敬仰之情如滔滔江水

用户1823926 2014-12-20 18:39

小mo兄专门做FPGA的呀看来,图文兼有,挺赞的
相关推荐阅读
小墨同学 2015-09-10 10:28
零基础学FPGA( 三十二) 写在京城,多级FIR半带滤波器的FPGA实现
        每次到京城来总不能忘了出去逛逛吧,偌大的北京城去哪呢?炙热的大太阳烤的哪都不想去了,幸好这次有亲戚来北京旅游,搭个顺风车便出去转了一下。这次的闲逛可没有上次那么感叹,上次主要是去的...
小墨同学 2015-08-29 15:19
零基础学FPGA(三十三)多相结构抽取滤波器笔记
        前两篇文章已经介绍过了,在多速率信号处理中,CIC滤波器和FIR半带滤波器应用的非常广泛,由于CIC滤波器的特殊结构,使得它非常适合采样速率远远大于信号速率的情况时的抽取跟内插滤波...
小墨同学 2015-08-29 15:18
零基础学FPGA(三十一)写在京城,Hogenauer CIC抽取滤波器的FPGA实现笔记
         实习完还没几天,突然接到北京至芯雷总的电话,让我赶往北京来做一些事情,就这样,我的又一趟北京之旅开始了。         上次来北京还是今年1月份,冬天嘛,京城光秃秃的一片,...
小墨同学 2015-08-05 20:50
【博客大赛】零基础学FPGA (二十六)必会! 从静态时序分析到SDRAM时序收敛(上篇)
    好像小墨有这么一个习惯啊,就是每篇文章的开头总喜欢叨叨几句啊~既然这样,那我们今天也聊几句好了,总感觉直接就开始学习专业知识有点让人看不进去~     今天我们就说说生活吧~时间很快啊,...
小墨同学 2015-07-26 21:57
[博客大赛]零基础学FPGA(三十) IIR数字滤波器的FPGA实现笔记
      然而暑假已经过了快一半,想想也是挺快的,前一段时间学校安排实习,在长沙待了一段时间,说是实习,感觉却是像是度假,住着酒店,100多号人,想想都觉的热闹。实习搞得是Java安卓,当然我也...
小墨同学 2015-06-17 09:50
[博客大赛] 零基础学FPGA (二十九)滤波器开篇,线性相位FIR滤波器的FPGA实现
        也是有一段时间不写博客了啊,主要是这学期的实验课太多,每天都是在写预习报告,实验报告中度过,也快到考试月了啊,感觉又要忙起来了,今天就抽点时间来开个头,开什么头呢?对!就如标题所示...
我要评论
2
9
关闭 站长推荐上一条 /2 下一条