从Verilog仿真原理看阻塞和非阻塞赋值文档格式.docx
- 文档编号:15309447
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:23
- 大小:91.18KB
从Verilog仿真原理看阻塞和非阻塞赋值文档格式.docx
《从Verilog仿真原理看阻塞和非阻塞赋值文档格式.docx》由会员分享,可在线阅读,更多相关《从Verilog仿真原理看阻塞和非阻塞赋值文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
EDA中国门户网站_p_x-{_ue.P|
reg
signed
[5:
0]
corr_reg;
EDA中国门户网站_?
!
H_z_]_]1[}_QzK
always@(posedgeclk,negedgeSysRst_n)beginEDA中国门户网站
@@:
R_c3{*^7Po_oI
if(!
SysRst_n)beginEDA中国门户网站b
NE%?
(v
......EDA中国门户网站
r*O5@_~0~(?
5o_~
end
*VG+c4x5Y%Or"
i0
elsebegin
X0r_[3E#?
_@9e0
corr_reg=0;
//寄存器清零
3t_X_[,p_~&
v0
for(i=0;
i<
=10;
i=i+1)beginEDA中国门户网站(|_mi$ox+x_g
if(barker_code[i]==1)
_V_l_K/s(hZ-`0
corr_reg=corr_reg+funcmapping(datain_mem[i]);
_E__x(Y/p2`1B_@$r0
//funcmapping为自定义函数,目的就是将1bit的数据映射成3位有符号数,以方便求相关值.
B_{_T_x$T,P_C\-k!
d2E0
_n1b)b_G'
N&
O-m0
elseif(barker_code[i]==0)EDA中国门户网站_A1k.K^3P_N_h
corr_reg=corr_reg-funcmapping(datain_mem[i]);
&
C3t1i_W+p_u6v0
2v
k_M_@_Q"
__L_@_A
C0
.....
+n,IE9b(@_b_z'
s_n0
]5[_P_?
_M(g_Z`
f6x0
_]_J&
@_C(z_F4T"
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中国门户网站_d_N_O&
e*b_U
若采用非阻塞赋值方式,这非常符合时序建模的通用建议。
但是,却发现仿真结果根本不对,现象如下:
EDA中国门户网站3f+q4s(N_f9_,s_Q_}_i
1、corr_reg无法清零,从而导致连续累加,直至溢出为止,此后往复循环重复这个过程。
EDA中国门户网站_D_~_N_uB_w
2、观察最初几个周期的计算结果,发现corr_reg只加了其中一部分值,而没有加完就结束了。
EDA中国门户网站_d9L6x-tH_N"
?
下面我们分析一下原因:
EDA中国门户网站8U___\'
R_c
根据Verilog语言非阻塞赋值的特点:
RHS的表达式计算和LHS的赋值更新,是分两拍进行的。
也就是在for循环中,只要条件成立,corr_reg就立刻进行+/—计算,但是并不马上赋值,而是将其放在等待序列事件中,等到所有的活动事件和非活动事件执行完毕后,才调出运行。
这样做的结果就是:
在“非阻塞赋值更新事件区域”就堆积了一系列同类型事件,按照仿真器的仿真原理,这些事件的执行顺序就和一个FIFO一样,先入先出。
这里需要注意两点:
1、在RHS表达式计算的过程中,corr_reg的值始终没有得到更新,这就根本没有起到循环累加的目的。
2、到可以更新的时候,多个同类的赋值事件按照FIFO的方式执行,这样只有最后一个表达式计算的值得以更新,先前的被覆盖了,而且最开始的寄存器清零就更不可能实现了。
由此,便可以解释上述的两个错误。
_h_v2Wg}
m*A0
我们再看一下这个匹配滤波器的设计,倘然要是实现最终的正确结果,有两个条件必须满足:
1、corr_reg寄存器应在每轮计算之前先清零,防止累加。
2、必须保证corr_reg寄存器值时时更新。
由此,我们就可以很清楚的看到,阻塞赋值的方式能够保证实现这两个条件,非常适合于描述此类建模。
EDA中国门户网站%U_R"
_#V_m;
@_G*z
我想这就是为什么在某些情况下,不能片面地理解“阻塞赋值适合组合逻辑建模,而非阻塞赋值适合时序逻辑建模”这句话的原因吧。
EDA中国门户网站%i_U_j_]9_)Wa7^
Verilog非阻塞赋值的仿真/综合问题
时间:
2007-01-31
来源:
七八零一研究所
作者:
点击:
1682
字体大小:
【大中小】
源文件作者:
CliffordE.Cummings
(SunburstDesign,Inc.)
原标题:
NonblockingAssignmentsinVerilogSynthesis,CodingStylesThatKill!
ATTN:
所有括号内“外注”为理解方便或有疑问的地方,原文里并没有。
所有翻译都是为遵循“共同进步”的理想但并没有去努力得到原作者的任何书面和其它方式许可,所以仅供大家参考。
本人英文和设计水平都极有限,所以不能保证与原文的精确一致和正确(只能以“驽马十步”稍作安慰吧),惭愧之后还希望大家多指教!
在Verilog语言最难弄明白的结构中“非阻塞赋值”要算一个。
甚至是一些很有经验的工程师也不完全明白“非阻塞赋值”在仿真器(符合IEEE标准的)里是怎样被设定执行的,以及什么时候该用“非阻塞赋值”。
这篇文章将介绍怎样设定“非阻塞赋值”和“阻塞赋值”,给出了重要的使得编码可以被正确地综合的编码指导方针,和避免仿真竞争的编码风格细节。
1.0介绍
众所周知的逻辑建模方针是:
*在always块里用“阻塞赋值=”产生组合逻辑。
*在always块里用“非阻塞赋值<
=”产生时序逻辑。
但是为什么?
(外注:
在实现组合逻辑的assign结构中,当然采用阻塞赋值语句否则的话编译工具会提醒你进行修改的。
)
普通的回答是:
那只是关于仿真的,即使不遵照上面的规则也照样可以产生正确的综合结果。
但问题是综合前的仿真结果也许会跟综合后的电路行为仿真不匹配。
要明白上述建模方针背后的原因,就必须明白“非阻塞赋值”和“阻塞赋值”它们的功能和时序安排(thefunctionalityandschedulingofblockingandnonblockingassignments.)。
这篇文章将详细描述有关问题。
文章里将用到两个缩写形式:
RHS(right-hand-side)和LHS
(left-hand-side)。
前者指等式右边的表达式或者变量(RHSexpressionorRHSvariable),后者指指等式左边的表达式或者变量(RHSexpressionorRHSvariable)。
2.0Verilog
仿真竞争条件
IEEEVerilogStandard[2]定义:
“保证性的赋值描述”和“非保证性的赋值”描述分别用“非阻塞赋值”和“阻塞赋值”。
("
Determinism"
section5.4.1;
"
Nondeterminism"
section5.4.2&
"
Raceconditions"
section5.5)
IEEEVerilog标准允许在同一仿真时间里赋值竞争的产生。
当赋值陈述有所不同时,会产生不同的结果。
(译注:
即可以认为:
“非阻塞赋值”有更高的优先权对变量进行赋值或者是指陈述的次序不同会产生不同结果?
)
为了避免含竞争的描述(racecondition),明白Verilog“非阻塞赋值”和“阻塞赋值”
的时序安排是非常重要的。
3.0
阻塞赋值(blockingassignments)
阻塞赋值由等号“=”表示。
“阻塞赋值”由它的赋值操作行为而得名:
当没有其它的Verilog描述可以打断“阻塞赋值”时,操作将会估计RHS的值并完成赋值。
“阻塞”即是说在当前的赋值完成前阻塞其它类型的赋值任务。
一个例外是:
对阻塞操作的RHS进行延时(delays)的阻塞赋值(在延时未完成前不会阻塞其它赋值任务),但是这被我们认为是不好的编码方式。
“阻塞赋值“可以看作一步进程(one-stepprocess):
当没有其它可以打断赋值的描述时,估计等式右边(RHS)的指并赋予左边(LHS)。
在同一个always块里面,阻塞赋值结果将一直持续下去直到赋值结束。
阻塞赋值的一个问题是:
当一个程序块(比如always块)阻塞赋值描述里面的“RHS变量”
同时是另外一个程序块(比如always块)阻塞赋值描述里面的“LHS变量”,并且两个等式的执行被安排在同一个仿真时间步里面执行(比如同一个时钟上升沿),那么竞争条件就产生了,这样的情况下其执行次序将是未知的。
为了举例说明这种情况,请看Verilog代码描述的例一:
modulefbosc1(y1,y2,clk,rst);
outputy1,y2;
inputclk,rst;
regy1,y2;
always@(posedgeclkorposedgerst)
if(rst)y1=0;
//reset
elsey1=y2;
if(rst)y2=1;
//preset
elsey2=y1;
endmodule
Example1-Feedbac
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Verilog 仿真 原理 阻塞 赋值