欢迎来到天天文库
浏览记录
ID:17585542
大小:1.91 MB
页数:39页
时间:2018-09-03
《verilog+十大基本功》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、收集整理自开源IP通吃岛http://www.socvista.com/bbsSOCvistaverilog十大基本功SOCvista的版主dancia最近对国内的主要EDA论坛做了一项调查,耗时一个多月,经过仔细的总结,发现一个有趣的现象:国内关于HDL提出问题的帖子,有80%都集中在一小部分基本问题上。同样的一个问题,从5年前开始就有人问起,一直问到今天,很可能还会持续到N年后。貌似新人们总也避不开这些说难其实也不难的问题,而且实际的调查还发现,就连好多工作多年的工程师们对这些问题也是稀里糊涂,似懂非懂。为了
2、帮助大家一劳永逸解决这些基本难题,从而迈向自由编程的康庄大道,我们特地开辟了这个版块,要把这些基本功一一传授给大家。如果觉得我们的帖子还不过瘾,你可以回帖继续提问,务必把所有概念搞清搞懂。另外所谓十项只是一个概述,请勿过分计较。谢谢大家的关注和支持。原帖见:dancia《高手也搞不清楚的十项基本功》http://www.socvista.com/bbs/search.php?searchid=11&orderby=lastpost&ascdesc=desc&searchsubmit=yes以下是大家讨论的一个总结
3、:1、阻塞赋值与非阻塞赋值前言:阻塞与非阻塞赋值是Verilog语言中最基本的部分,也是让大部分Verilog新手最困惑的地方。关于阻塞与非阻塞的著作文章可谓汗牛充栋,这些文章对阻塞与非阻塞赋值的原理进行了非常详细的讲解,但新手读了之后依然有种似懂非懂的感觉,编码过程中一如既往的犯错。所以,本文的目的立足于提供一种实用化的解决方案,用最简单的语言和形象的类比让新手能够一目了然的明白正确的编码方式以及相应的电路行为逻辑,关于仿真细节的讲解不是本文重点,需要了解更多细节的朋友可以参考文后列举的参考文献。本文共分为三部
4、分,第一部分是正确使用阻塞与非阻塞赋值的基本原则。第二部分是阻塞与非阻塞赋值对应电路的行为逻辑。第三部分是阻塞与非阻塞赋值的原理简介。GoldenRule编码原则很多,就阻塞非阻塞赋值而言,新手最需要牢记的是其中三条:1、时序逻辑一定用非阻塞赋值”<=”,一旦看到敏感列表有posedge就用”<=”。2、组合逻辑一定用”=”,一旦敏感列表没有posedge就用”=”,一旦看到assign就用”=”。3、时序逻辑和组合逻辑分成不同的模块,即一个always模块里面只能出现非阻塞赋值”<=”或者”=”。如果发现两种赋
5、值并存,一个字”改”,心存侥幸可能会给后续工作带来更多麻烦。以上三条,对新手而言不必追求为什么,需要的就是条件反射的照章办事。最后说一句,新手可能记不住哪个符号是阻塞赋值,哪个是非阻塞赋值,大家可以数数,”非阻塞赋值”一共5个字,“阻塞赋值“4个字,所以非阻塞用的符号”<=”比阻塞赋值用的符号”=”长。电路行为逻辑。第一节给出了三条最基本的编码原则,有个朋友可能会想,按照这三条编码原则写出来的代码会按怎样的逻辑工作呢?这一节就是回答这个问题。首先解释一下阻塞赋值与非阻塞赋值的含义。所谓的阻塞赋值”=”就是说,在这
6、个语句没有执行完之前,后面的语句是不执行的。这里执行的含义是指完成变量值的更新。非阻塞赋值”<=”是指,所有的语句可以并发执行,而前面的值是否执行完毕不会影响后面的语句,换句话说,语句的顺序是无关紧要的。收集整理自开源IP通吃岛http://www.socvista.com/bbsSOCvista举个例子,假设一个模块,有2个寄存器,b和c,初值都是1。a为输入信号线。在某个时刻,因为某种原因,模块被触发执行。对于组合逻辑而言,一般是输入信号值变了,对于时序逻辑而言,一般是时钟沿到了。首先看组合逻辑:假设输入a=
7、2;always@(a,b)beginb=a;c=b;end由于是阻塞赋值,所以首先执行完第一句b=a,执行完成之后b=2。接着执行c=b,执行完成后c=2,一次仿真结束后b=c=2;对于时序逻辑而言,依然假设a=2;always@(posedgeclk)beginb<=a;c<=b;end由于是非阻塞赋值,首先执行第一句b<=a,这时候a=2,但是还没有执行完第一句的时候,第二句c<=b也执行了,由于第一句没有执行完,b的值还是1,这时候赋值给c的值也是1。执行完毕的结果就是c=1,b=2.等到模块再次被触发的
8、时候c的值更新为2。有个朋友可能就会问了,凭啥第一句执行到一半就该第二句执行呢?到底是第一句先完成赋值呢还是第二句先完成赋值?答案是,谁先完成赋值都没关系,结果是一样的。为什么说结果一样呢?因为两种赋值方式分别是按照下面的顺序执行的。阻塞赋值,就跟C语言一样,严格按照代码书写的先后顺序执行,所有值都是立即更新,并且在下面的语句中按照新值执行。而时序电路就不一样了,大家可以
此文档下载收益归作者所有