【 Verilog HDL 】正确的变量访问思路
以前对这个话题也写了至少两次了,很多人在编写HDL程序时候,也时常遇到这个问题,那就是多驱动问题,今天终于看到了规范的说法了。
Modelsim下进行功能仿真没问题,可是在ISE综合报错,如何解决?
上面两篇博文均有涉及,今天就规范的总结一下:
访问思路简述
变量的访问思路,简而言之就是“一写多读”,即如果有多个并行语句需要操作一个变量时,有且只能有一个固定的并行语句可以对变量进行写操作,(变量在赋值符号的左侧),而所有的并行语句都可以对变量进行读操作(变量在赋值符号的右侧)。因为一个变量只能有一个驱动源,如果被多个驱动源驱动,就会产生冲突。其实很多理解,这就比如在一个教室里上课,学生可以有很多个,但老师只能有一个,否则,讲台上站着数理化等一干老师,同时开讲,那学生到底听谁的呢?
如下写变量代码就会出错:
-
always@( a )
-
c = a;
-
always@( b )
-
c = b; //multi-driver
而下面的读变量代码没有任何问题:
-
always@( a )
-
c = a;
-
always@( a )
-
d = ~a;
写变量注意事项
关于“一写”,要把握一个原则,就是每次动作只能修改一次变量的值。
动作可以分为组合动作和时序动作,组合逻辑输入信号的每一次变化称为一个组合动作,而时钟信号的每一次有效沿称为一个时序动作。
所谓“每次动作只能修改一次变量的值”,对于组合动作来说,由于输入唯一确定输出,因此组合动作发生后,输出只可能变化一次;对于时序动作来说,由于输出取决于时钟有效沿到来时刻的输入值,因此输出也只可能变化一次。
在代码设计时,凡是与上述思路不符合的写变量操作都是无法实现的,例如下面的代码就想在一次动作发生后改变两次变量的值,但这是无法实现的:
-
always@( a, b )
-
begin
-
c = a;
-
c = b;
-
end
-
//错误的组合动作思路
-
always@(posedge clk)
-
begin
-
d <= a;
-
d <= b;
-
-
end
-
//错误的时序动作思路
上述代码并不会造成编译错误,事实上,这属于赋值冲突问题。
读变量注意事项
关于“多读”,其实就是说该变量可以作为多个并行语句的输入变量,无论这些语句是描述时序逻辑还是组合逻辑的。不过当读变量的并行语句同时也是那唯一的一条写变量并行语句时,一定要注意避免引入反馈,否则要么不能综合,要么不能仿真。如下:
-
//错误的代码
-
always@(a)
-
begin
-
-
c = a^c;
-
end
如下的代码是没有任何问题的:
-
always@( posedge clk )
-
begin
-
c <= a^c;
-
end
这是因为时序逻辑是在时钟有效沿才将输入搬移到输出的,其反馈路径实际上是被触发器截断了的,因此确切地说上述时序逻辑代码中的不应该叫反馈。
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/82794001
- 点赞
- 收藏
- 关注作者
评论(0)