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

举报
李锐博恩 发表于 2021/07/15 05:32:01 2021/07/15
【摘要】 以前对这个话题也写了至少两次了,很多人在编写HDL程序时候,也时常遇到这个问题,那就是多驱动问题,今天终于看到了规范的说法了。 Modelsim下进行功能仿真没问题,可是在ISE综合报错,如何解决? Verilog HDL 使用规范(一) 上面两篇博文均有涉及,今天就规范的总结一下: 访问思路简述 变量的访问思路,简而言之就是“一写多读”,即如果有多个并行语句需要操...

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

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

Verilog HDL 使用规范(一)

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

访问思路简述

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

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


  
  1. always@( a )
  2. c = a;
  3. always@( b )
  4. c = b; //multi-driver

而下面的读变量代码没有任何问题:


  
  1. always@( a )
  2. c = a;
  3. always@( a )
  4. d = ~a;

写变量注意事项

关于“一写”,要把握一个原则,就是每次动作只能修改一次变量的值。

动作可以分为组合动作和时序动作,组合逻辑输入信号的每一次变化称为一个组合动作,而时钟信号的每一次有效沿称为一个时序动作。

所谓“每次动作只能修改一次变量的值”,对于组合动作来说,由于输入唯一确定输出,因此组合动作发生后,输出只可能变化一次;对于时序动作来说,由于输出取决于时钟有效沿到来时刻的输入值,因此输出也只可能变化一次。

在代码设计时,凡是与上述思路不符合的写变量操作都是无法实现的,例如下面的代码就想在一次动作发生后改变两次变量的值,但这是无法实现的:


  
  1. always@( a, b )
  2. begin
  3. c = a;
  4. c = b;
  5. end
  6. //错误的组合动作思路

  
  1. always@(posedge clk)
  2. begin
  3. d <= a;
  4. d <= b;
  5. end
  6. //错误的时序动作思路

上述代码并不会造成编译错误,事实上,这属于赋值冲突问题。


读变量注意事项

关于“多读”,其实就是说该变量可以作为多个并行语句的输入变量,无论这些语句是描述时序逻辑还是组合逻辑的。不过当读变量的并行语句同时也是那唯一的一条写变量并行语句时,一定要注意避免引入反馈,否则要么不能综合,要么不能仿真。如下:


  
  1. //错误的代码
  2. always@(a)
  3. begin
  4. c = a^c;
  5. end

如下的代码是没有任何问题的:


  
  1. always@( posedge clk )
  2. begin
  3. c <= a^c;
  4. end

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

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/82794001

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。