从Verilog仿真原理看阻塞与非阻塞赋值.doc

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
从Verilog仿真原理看阻塞与非阻塞赋值

从Verilog仿真原理看阻塞和非阻塞赋值(续:例子) HYPERLINK /mon.php?action=viewspaceop=upitemid=2357uid=77837 上一篇 / HYPERLINK /mon.php?action=viewspaceop=nextitemid=2357uid=77837 下一篇 ?2006-09-12 00:21:49 / 天气: 晴朗 / 心情: 高兴 HYPERLINK /html/37/77837-2357.html \l xspace-tracks#xspace-tracks 查看( 577 ) / HYPERLINK /html/37/77837-2357.html \l xspace-itemreply#xspace-itemreply 评论( 6 ) / HYPERLINK /html/37/77837-2357.html \l xspace-itemform#xspace-itemform 评分( 4 / 0 ) ?? 按照hwei的指示,我现在举一个例子再深入探讨一下Verilog的阻塞和非阻塞赋值,希望对大家有益,哈哈。 ?? 我看过很多文章都说,阻塞赋值适合组合逻辑建模,而非阻塞赋值适合时序逻辑建模。事实上,在大多数情况下,这样做是正确的。但是,在某些情况下,不能片面地这样理解。 ?? 下面是我以前编的一个匹配滤波器的例子,为了方便理解我截取了其中一段程序: ?? reg? signed? [5:0]? corr_reg; ?? always @ (posedge clk,negedge SysRst_n) begin ???????? if (!SysRst_n) begin ??????????? ...... ???????? end ???????? else begin ??????????????? corr_reg = 0; //寄存器清零 ??????????? for (i = 0;i = 10;i = i + 1) begin ??????????????? if (barker_code[i] == 1) ??????????????????? corr_reg = corr_reg + funcmapping(datain_mem[i]); ??????????????????? //funcmapping为自定义函数,目的就是将1bit的数据映射成3位有符号数,以方便求相关值. ??????????????? ??????????????? else if (barker_code[i] == 0) ??????????????????? corr_reg = corr_reg - funcmapping(datain_mem[i]); ??????????? end ??????????? ..... ???????? end ??? end ??? 我的意图就是,通过匹配滤波的方式并行捕获扩频数据流中的隐含11位barker码,从而完成解扩中的码同步。datain_mem是11位宽的寄存器,用于存储输入数据(即barker码的扩频数据)的镜像延时。在捕获的过程中,根据本地barker码的值,来决定corr_reg是加上funcmapping(datain_mem[i])的值,还是减去,从而得到相关值。根据barker的性质可知,在理想情况下,就能够在至多11个时钟周期内,从corr_reg中得到相关峰值(因为Barker码的码长为11位),从而达到捕获barker的目的。 ??? 若采用非阻塞赋值方式,这非常符合时序建模的通用建议。但是,却发现仿真结果根本不对,现象如下: ??? 1、corr_reg无法清零,从而导致连续累加,直至溢出为止,此后往复循环重复这个过程。 ??? 2、观察最初几个周期的计算结果,发现corr_reg只加了其中一部分值,而没有加完就结束了。 ??? 下面我们分析一下原因: ??? 根据Verilog语言非阻塞赋值的特点:RHS的表达式计算和LHS的赋值更新,是分两拍进行的。也就是在for循环中,只要条件成立,corr_reg就立刻进行+/—计算,但是并不马上赋值,而是将其放在等待序列事件中,等到所有的活动事件和非活动事件执行完毕后,才调出运行。这样做的结果就是:在“非阻塞赋值更新事件区域”就堆积了一系列同类型事件,按照仿真器的仿真原理,这些事件的执行顺序就和一个FIFO一样,先入先出。这里需要注意两点:1、在RHS表达式计算的过程中,corr_reg的值始终没有得到更新,这就根本没有起到循环累加的目的。2、到可以更新的时候,多个同类的赋值事件按照FIFO的方式执行,这样只有最后一个表达式计

文档评论(0)

jgx3536 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档