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 ...
 
随机推荐
- 让script的type属性等于text/html
			
type属性为text/html的时候,<script>片断中定义一个被JS调用的代码,代码不会在页面上显示 <script id="commentTemplate&quo ...
 - 安装完ActivePython后Python的Idle窗口打不开也卸载不掉的解决方法
			
1.想找一个好的PythonIDE开发环境所以就安装了ActivePython开发公具,结果发现软件打不开,机器上装的Python环境也不能用了,网上相关的解决方法也是寥寥无几...真悲催! 2.后来 ...
 - BIEE11G配置Oracle数据源
			
注:数据库发生变化只需要修改视图层 两种方式: (1) 在BIEE自带的Oracle客户端目录下的tnsname.ora文件中配置 把E:\app\Administrator\produc ...
 - BZOJ 4385: [POI2015]Wilcze doły
			
4385: [POI2015]Wilcze doły Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 648 Solved: 263[Submit][ ...
 - 【BZOJ-3555】企鹅QQ       字符串Hash
			
3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1545 Solved: 593[Submit][Statu ...
 - CruiseControl.NET/CCNET配置(SVN+MSBuild+BAT+FTP)
			
CCNET目前最新版本为1.8.5,官方很久没更新过了,如果投入生成环境使用,建议全部转到Jenkins上. 可以直接在这里下载:http://www.cnblogs.com/EasonJim/p/5 ...
 - [IOS swift对比oc]
			
http://www.cocoachina.com/industry/20140605/8686.html WWDC 2014上苹果再次惊世骇俗的推出了新的编程语言Swift 雨燕, 这个消息会前没有 ...
 - C++ 之const Member Functions
			
Extraction from C++ primer 5th Edition 7.1.2 The purpose of the const that follows the parameter lis ...
 - Vijos 1816统计数字(计数排序)
			
传送门 Description 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自 ...
 - Beta版本冲刺第二天 12.6
			
一.站立式会议照片: 二.项目燃尽图: 三.项目进展: 成 员 昨天完成任务 今天完成任务 第三天冲刺要做任务 问题困难 心得体会 胡泽善 完成了"记住密码"的的逻辑以及BUG修改 ...