Verilog可综合语句实战指南
需积分: 50 140 浏览量
更新于2024-09-13
3
收藏 294KB PDF 举报
"这篇资料汇总了Verilog语言中可综合与不可综合的语句,并给出了建立可综合模型的原则,对于理解和编写能被硬件综合的Verilog代码非常有帮助。"
在Verilog HDL中,可综合语句是那些能够被硬件综合工具转化为实际电路结构的语句。例如,`always`块用于描述时序逻辑,`assign`用于创建静态赋值,`reg`和`wire`定义存储和连接元素,`and`、`nand`等逻辑运算符表示基本逻辑门,以及`module`表示电路模块。这些语句在设计数字逻辑电路时非常常见,且能够被大多数综合工具接受。
然而,有一些语句在综合过程中不被支持,比如`initial`块通常用于仿真初始化,`time`用于时间量的声明,`defparam`用于参数的默认值设定, `$finish`结束仿真,`fork`和`join`处理并发执行,以及`wait`语句。这些语句在硬件实现中没有对应的实体,因此在设计需要综合的Verilog代码时应当避免使用。
还有一些语句,如`casex`、`casez`(考虑X和Z值的case语句)、`wand`、`triand`、`wor`、`trior`(带三态的逻辑操作),以及`real`数据类型,它们在某些综合工具中可能被支持,但不是所有工具都支持。同样,`disable`、`forever`循环、数组、内存(`memories`)、`repeat`循环、`task`任务和`while`循环可能因工具而异。在编写可综合代码时,应谨慎使用这些特性。
建立可综合模型的关键原则包括:
1. 避免使用`initial`块来描述时序行为,因为它们在综合时通常不被处理。
2. 不使用延迟操作,如`#10`,这在综合时可能导致不确定性。
3. 避免使用循环次数不确定的循环,如`forever`和`while`,因为它们可能导致无限循环或难以预测的行为。
4. 不推荐使用用户定义的原语(UDP),因为它们可能不被所有工具支持。
5. 优先采用同步设计方法,以减少 metastability 和时序问题。
6. 尽量使用行为描述而非门级元件描述,以提高抽象级别和可读性。
7. 在`always`块中,列出所有输入信号作为敏感列表,以清晰描述组合逻辑的响应。
8. 内部寄存器应有复位功能,使用全局复位信号可以简化系统设计。
9. 对于时序逻辑,推荐使用非阻塞赋值(`<=`);组合逻辑可以使用阻塞赋值(`=`)或非阻塞赋值,但不要混用。
10. 同一变量不应在多个`always`块中被赋值,且一个赋值对象不应同时用阻塞和非阻塞方式赋值。
11. 如果不希望产生锁存器,确保所有条件分支都对变量进行赋值。
12. 避免在设计中混合使用上升沿和下降沿触发的触发器,以简化时序分析。
13. 在同一`always`块内,避免对同一变量的阻塞和非阻塞赋值,以防止不确定的行为。
遵循这些原则,可以编写出更健壮、更易于综合的Verilog代码,从而确保设计能够成功转化为硬件实现。
2011-11-12 上传
2020-08-15 上传
2022-08-04 上传
2013-07-23 上传
2021-10-13 上传
点击了解资源详情
2021-03-05 上传
2022-11-07 上传
lmldc611
- 粉丝: 2
- 资源: 3
最新资源
- Android圆角进度条控件的设计与应用
- mui框架实现带侧边栏的响应式布局
- Android仿知乎横线直线进度条实现教程
- SSM选课系统实现:Spring+SpringMVC+MyBatis源码剖析
- 使用JavaScript开发的流星待办事项应用
- Google Code Jam 2015竞赛回顾与Java编程实践
- Angular 2与NW.js集成:通过Webpack和Gulp构建环境详解
- OneDayTripPlanner:数字化城市旅游活动规划助手
- TinySTM 轻量级原子操作库的详细介绍与安装指南
- 模拟PHP序列化:JavaScript实现序列化与反序列化技术
- ***进销存系统全面功能介绍与开发指南
- 掌握Clojure命名空间的正确重新加载技巧
- 免费获取VMD模态分解Matlab源代码与案例数据
- BuglyEasyToUnity最新更新优化:简化Unity开发者接入流程
- Android学生俱乐部项目任务2解析与实践
- 掌握Elixir语言构建高效分布式网络爬虫