HDL中的组合循环

Dax*_*ohl 3 verilog vhdl

这只是我试图包裹大脑的一个实验.

所以我有两个寄存器r1 r2和两个电线w1 w2.我想要的是,如果两个r都是1,则两个w应该是1.如果一个r是1,则相应的w应该是1而另一个应该是0.如果两个r都是0,则w1应该是1,w2应该是0.

11 => 11

10 => 10

01 => 01

00 => 10

需要注意的是,我希望w1的赋值不直接包含r2,反之亦然.所以,我有(例如在Verilog中 - VHDL答案也会非常好)

assign w1 = r1 | !w2;
assign w2 = r2 | !w1;
Run Code Online (Sandbox Code Playgroud)

这是必要但不充分的.以上所有情况都是正确的,但00 => 01也是如此.实际上当r1 = r2 = 0时,它只是创建一个没有驱动器的导线循环,所以我认为结果是非确定性的.

有没有办法得到我正在寻找的结果而不包括在w1的赋值中的r2,反之亦然?(并且不引入新变量).基本上只是为了确保在线周期中,w1被拉高并且w2被拉低?

wap*_*p26 7

不,我认为没有额外的电线/信号并且没有交叉依赖性,没有干净的方法可以做到这一点.

顺便说一句,你的"循环线"通常被称为组合循环,避免这些是一个好习惯.

  1. 对于具有组合环的VHDL模型的仿真,如果模拟器收敛到稳定点,即不再有信号值变化,则结果是确定性的.如果信号值不断变化,那么您可能会达到模拟器的迭代限制.我不知道Verilog,但我认为它也是确定性的.
  2. 至于综合,工具要么拒绝这个结构并引发错误,要么尝试处理这个问题,可能会对时间产生非常糟糕的影响.

同样,即使您的模拟正常并且您的综合工具允许这样做,也应避免使用组合循环.

  • 另一个常见名称是**组合循环**.无论如何,他们不是一个好主意. (2认同)