3291|6

269

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

verilog新手误区 [复制链接]

Verilog的两个误区:
使用Reg类型还是Net类型:
Reg类型只在过程块中被赋值;而Net类型则在过程块外面被赋值或者驱动.
阻塞赋值和非阻塞赋值:
Verilog中竞争发生的条件:两个或多个语句在执行顺序不同时导致不同的结果,则存在竞争.
Nonblocking不是一个类型;
Blocking赋值是一个单步过程,计算RHS,并更形LHS是不可中断的.
七条准则:
1.时序逻辑和锁存器,使用非阻塞赋值
2.always块中的组合逻辑,使用阻塞赋值
3.同一always块,时序组合混合逻辑使用非阻塞赋值
4.通常情况下,在同一always块中不要混合使用阻塞与非阻塞赋值
5.不要在多个always块中对同一变量进行赋值
6.使用$strobe显示非阻塞赋值得信号
7.不要用#0的过程赋值
Verilog中的分层事件队列:
活动事件:阻塞赋值;计算非阻塞赋值的RHS;连续赋值;$display命令;计算输入并改变原语的输出.这些事件可能按照任意次序调度.
非活动事件:#0的阻塞赋值
非阻塞事件:更新非阻塞赋值的LHS
监视事件monitor命令;$strobe命令
经验:
在always块中使用非阻塞赋值来产生时序逻辑和锁存器
在always块中使用阻塞赋值来产生组合逻辑
在always块中使用非阻塞赋值来产生同一块中的时序和组合逻辑
在纯组合逻辑中使用非阻塞赋值可能会导致功能错误
阻塞赋值和非阻塞赋值混合使用的方式:
将组合逻辑赋值通过时序表达式表示
或者将组合逻辑赋值与时序逻辑分开,在独立的语句块中描述
不推荐在同一always块中混合使用阻塞和非阻塞赋值
几个关于非阻塞赋值的错误理解:
错误1:无法使用$display命令显示非阻塞赋值变量
正解:非阻塞赋值变量的更新在所有$display命令之后
错误2:#0让一个赋值在每个时间步的最后执行
正解:#0只会让赋值语句进入非活动事件队列
错误3:在同一always块中对同一变量进行多次非阻塞赋值是不允许的
正解:在IEEE 1364 verilog标准中定义了上述赋值,最后一个非阻塞赋值起作用
模拟开始时候的困难:
不同的模拟器,不同的模拟选项导致开始模拟时现象不同
建议: 在0时刻通过非阻塞赋值设置reset信号;
第一个半周期设置clock为0
编写Verilog代码的一些经验:
Verilog文件名和模块名相同
不要在可综合代码中使用casex语句
当在可综合代码中使用casez语句时要小心
当写case语句时,对存在不关心的cases时使用casez,使用?代替Z来表示不关心的cases
Verilog编写状态机相关:
状态机分类:Moore(输出只与当前状态相关)和Mealy(输出与当前状态和输入相关)
二进制编码和One-Hot编码
状态机的基本块:下一状态度组合逻辑;时钟同步的当前状态逻辑;输出组合逻辑
两个always块写状态机,使用三个always块,如果输出需要寄存
使用高效的One-Hot状态编码,组合输出
经验:
每个状态机作为一个独立的Verilog模块
对状态进行预定义,状态赋值使用状态名作参数,不要使用`define,多使用parameter
两个always语句块的状态机,一个always用来描述状态向量寄存器的时序逻辑.一个用来描述下一状态度组合逻辑.组合输出可以通过连续赋值语句或者在下一状态度组合always块中描述.
Verilog的两个误区:
使用Reg类型还是Net类型:
Reg类型只在过程块中被赋值;而Net类型则在过程块外面被赋值或者驱动.
阻塞赋值和非阻塞赋值:
Verilog中竞争发生的条件:两个或多个语句在执行顺序不同时导致不同的结果,则存在竞争.
Nonblocking不是一个类型;
Blocking赋值是一个单步过程,计算RHS,并更形LHS是不可中断的.
七条准则:
1.时序逻辑和锁存器,使用非阻塞赋值
2.always块中的组合逻辑,使用阻塞赋值
3.同一always块,时序组合混合逻辑使用非阻塞赋值
4.通常情况下,在同一always块中不要混合使用阻塞与非阻塞赋值
5.不要在多个always块中对同一变量进行赋值
6.使用$strobe显示非阻塞赋值得信号
7.不要用#0的过程赋值
Verilog中的分层事件队列:
活动事件:阻塞赋值;计算非阻塞赋值的RHS;连续赋值;$display命令;计算输入并改变原语的输出.这些事件可能按照任意次序调度.
非活动事件:#0的阻塞赋值
非阻塞事件:更新非阻塞赋值的LHS
监视事件monitor命令;$strobe命令
经验:
在always块中使用非阻塞赋值来产生时序逻辑和锁存器
在always块中使用阻塞赋值来产生组合逻辑
在always块中使用非阻塞赋值来产生同一块中的时序和组合逻辑
在纯组合逻辑中使用非阻塞赋值可能会导致功能错误
阻塞赋值和非阻塞赋值混合使用的方式:
将组合逻辑赋值通过时序表达式表示
或者将组合逻辑赋值与时序逻辑分开,在独立的语句块中描述
不推荐在同一always块中混合使用阻塞和非阻塞赋值
几个关于非阻塞赋值的错误理解:
错误1:无法使用$display命令显示非阻塞赋值变量
正解:非阻塞赋值变量的更新在所有$display命令之后
错误2:#0让一个赋值在每个时间步的最后执行
正解:#0只会让赋值语句进入非活动事件队列
错误3:在同一always块中对同一变量进行多次非阻塞赋值是不允许的
正解:在IEEE 1364 verilog标准中定义了上述赋值,最后一个非阻塞赋值起作用
模拟开始时候的困难:
不同的模拟器,不同的模拟选项导致开始模拟时现象不同
建议: 在0时刻通过非阻塞赋值设置reset信号;
第一个半周期设置clock为0
编写Verilog代码的一些经验:
Verilog文件名和模块名相同
不要在可综合代码中使用casex语句
当在可综合代码中使用casez语句时要小心
当写case语句时,对存在不关心的cases时使用casez,使用?代替Z来表示不关心的cases
Verilog编写状态机相关:
状态机分类:Moore(输出只与当前状态相关)和Mealy(输出与当前状态和输入相关)
二进制编码和One-Hot编码
状态机的基本块:下一状态度组合逻辑;时钟同步的当前状态逻辑;输出组合逻辑
两个always块写状态机,使用三个always块,如果输出需要寄存
使用高效的One-Hot状态编码,组合输出
经验:
每个状态机作为一个独立的Verilog模块
对状态进行预定义,状态赋值使用状态名作参数,不要使用`define,多使用parameter
两个always语句块的状态机,一个always用来描述状态向量寄存器的时序逻辑.一个用来描述下一状态度组合逻辑.组合输出可以通过连续赋值语句或者在下一状态度组合always块中描述.
转:dreamdonghui.blog.163.com/blog/static/179687443201162142447377
此帖出自FPGA/CPLD论坛

最新回复

顶!!!!!!  详情 回复 发表于 2012-11-27 22:27
点赞 关注
个人签名一个人,一本书,一杯茶,一帘梦。
 

回复
举报

269

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
不要沉,我顶
此帖出自FPGA/CPLD论坛
个人签名一个人,一本书,一杯茶,一帘梦。
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 
顶起来!
此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

4
 
顶起来啊
此帖出自FPGA/CPLD论坛
 
 
 

回复

1453

帖子

18

TA的资源

纯净的硅(高级)

5
 
顶起
此帖出自FPGA/CPLD论坛
 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

6
 
简单看了,有些不会。
是个好经验
此帖出自FPGA/CPLD论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

7
 

顶!!!!!!
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表