Verilog流水线加法器always块中应该采用阻塞赋值(=),还是非阻塞赋值(<=)?

2019-07-15 22:24发布

二级流水线加法器非阻塞赋值.png 图一
wave3.PNG
图二
二级流水线加法器阻塞赋值.png
图三
wave4.PNG
图四

最近写了一个16位二级流水线加法器,并进行了一下仿真。发现在always块中采用阻塞赋值(=)和非阻塞赋值(<=)的结果是不一样的,书上的例程以及网上很多例程的流水线加法器都采用的是阻塞赋值。
书上对流水线加法器的描述是这样的:“采用流水线,能将一个算术操作分解为一些小规模的基本操作,将进位和中间值存储在寄存器中,并在下一个时钟周期内继续运算”。
如上图所示,图一、图二是采用非阻塞赋值的代码及仿真波形图,图三、图四是采用阻塞赋值的代码及波形图。明显可以看出,采用阻塞赋值的仿真结果是在一个时钟周期内得到结果,并没有像描述的那样在每个时钟周期内分级运算,也没有体现出流水线的特点;而非阻塞赋值好像更符合“下一个时钟周期内继续运算”的描述,也体现出了流水线的执行特点。


求大神指点!




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
小白报道
1楼-- · 2019-07-16 01:04
采用阻塞赋值在这里是很危险的行为,仿真和综合的结果可能会不同,两个always执行的顺序实际上是不固定的(虽然我们理解时认为是并行执行,但是因为时钟延时,时钟实际到达寄存器的时间是不同的),不过也可能会被综合成我们想要的电路,虽然比非阻塞赋值运算结果快了一个时钟周期,不过不建议使用阻塞赋值
渊底一尾
2楼-- · 2019-07-16 02:15
小白报道 发表于 2016-09-09 10:24
采用阻塞赋值在这里是很危险的行为,仿真和综合的结果可能会不同,两个always执行的顺序实际上是不固定的(虽然我们理解时认为是并行执行,但是因为时钟延时,时钟实际到达寄存器的时间是不同的),不过也可能会被综合成我们想要的电路,虽然比非阻塞赋值运算结果快了一个时钟周期,不过不建议使用阻塞赋值

你了解流水线加法器吗?书上用的是阻塞赋值,但是仿真结果却跟我想象的不一样。我感觉非阻塞赋值的仿真结果更符合流水线执行的特点。是否是我对流水线的理解有偏差?
小白报道
3楼-- · 2019-07-16 03:23
渊底一尾 发表于 2016-9-9 10:46
你了解流水线加法器吗?书上用的是阻塞赋值,但是仿真结果却跟我想象的不一样。我感觉非阻塞赋值的仿真结果更符合流水线执行的特点。是否是我对流水线的理解有偏差?

我要是说这里用阻塞赋值是错误的,会不会有人喷死我
渊底一尾
4楼-- · 2019-07-16 07:20
小白报道 发表于 2016-09-09 11:09
我要是说这里用阻塞赋值是错误的,会不会有人喷死我

讲讲你的依据吧,我也感觉这里用阻塞赋值有问题,但是没有足够理论支撑
小白报道
5楼-- · 2019-07-16 08:40
 精彩回答 2  元偷偷看……
alasga
6楼-- · 2019-07-16 10:06
always@(posedege clk) 语句说明你要做的是同步逻辑设计,后面只能跟“非阻塞”赋值,而且你要做流水设计的话,就更应该是非阻塞赋值了;至于阻塞赋值,从语法上讲没有问题,但是最终综合成什么逻辑电路,就要完全看综合器对你这段代码的理解了,所以不同的软件版本之间,同一版本不同综合次数之间,不同的综合工具之间,最终综合结果都有可能不一样,属于不规范语法描述方式。所以不用去纠结第二代码了。
最后为什么不直接用
always@(posedge clk) begin
  {cout,sum}<=cina+cinb;
end
不知道你把它分解成,高8Bit和低8bit分别相加是想干什么 ?

一周热门 更多>