h******g 发帖数: 36 | 1 前辈们好,verilog里的blocking LHS delay有个地方不太明白,求解。
1.这篇paper page15 阐述如下例子:
http://www.sunburst-design.com/papers/CummingsSNUG1999SJ_SynthM
always @(in) begin
#25 out1 = ~in;
#40 out2 = ~in;
上例中,一旦事件被触发,在65 time unit之内的 in信号变化都会被 ignore,
也就是说out2过了65 delay后被assign的值用oldest的in值计算的。
2.这篇paper page2 阐述如下例子:
http://www.sunburst-design.com/papers/CummingsHDLCON1999_Behavi
always @(a or b or ci)
#12 {co, sum} = a + b + ci;
上例中,一旦事件被触发,在12 delay之内, a or b or ci信号变化一个就会重新
计算RHS,信号变化不会被ignore。
也就是说在#12 delay过程中,a or b or ci有了变化,被用到计算的是latest
value(不同于上例)。
我的问题是:
A.这两个例子看似都是blocking LHS delay control,为啥一个用oldest value去
evaluate,一个用latest value。。。只是verilog这么定义的?还是和仿真器
schedule statement 或 分配临时register有关?
B.应该从哪个方面去分析delay control这种问题啊,感谢了! |
h******g 发帖数: 36 | 2 话说还有一个长得很像的。。
always @(a or b or ci) begin
tmp = a + b + ci;
#12 {co, sum} = tmp;
被这几个东西弄晕了~~ |
t*****3 发帖数: 81 | 3 code 1就是说当in信号发生变化的时候,25个timeunit之后,out1发生变化,再过45个
timeunit后out2发生变化。其实可以理解为就是一个有延迟的取反电路。
code 2就是a, b,ci任何一个值发生变化,12个timeunit后,co, sum发生变化,模拟
一个有延迟的一位全加器。
LHS就是一堆逻辑的输出,RHS是输入,从输入传到输出的delay用#标识。在delay之前
LHS是不变的。
这两个code,用主流的仿真器去simulate应该都是一样。只是在模拟一种电路行为。 |
d*****i 发帖数: 27 | 4 是不是可以这样理解。只有RHS是single的话,才忽略blocking范围内的变化 |
t*****3 发帖数: 81 | 5
paper 2的意思就是只要LHS+Delay都会ignore从trigger到trigger+delay之间
sensitive list的signals变化。直接在trigger+delay时间点sample的input值。
只有 RHS+Delay+always+non_blocking assignment才不会ignore变化,会把这些变化
save to a queue然后逐个sample, +delay后输出。
【在 d*****i 的大作中提到】 : 是不是可以这样理解。只有RHS是single的话,才忽略blocking范围内的变化
|