他和它的故事 之 Verilog HDL 仿真前的故事
博客:http//blog.ednchina.com/akuei2 社区:http://www.oshcn.com
1
他和它的故事 之 Verilog HDL 仿真前的故事
博客:http//blog.ednchina.com/akuei2 社区:http://www.oshcn.com
2
目录
目录 ....................................................................................................................................02
第五章 仿真前的故事 ....................................................................................................03
5.01 我眼中的仿真 ................................................................................................03
5.02 激励的故事 ....................................................................................................05
5.03 仿真的虚拟环境 ............................................................................................07
5.04 综合和仿真 ....................................................................................................08
总结 ....................................................................................................................................10
他和它的故事 之 Verilog HDL 仿真前的故事
博客:http//blog.ednchina.com/akuei2 社区:http://www.oshcn.com
3
第五章 :仿真前的故事
5.1 我眼中的仿真
关于仿真这东西给笔者很纠结。在笔者的眼里,笔者把仿真看成是学习 Verilog HDL 语
言之后的功课。网上常有的一套学习方法就是一边学习用 Verilog HDL 语言建立模块,
一边使用 modelsim 观察输出,这样的学习方法看是很有道理,而且初期也有很大的帮
助 ... 笔者在这里说老实话这样的学习方法仅限与前期而已。如果读者反问笔者为什么
呀,其中又要扯出很久很久以前的故事 ......
我们知道 Verilog HDL 语言又分为两套,综合部分和验证部分。综合部分就是在我们常
常用来建模,然而验证部分就如命名它的功能就是用来验证模块。笔者在接触Verilog
HDL 语言一段时间后,有一种奇怪的感觉一直驱着笔者思考关于“综合语言与验证语
言和仿真之间的关系”。
笔者看到很多的激励文本都是使用验证的方式在
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
写,笔者一直反问自己“难道仿真就
是等于验证?”但是根据笔者的记忆,笔者看过那么多有关 Verilog HDL 的资料,它们
都没有说过仿真一定要使用验证语言。正是如此笔者萌生出这样的想法“是否综合语言
也可以用于仿真?”。先把这个话
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
暂停一下,我们先来探讨“什么是仿真?”。
在仿真的世界里,仿真唯一的工作就是建立一个“虚拟的环境”去观察一个建模的输出,
同时间也要有“虚拟的输入”以达到激励的效果。既然仿真只是建立虚拟环境来观察输
出而已,而且 Verilog HDL 语言也没有强制性一定要使用验证的方式,那么“是否一套
用在综合的方法就也可以用在仿真呢?”
当笔者察觉到上述的问题后,笔者尝试使用建模的方法去完成仿真的工作。在笔者的眼
里,仿真工作就如同我们建立模块,然后将模块下载到“虚拟的黑金开发板”上而已。
但是这个“虚拟的黑金开发板”比较单调,输入输出只有逻辑和数据而已。仿真的重点
就是“如何去建立这个虚拟的环境”,其中激励是关键。(初学者们常常误认激励就是“虚
拟的输入”,但是这一点笔者却保留。关于激励的故事,我们往后有机会再谈。)
笔者曾经是初学者过,当笔者一边用综合来建立模块,一边用验证来仿真模块,笔者的
头简直就要爆开来。那时候的学习一点也开心不起来,为了应付两种不同性质的 Verilog
HDL 语言,结果都是两头不到岸,学习以“徘徊边缘”告终。当笔者掌握建模技巧以
后,笔者重新接触仿真 ... 咦!笔者发现到,一套用在建模的方法,既然也适合用在仿
真上。但是,同时间也伴随着许多问题 ...
其实一直一来,笔者对仿真始终保留自己的一套方法和想法。笔者不是故意要和现有的
一套方法唱反调,笔者也不是说验证语言不可以用于仿真。笔者只是希望找到一条更平
坦的道路,好让更多初学者或者新手可以轻松上路。
他和它的故事 之 Verilog HDL 仿真前的故事
博客:http//blog.ednchina.com/akuei2 社区:http://www.oshcn.com
4
我们知道初学者们接触 Verilog HDL 语言除了建模这个大问题以外,还有另一个大问题
它就是“如何区分 Verilog HDL 语言的可综合和可验证”。如果,一套用在建模的方法也
可以用在仿真身上的话,那么初学者只要掌握一种,然后轻松的上路。毕竟验证部分在
早期的学习也不常露脸。
嗯,笔者也不多话了,因为上述的内容更多的更多充其量不过是笔者一厢情愿的想法而
已,单单用文字来
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达,感觉太抽象了,给人一种摸不到的感觉。如果有耐性和笔者一
起探讨“笔者心目中的仿真”的话,那么请绷紧神经,全神贯注接聆听,笔者接下来要
说的故事。
他和它的故事 之 Verilog HDL 仿真前的故事
博客:http//blog.ednchina.com/akuei2 社区:http://www.oshcn.com
5
5.2 激励的故事
在 5.1 一章中,笔者说了激励既不是虚拟输入或者输入。如上图中,初学者都喜欢把激
励当成 .vt 文件和 .v 文件之间的箭头。该左边的箭头表示了 .vt 产生输入至 .v 的关
系。笔者不是说这样的理解不是不对,只是有所保留,笔者对激励有自己另一个观点。
如果把激励放在可以活动的现象中,激励代表了“刺激和反应”。假如把这一观点放映
在 Verilog HDL 的仿真上,激励文件,亦即表示了“某个模块,有什么刺激(出入),就
有什么反应(输出)”。因为在仿真的过程中,模块不只是单单接收某个输入,然后输出
某个输出,反之仿真中常常会出现“问答”的状况。
举一个例子,在实验一中,我们为了仿真 multiplier_module.v 这个模块,而且我们准备
输入 2 组的数据。我们先输入第一组数据,然后等待 multiplier_module.v 的完成反馈,
然后再继续输入第二组数据,其中等待和反馈的过程,亦即“问答”。
既然“激励”不是单纯的输入,而是“刺激和反应”,那么什么是“刺激”什么又是“反
应”?“刺激”就是输入,在仿真中输入又有简单输入,复杂输入和条件输入。简单输
入可以是逻辑信号,或者一组数据,复杂输入可以是一组
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
,然而条件输入又称为问
答输入。相反的“反应”在仿真中,就是输出或者反馈而已。
在激励文本中,假设笔者为了仿真某个模块,笔者就必须编辑好激励的过程,激励的规
则或者激励的步骤等 .... 激励文本的创建是视情况而定,没有固定的规则。在激励的发
生过程中,最重要的就是输出信息了(是地球人都知道),输出的信息反映了改模块是
否健康呀?哪里不舒服呀?
读者可能很好奇,笔者为什么那么执着“激励”,概念差一点也不会少了一块肉。笔者
如此执着是有原因的,如果笔者的想法是正确的话(没有什么正不正确的啦,见仁见智,
每个人都有不同的思考),那么笔者可以更明确的定义在仿真上的每一个细节。这样做
的好处,可以使得自己更能掌握这一切。此外,往后的故事都需要这些东西来支持,不
然在学习的路上,概念很容易动摇,学习很容易充满疑惑 ...
他和它的故事 之 Verilog HDL 仿真前的故事
博客:http//blog.ednchina.com/akuei2 社区:http://www.oshcn.com
6
如果按着笔者的想法激励文本会是如图上那样的。各种输入驱动着 .v 文件,同时间 .v
文件也反馈和输出信息,然而全部过程称为“激励”,至于“激励”的过程是如何发生,
就看 .vt 文件如何编辑。
在这里,读者们能不能接受就见仁见智,这毕竟是笔者的一套想法而已,没有任何强迫
性,但是笔者不能避免,这样的想法可能会颠覆读者之前对仿真的认识。如果读者觉得
笔者的脑子有问题的话,往后的故事读者可以一边保持自己的想法,另一边怀疑着笔者
的想法,带着这样的心情继续深入学习。
他和它的故事 之 Verilog HDL 仿真前的故事
博客:http//blog.ednchina.com/akuei2 社区:http://www.oshcn.com
7
5.3 仿真的虚拟环境
《在 Verilog HDL 那些事儿-建模篇》在第一章中笔者说了“FPGA 就是一堆乐高积木,
Verilog HDL 就是一双手(工具),用手组合这些乐高积木称为建模,有效的用手段组合
这些乐高积木成为建模技巧”。然而这个概念只是针对实际的 FPGA 和 Verilog HDL 之
间的关系而已。
(未来中第一本 Verilog HDL 的笔记会正式取名为:Verilog HDL 那些事儿-建模篇)。
在仿真中同样的概念已经不适合了,在这里笔者提出另一种概念,就是“仿真的虚拟环
境”。假设一个例子,如果笔者要对某个模块,如串口发送模块执行仿真,那么笔者需
要设法建立一个环境去近似现实中我们要测试的对象。
在现实中,这个串口发送模块是针对黑金开发板的串口资源而建模的,那么我们需要模
仿黑金开发板去建立这个“虚拟黑金开发板的环境”。这其中,有两个重要的输入就是
时钟周期和复位时间。我们知道黑金开发板搭配的时钟频率是 20Mhz,20Mhz的周期是
50ns,然和一般复位信号的低电平时间大约是 1us~6us。
`timescale 1ns / 1ns
modue ... ()
......
initial
begin
RSTn = 0; # 1000; RSTn = 1; // 1us 的复位时间
CLK = 0; forever #25 CLK = ~CLK; // 一个周期为 50ns,半个周期为 25ns
end
......
endmodule
当然,要建立仿真的虚拟环境不只是需要建立序号时钟和复位那么简单,我们还需要在
激励文本上,编辑各种的虚拟输入,但是有一点可以肯定的是“时钟和复位是虚拟绝对
的”。在这里,笔者也只是提出一个简单的概念而已,想要了解“仿真的虚拟环境”是
什么东西,读者还需要从不同的实验中涉及到,一页的空间不肯能把它说清楚。
窃窃私语:
当我们看到 RSTn 和 CLK 这两个信号,读者们都会联想到什么东西!?对,就是建模。
如果读者有学过低级建模的话,那么笔者会说一声恭喜了,因为读者已经掌握好基础了。
他和它的故事 之 Verilog HDL 仿真前的故事
博客:http//blog.ednchina.com/akuei2 社区:http://www.oshcn.com
8
5.4 综合和仿真
我们先来看看两段不同的 .vt 写法。第一种的.vt 是用验证的方式编辑:
......
reg [7:0]FIFO_Write_Data;
reg Write_Req;
initial begin
FIFO_Write_Data = 0; Write_Req = 0; Read_Req = 0;
@( posedge RSTn );
@( negedge CLK );
Write_Req = 1; FIFO_Write_Data = 8'dF0;
@( negedge CLK );
Write_Req = 0;
@( negedge CLK );
Write_Req = 1;
repeat(3) begin
FIFO_Write_Data = FIFO_WRite_Data + 8'd02;
@( negedge CLK );
end
......
第二种的 .vt 文件使用建模(综合)的方式编辑:
reg [7:0]FIFO_Write_Data;
reg Write_Req;
reg [3:0]i;
always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
FIFO_Write_Data <= 8'd0;
Write_Req <= 1'b0;
i <= 4'd0
end
else
case( i )
他和它的故事 之 Verilog HDL 仿真前的故事
博客:http//blog.ednchina.com/akuei2 社区:http://www.oshcn.com
9
0:
begin Write_Req <= 1'b1; FIFO_Write_Data <= 8'dF0; i <= i + 1'b1; end
1:
begin Write_Req <= 1'b0; i <= i + 1'b1; end
2, 4, 6:
begin
Write_Req <= 1'b1;
FIFO_Write_Data <= 8'dF0 + 8'd02;
i <= i + 1'b1;
end
3, 5, 7:
begin Write_Req <= 1'b0; i <= i + 1'b1; end
.......
上面是两种不同的 .vt 文件的写法,两种写法都是先初始化相关的寄存器,然后向 FIFO
写入 3 个不同的数据。第一种写法就是网上常见的用验证方式去编辑.vt 文件,反之第二
种写法是笔者最爱的建模的写法,亦即用综合的方式去编辑 .vt 文件。第一种的写法虽
然很普遍,但是在笔者的心理这种写法是很肮脏(对不起呀!不识月兄)...
为什么说它肮脏呢?我们先以“表达能力”去分析第一种写法,估计很多读者都不明白
它的实际意义吧?又或者读起来很费力气吧?如果读者对 FPGA+Verilog HDL认识不深
入的话“读者是看不清楚这段代码和时序之间的关系”。(说实话以笔者的等级笔者也看
不清楚。)
第二种的写法读者们是不是觉得很熟悉是吧?它是在低级建模中,建模常用的“仿顺序
操作”的法(这种写法的好处笔者就不在多废话了)。很显然,如果第一种写法和第二
种写法相比较的话,第二种写法在任何方面都更胜一筹。在 5.1 章里,笔者已经说过了
“如果可以把一套用在建模的方法应用在仿真的身上的话”就是上述所发生的内容。在
这里我们可以下如此的结论:
只要有“时钟信号”和“复位信号”,那么用在建模的一套方法就可以用在仿真身上。
如果把这样的想法继续细化的话,我们只要学习 Verilog HDL 语言其中的一部分,亦即
综部分,就可以用在两种不同的地方( 建模和仿真 )。但是这一切的前提是需要建模技
巧的支持。
当然,这并不代表掌握建模技巧就是等于掌握仿真,在实际的仿真中不肯能那么单纯。
除了要掌握好建模技巧之外,读者还要深入了解步骤和时钟的关系,明白代码和时序之
间的相互作用。此外在仿真的过程中还有各种重点需要,这也是接下来笔者要说的故事。
他和它的故事 之 Verilog HDL 仿真前的故事
博客:http//blog.ednchina.com/akuei2 社区:http://www.oshcn.com
10
总结:
在这一章,笔者只是简单的讲述了、笔者自己本身一套对仿真的基础知识而已。曾经是
初学者的笔者,深深了解到如果打从一开始,同时间使用两种不同部分的 Verilog HDL
语言去完成建模和仿真的话,最后就是两头不到岸(牛儿除外)。在很多时候,Verilog HDL
的验证语言都不常使用,语法也很记忆,而且它也很难和建模扯上关系。反之, Verilog
HDL 的综合语言,不仅可以用在建模上,也可以用在仿真上(前提必须有建模技巧的
支持)。
换句话说,我们只要掌握 Verilog HDL 语言的其中一部分,并且强化它的用途就可以使
用在两种不同的地方(建模|综合和仿真)。笔者相信这或多或少,可以使初学者更轻松
上路,此外建模的能力可以更上一层楼。这也是为什么笔者在一开始的时候,就一直强
调“建模技巧很重要,建模技巧很重要”,强调到不停喷血, 而且还喷了 3 天 3 夜之久 ......
笔者很多时候都相信,许多初学者在仿真的时候只会看波形图(时序图)而已,则不正
真了解波形图上的信息。而且激励文本的编辑更是“可爱”极了,往往自己在写什么,
错误在哪里都不知道(笑!笔者也是)。
如果把一切看穿到底,仿真的重要性只是其次而已,因为仿真的工作不过是测试“这个
模块如何了?那个模块健康吗?”,然后“观察该模块的病征”。真正影响模块本身的就
是建模的经过,很好的代码风格和建模技巧使得“病症更容易避免”。如果在建模中有
强调步骤的存在“病症的显示会更显性”。
笔者的意思不是说仿真不重要,因为模块都是被动的,即使模块通过编译,它也不会说
“先生,我这里不舒服,麻烦你看一下”之类的话,所以我们需要才需要各种刺激去刺
激该模块,然后观察该模块的反应(虐待模块),如果反应在预想范围,那么这个模块
就是 Okay 的,反之这个模块“生病”了。很多时候模块生病的原因都是和
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
着有直
接的关系。换句话说就是“建模第一,仿真第二”。
这一本笔记的重点,就是要读者用一种常用的方法去实现仿真的工作。一来可以节省许
多精力,只要学习综合部分就可以。二来仿真的工作更直接很更有效,毕竟综合部分更
适合 Verilog HDL 的口味。
哇 ..... !哇 ...... !笔者真的写得非常激动!
目录
第五章:仿真前的故事
5.1我眼中的仿真
5.2激励的故事
5.3仿真的虚拟环境
5.4综合和仿真
总结: