V e r i l o g 语言的可综合性.doc

V e r i l o g 语言的可综合性.doc

ID:28100902

大小:45.50 KB

页数:6页

时间:2018-12-08

V e r i l o g 语言的可综合性.doc_第1页
V e r i l o g 语言的可综合性.doc_第2页
V e r i l o g 语言的可综合性.doc_第3页
V e r i l o g 语言的可综合性.doc_第4页
V e r i l o g 语言的可综合性.doc_第5页
资源描述:

《V e r i l o g 语言的可综合性.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、Verilog语言的可综合性可综合的VerilogHDL语句都是VerilogHDL标准(IEEE1364)的一个子集,并且因所用工具不同而异。在设计中不能采用不可综合的语句(测试代码除外)。下面我们讨论一下大部分综合工具都支持的语句,具体到某种工具的特性还要查看说明文档。对于数据类型、运算符、赋值语句、基本门级元件等的可综合性问题,因为都有固定的规定,这里就不多讨论了。组合逻辑和时序逻辑的可综合性:用assign语句对wire型变量进行赋值,综合后的结果是组合逻辑电路。用always@(电平敏感变量表),即电平敏感的always块描述的电路综合后的结果是组合逻辑电路或电平敏

2、感的锁存器,此时,always块内赋值语句左边的变量是reg或integer型,块中要避免组合反馈回路,每次执行always块时,在生成组合逻辑的always块中被赋值的所有信号必须都在敏感电平列表中列出,否则在综合时将会为没有列出的信号隐含的产生一个透明的锁存器,这时综合后的电路已不是纯组合电路了。用always@(posedgeclock)或always@(negedgeclock)块描述的电路综合为同步时序逻辑电路,设计同步时序逻辑电路的关键是建立描述该电路状态转移的可综合的有限状态机模型,在VerilogHDL语言中最常用的描述同步时序状态机的结构是always和块内

3、的case.if语句,除了紧跟在always后的@(posedgeclock),@(negedgeclock)外,always块中不允许其他的@(event)语句,目前大多数综合工具不能综合VerilogHDL描述的异步状态机,所以用Verilog设计的时序电路应该是同步时序电路。函数和任务的可综合性:对函数进行综合时,函数内的循环变量只能是常量,并且不能进行递归函数调用,函数体内不能包含有任何的时间控制语句,函数不能启动任务,综合工具将函数当作一个硬件模块来处理,一般综合成组合逻辑电路。多任务的处理比函数复杂,任务体内对循环语句的限制同函数,不能进行任务的递归调用,任务可以

4、启动其他任务和函数。若任务是在进程always@(posedgeclock)或always@(negedgeclock)块内被调用,则任务体内不允许有时间控制语句,若有多个进程调用相同的任务,书写成如下形式:always@(posedgeclk)begin.............Task1(parameter0);endalways@(posedgeclk)begin............Taskl(parameterl);endtaskTaskl(parameter)综合工具进行综合时,进行宏代换处理。对于函数和任务,考虑到它们对综合带来的复杂性,建议能不使用尽量不使用

5、。4.3.4综合结果的正确性问题[5l按照上一节的标准完成的代码虽然可以保证综合工具可以识别,并不表示综合出来的结果就是对的。对于一个设计者来说,只有充分理解综合器的综合方法,才可以说真正理解了HDL语言本身,才能做高效正确的RTL级HDL设计。下面以Verilog为例,说明几种常见的可能产生综合前后仿真不一样的原因,也可以说是设计RTL级HDL中需要注意的几个问题及解决方法。(1)组合逻辑的敏感表要全所有组合逻辑模块内要用到的输入信号必须在敏感表(EventList)中列出,这是在书写Verilog代码中非常易犯的错误,例如下面的语句:always@(aorb)d=(a&b

6、)

7、c;没有语法错误,在仿真的时候如果c的值有变化而a,b不变,d的值是不会变的,而综合时EDA工具会认为这是一个组合逻辑(符合作者的原意).将其等同于:always@(aorborc)d=(a&b)

8、c;这样综合出后的仿真结果和综合前的仿真结果可能会不同pre-synthesizeandpost-synthesizemismatch),好在这种错误一般的综合工具都会提出警告。(2)避免“竟争”状况的产生一个含有“竞争”状况的模块是指它产生的结果和仿真器执行某些时间的次序有关,而这些次序是没有意义的。即如果几个事件发生在同一时刻,仿真器执行却不可能是同时进行的,所以仿真结果有

9、可能依赖于这几个事件的执行次序,但在语法上,该次序并没有定义。初学者很容易犯这种错误,而调试也很难,因为在某些情况下或使用某些仿真器时,行为级的仿真也许是对的,而使用另外的仿真器或改变一些其他条件,仿真却不对,这样故障的定位很难。下面是一个简单的例子:always@(posedgeclk)begin:blockla=a+1;endalways@(posedgeclk)begin:block2c=a;end在这个例子中,c的值取决于仿真时blockl和block2哪一个先执行,若block1先执行,c的值

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。