verilog阻塞与非阻塞的初步理解(三)
下面这段源码是因为习惯不好,出现不正确波形的例子。
module pwm_division(reset,clkin,clkout);
input reset,clkin;
output clkout;
reg clkout;
reg[:] count;
always @(posedge clkin)
begin
if(!reset)
begin
clkout<=;
count<='d0;
end
else
begin
count<=count+'d1;
$display("count1=%d",count);
if(count<'d21)
clkout<=;
else
begin
clkout<=;
if(count>'d30)
begin
$display("count2=%d",count);
count='d0;//
$display("count3=%d",count);
end
end
$display("count4=%d",count); end
$display("count5=%d",count);
$strobe("count6=%d",count);
end
endmodule
$display是后来加进去的。
首先来分析下这段代码。本意是输出一个占空比为1/3的波形,但是结果却是一个20/236的波形。意思也就是count=8'd0这个操作没有起作用。
后来检查到count=8'd0是阻塞赋值,猜测出错的原因可能是同一段always语句中即有非阻塞赋值又有阻塞赋值。改为count<=8'd0;后,波形正确。
进一步分析,在代码中加入系统显示函数,发现了有趣的事情。运行仿真后得到结果:
# count1= 31
# count2= 31
# count3= 0
# count4= 0
# count5= 0
# count6= 32
可以看出,count=8'd0;这个操作是有效的。但是在下一个clk到来时,count的值还是等于原值加1。这是为什么呢?
我暂时理解如下:
阻塞操作是在赋值时右值立即等于左值,而非阻塞操作是先计算右值,而在模块结束是才更新左值。
所以count<=count+8'd1;执行后,count+1的值(右值)已计算,但是真正改变count的值(左值)是在模块的最后。所以会有上面的结果。为了证明上面的理解
我改为count=count+8'd1;执行后,count的值正确。在书上找到一段层次化事件队列的描述支持我这种理解:
参考 《Verilog数字系统设计教程 第三版》197页。
上面是错误原因的分析,但是程序肯定不能这样写。导致会出现这种错误的原因是因为程序不严谨,进一步说是因为我刚学verilog,C语言顺序执行的思想已经根深蒂固,而verilog有并行执行的语句,所以很容易出现隐藏的逻辑错误。
verilog阻塞与非阻塞的初步理解(三)的更多相关文章
- Verilog中的阻塞与非阻塞
这篇文档值得阅读 按说阻塞与非阻塞是Verilog中最基本的东西,也是老生常谈.但是最近看到很多程序里用到阻塞语句竟然不是很明白,说到底是从来没有自己仔细分析过.当然一般情况程序中也是推荐用非阻塞的. ...
- JS异步解决方案之概念理解-----------阻塞和非阻塞,同步和异步,并发和并行,单线程和多线程
首先记住一句话,JS是单线程的. 单线程意味着什么?单线程意味着 它不能依靠自己实现异步. JS实现的异步,往往都是靠 浏览器.Node 的机制(事件驱动.回调)实现的. 下面让我这个单身狗 以谈恋爱 ...
- NIO学习笔记,从Linux IO演化模型到Netty—— 究竟如何理解同步、异步、阻塞、非阻塞
我的观点 首先,分开各自理解. 1. 同步:描述两个(或者多个)个体之间的协调关系. 比如,单线程中,methodA调用了methodB,methodB返回后,methodA才往下执行,那么称A同步调 ...
- node.js中对同步,异步,阻塞与非阻塞的理解
我们都知道javascript是单线程的,node.js是一个基于Chrome V8 引擎的 javascript 运行时环境,注意 node.js 不是一门语言,别搞错了. javascript为什 ...
- 正确理解这四个重要且容易混乱的知识点:异步,同步,阻塞,非阻塞,5种IO模型
本文讨论的背景是Linux环境下的network IO,同步IO和异步IO,阻塞IO和非阻塞IO分别是什么 概念说明 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进 ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- 网络IO之阻塞、非阻塞、同步、异步总结
网络IO之阻塞.非阻塞.同步.异步总结 1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一 ...
- socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就 ...
- socket阻塞与非阻塞,同步与异步
socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网 ...
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇) 当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事. <IO - 同步,异步,阻塞,非阻塞 >是我在开始学习e ...
随机推荐
- Bean 的作用域
•在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域. 默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实 ...
- JS实现打印功能
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t ...
- 【BZOJ-1468】Tree 树分治
1468: Tree Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1025 Solved: 534[Submit][Status][Discuss] ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
- css设置background图片的位置实现居中
/* 例 1: 默认值 */ background-position: 0 0; /* 元素的左上角 */ /* 例 2: 把图片向右移动 */ background-position: 75px 0 ...
- ueditor的优酷插件模式开发,目前开发了腾讯视频转换插件
项目相关地址 源码:https://github.com/easonjim/ueditor_plugin bug提交:https://github.com/easonjim/ueditor_plugi ...
- UDP打洞、P2P组网方式研究
catalogue . NAT概念 . P2P概念 . UDP打洞 . P2P DEMO . ZeroNet P2P 1. NAT概念 在STUN协议中,根据内部终端的地址(LocalIP:Local ...
- dedecms /member/resetpassword.php SQL Injection Vul
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 DEDEcms SQL注入漏洞导致可以修改任意用户密码 2. 漏洞触发条 ...
- Android开发环境搭建中的一些小问题记录
1.由于市场上大多数教程是基于Eclipse,而AndroidStudio显然是大势所趋,所有我在电脑上同时搭建了两个IDE,直接在官网下载AndroidStudio比较好,因为SDK,AVD都集成了 ...
- Web 使用PostMan提交特殊格式数据
使用PostMan 选择POST模式中的RAW模式 然后点击Headers添加Content-Type 类型比如是 application/json 然后就可以在body中以Json格式上传数据了 前 ...