




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、这几天都在看这个经典问题,阻塞和非阻塞赋值,有点收获,也有很多疑问! 一、特点: 阻塞赋值:1、RHS的表达式计算和LHS的赋值更新,这两个动作之间不能插入其他动作,即所谓计算完毕,立即更新。
2、 2、所谓阻塞就是指在一个“begin.end”块中的多个阻塞赋值语句内,只有上一句完全执行完毕后,才会执行下一语句,否则阻塞程序的执行。 非阻塞赋值:RHS的表达式计算和LHS的赋值更新分两个节拍执行,首先,应该是RHS的表达式计算,得到新值后并不立即赋值,而是放在事件队列中等待,直到当前仿真时刻的后期才执行(原因下文会提到)。 二、Verilog的分层事件队列: 在Verilog中,事件队
3、列可以划分为5个不同的区域,不同的事件根据规定放在不同的区域内,按照优先级的高低决定执行的先后顺序,下表就列出了部分Verilog分层事件队列。其中,活跃事件的优先级最高(最先执行),而监控事件的优先级最低,而且在活跃事件中的各事件的执行顺序是随机的(注:为方便起见,在一般的仿真器中,对同一区域的不同事件是按照调度的先后关系执行的)。 当前仿真 时间事件 活跃事件 阻塞赋值,非阻塞赋值的RHS计算 非活跃事件 显式0延时的阻塞赋值 非阻塞赋值更新事件 由非阻塞语句产生的一个非阻塞赋值更新事件,并被调入当前仿真时刻。
4、 监控事件$monitor和$strobe等系统任务 将来仿真 时间事件 被调度到将来仿真时间的事件 三、结论: 由上表就可以知道,阻塞赋值属于活跃事件,会立刻执行,这就是阻塞赋值“计算完毕,立刻更新”的原因。此外,由于在分层事件队列中,只有将活跃事件中排在前面的事件调出,并执行完毕后,才能够执行下面的事件,这就可以解释阻塞赋值的第二个特点。 同样是由上表知,非阻塞赋
5、值的RHS计算属于活跃事件,而非阻塞赋值更新事件排在非活跃事件之后,因此只有仿真队列中所有的活跃事件和非活跃事件都执行完毕后,才轮到非阻塞赋值更新事件,这就是非阻塞赋值必须分两拍完成的原因。 但是我有很多疑问,何为当前仿真时间,我认为是在当前CLK触发周期内,但是我使用了很多小程序来验证非阻塞赋值的时序列,结果却与理论不同,对于这个问题,仍然在疑惑中在Verilog HDL中,有两种过程性赋值方式,即阻塞式(blocking)和非阻塞式(non-blocking)。这两种赋值方式看似差不多,其实在某些
6、情况下却有着根本的区别,如果使用不当,综合出来的结果和你所想得到的结果会相去甚远。Tip:所谓过程性赋值就是指在initial或always语句内的赋值,它只能对寄存器数 据类型的变量赋值。阻塞式(blocking)的操作符为 “ = ”非阻塞式(non-blocking)的操作符为 “ <= ”首先,我们通过两个例子来看看这两种赋值方式的区别,这里使用的综合工具为DC。例1:非阻塞式赋值module nonblock (clock,in1,in2,in3,in4,out);input c
7、lock,in1,in2,in3,in4; output out;reg out;reg f;always (posedge clock)begin f <= in2 | in3; /语句1 if (in1) out <= f
8、 & in4; /语句2 else out <= in4;endendmodule例1综合后的结果为(*注*):module nonblock ( clock, in1, in2, in3, in4, out );input clock, in1, in2, in3,
9、;in4;output out; wire f, n_6; mfntnq out_reg ( .q(out), .da(n_6), .db(in4), .sa(in1), .cp(clock) ); mfntnq f_reg ( .q(f), .da(1'b1), .db(in2),
10、;.sa(in3), .cp(clock) ); an02d1 U10 ( .z(n_6), .a1(f), .a2(in4) );endmodule为了更直观,给出相应的schematic:例2:阻塞式赋值module block (clock,in1,in2,in3,in4,out);input clock,in1,in2,in3,in4;output out;reg out;reg f;always
11、60; (posedge clock)begin f = in2 | in3; /语句1 if (in1) out = f & in4; /语句2 else out = in4;endendmodule例2综合后的结果为:module b
12、lock ( clock, in1, in2, in3, in4, out );input clock, in1, in2, in3, in4;output out;wire n_6; mfntnq out_reg ( .q(out), .da(n_6), .db(in4), .sa(in1), .cp(clock)
13、160;); oa14d0 U10 ( .z(n_6), .a1(in3), .a2(in2), .b(in4) );endmodule相应的schematic: 分析:大家可以看到,例1和例2的code写法完全一样,只是在always语句块中使用了不同的赋值方式,就导致综合出来的结果不同。在例1中,是非阻塞式赋值方式,非阻塞式赋值的赋值对象总是在当前仿真时刻结束时被赋值,所以,当在对语句2中的out赋值这一时刻, f 值还没有得到语句1
14、中的新值,而是原来的值(即上一个时刻的值)。而在例2中,使用了阻塞式赋值方式,就是在always语句块中是一句一句执行的。在执行语句2之前,语句1就已经执行完成,f被赋好了新值,所以语句2中的f值取的是新值。建议:1. 阻塞式赋值用于组合逻辑建模;2. 非阻塞式赋值用于时序逻辑建模。*注*mfntnq q = rising(cp) ? (sa&da | !sa&db) : 'p'an02d1 z = a1 & a2oa14d0 z = (a1 | a2) & b参考书目:Verilog HDL Synthesis A Practical Primer J.Bhasker补充以上内容只是非常非常简单地介绍了这两种赋值方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB31/T 628-2017在用工业热交换器能效测试及综合评价方法
- DB31/T 585-2012小菜蛾测报技术规范
- DB31/T 1395-2023绿色数据中心评价导则
- DB31/T 1335-2021医疗机构输血标本运送与废血袋回收管理规范
- DB31/T 1183-2019特种设备隐患排查治理实施指南
- DB31/T 1122-2018城市轨道交通运营评价指标体系
- DB31/T 1105-2018城市轨道交通车站服务中心服务规范
- DB31/T 1103.1-2018商务信用评价方法第1部分:酒类零售企业
- DB31/T 1050-2017猪伪狂犬病净化规程
- DB31/ 357-2015在用点燃式发动机轻型汽车简易瞬态工况法排气污染物排放限值
- 2024年山东济南初中学业水平考试生物试卷真题(含答案解析)
- 2024年01月22106宪法学期末试题答案
- 铁路项目工程测量培训
- 工程量清单【模板】
- 急救药品课件下载
- 绿化苗木供货售后服务方案
- 时代音画学习通超星期末考试答案章节答案2024年
- GB/T 6003.2-2024试验筛技术要求和检验第2部分:金属穿孔板试验筛
- 厨余垃圾处理技术
- 智能无人机销售合同
- 研发部考勤管理制度
评论
0/150
提交评论