【 Verilog HDL 】正确的变量访问思路

版权声明:本博客内容来自于个人学习过程中的总结,参考了互联网以及书本、论文等上的内容,仅供学习交流使用,如有侵权,请联系我会重写!转载请注明地址! https://blog.csdn.net/Reborn_Lee/article/details/82794001

以前对这个话题也写了至少两次了,很多人在编写HDL程序时候,也时常遇到这个问题,那就是多驱动问题,今天终于看到了规范的说法了。

Modelsim下进行功能仿真没问题,可是在ISE综合报错,如何解决?

Verilog HDL 使用规范(一)

上面两篇博文均有涉及,今天就规范的总结一下:

访问思路简述

变量的访问思路,简而言之就是“一写多读”,即如果有多个并行语句需要操作一个变量时,有且只能有一个固定的并行语句可以对变量进行写操作,(变量在赋值符号的左侧),而所有的并行语句都可以对变量进行读操作(变量在赋值符号的右侧)。因为一个变量只能有一个驱动源,如果被多个驱动源驱动,就会产生冲突。其实很多理解,这就比如在一个教室里上课,学生可以有很多个,但老师只能有一个,否则,讲台上站着数理化等一干老师,同时开讲,那学生到底听谁的呢?

如下写变量代码就会出错:

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

这是因为时序逻辑是在时钟有效沿才将输入搬移到输出的,其反馈路径实际上是被触发器截断了的,因此确切地说上述时序逻辑代码中的不应该叫反馈。

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82794001
今日推荐