欢迎来到天天文库
浏览记录
ID:19874598
大小:167.50 KB
页数:29页
时间:2018-10-07
《从verilog仿真原理看阻塞与非阻塞赋值》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、从Verilog仿真原理看阻塞和非阻塞赋值(续:例子)上一篇/下一篇 2006-09-1200:21:49/天气:晴朗/心情:高兴查看(577)/评论(6)/评分(4/0) 按照hwei的指示,我现在举一个例子再深入探讨一下Verilog的阻塞和非阻塞赋值,希望对大家有益,哈哈。EDA中国门户网站5ai}o 我看过很多文章都说,阻塞赋值适合组合逻辑建模,而非阻塞赋值适合时序逻辑建模。事实上,在大多数情况下,这样做是正确的。但是,在某些情况下,不能片面地这样理解。zA*egm:D&x0 下面是我以前编的一个匹配滤波器的例子,为了方便理解我截取了其中一段程序:EDA中国门
2、户网站px-{ue.P
3、 reg signed [5:0] corr_reg;EDA中国门户网站?!Hz]]1[}QzK always@(posedgeclk,negedgeSysRst_n)beginEDA中国门户网站@@:Rc3{*^7PooI if(!SysRst_n)beginEDA中国门户网站bNE%?(v ......EDA中国门户网站r*O5@~0~(?5o~ end*VG+c4x5Y%Or"i0 elsebeginX0r[3E#?@9e0 co
4、rr_reg=0;//寄存器清零3tX[,p~&v0 for(i=0;i<=10;i=i+1)beginEDA中国门户网站(
5、mi$ox+xg if(barker_code[i]==1)VlK/s(hZ-`0 corr_reg=corr_reg+funcmapping(datain_mem[i]);E_x(Y/p2`1B@$r0 //funcmapping为自定义函数,目的就是将1bit的数据映射成3位有符号数,以方便求相关值.!B{Tx$T
6、,PC-k!d2E0 n1b)bG'N&O-m0 elseif(barker_code[i]==0)EDA中国门户网站A1k.K^3PNh corr_reg=corr_reg-funcmapping(datain_mem[i]);&C3t1iW+pu6v0 end2vkM@Q"_L@AC0 .....+n,IE9b(@bz'sn0 end&]5[P?M(gZ`f6x0 end]J&@C(
7、zF4T"Z/b@!q[0 我的意图就是,通过匹配滤波的方式并行捕获扩频数据流中的隐含11位barker码,从而完成解扩中的码同步。datain_mem是11位宽的寄存器,用于存储输入数据(即barker码的扩频数据)的镜像延时。在捕获的过程中,根据本地barker码的值,来决定corr_reg是加上funcmapping(datain_mem[i])的值,还是减去,从而得到相关值。根据barker的性质可知,在理想情况下,就能够在至多11个时钟周期内,从corr_reg中得到相关峰值(因为Barker码的码长为11位),从而达到捕获barker的目的。EDA中国门户网站dN
8、O&e*bU 若采用非阻塞赋值方式,这非常符合时序建模的通用建议。但是,却发现仿真结果根本不对,现象如下:EDA中国门户网站3f+q4s(Nf9_,sQ}i 1、corr_reg无法清零,从而导致连续累加,直至溢出为止,此后往复循环重复这个过程。EDA中国门户网站D~NuBw 2、观察最初几个周期的计算结果,发现corr_reg只加了其中一部分值,而没有加完就结束了。EDA中国门户网站d9L6x-tHN"? 下面我们分析一下原因:EDA中国门户网站8U_'Rc 根据Verilog语言非阻塞赋值的特点:RHS的表达式计算和LHS的赋值更新,
9、是分两拍进行的。也就是在for循环中,只要条件成立,corr_reg就立刻进行+/—计算,但是并不马上赋值,而是将其放在等待序列事件中,等到所有的活动事件和非活动事件执行完毕后,才调出运行。这样做的结果就是:在“非阻塞赋值更新事件区域”就堆积了一系列同类型事件,按照仿真器的仿真原理,这些事件的执行顺序就和一个FIFO一样,先入先出。这里需要注意两点:1、在RHS表达式计算的过程中,corr_reg的值始终没有得到更新,这
此文档下载收益归作者所有