Verilog 始终阻止行为不符合预期

Verilog 始终阻止行为不符合预期,verilog,Verilog,我正在用verilog制作一个状态机,根据用户输入实现某些算术函数。然而,我遇到了一个障碍;我的第一个always块(处理我的重置并保持正确状态的块)的行为不符合预期;它没有正确更新状态。代码如下: always @ (posedge CLOCK_50 or negedge RESET) begin if(RESET == 1'b0) STATE <= BASE; else STATE <= NEXT_STATE; // this a

我正在用verilog制作一个状态机,根据用户输入实现某些算术函数。然而,我遇到了一个障碍;我的第一个always块(处理我的重置并保持正确状态的块)的行为不符合预期;它没有正确更新状态。代码如下:

always @ (posedge CLOCK_50 or negedge RESET) begin
    if(RESET == 1'b0)
        STATE <= BASE;
    else 
        STATE <= NEXT_STATE; // this always block, and specifically this line, is //not executing correctly.
end
始终@(posedge时钟_50或negedge重置)开始
如果(重置==1'b0)

啊,我知道你现在做了什么。您在两个always块(
STATE每个always块以及always块外的每个语句)中分配
STATE
,有效地并行运行

因为“状态”是由两个始终块驱动的,所以实际上是将两条导线馈入一条导线中。在数字逻辑设计中,你无法做到这一点。(不包括上拉电阻等,但这是另一个主题。)

在模拟中,如果驱动该单根导线的多条导线具有相同的逻辑值,则可以获得所需的输出;但如果它们具有不同的值,则将获得无效或不可预测的输出

在合成中,这将简单地失败,并出现“多个驱动程序”错误

此外,always块的灵敏度列表中应包含以下三项之一:

  • 时钟和异步复位
  • 用作该始终块(*)输入的每条导线/寄存器
  • 任何其他情况都可能导致意外闩锁,从而导致问题

    在案例3中,您需要确保always块中驱动的每条导线都有一个默认值。其他任何操作都可能导致意外锁存


    最后,你不能有循环赋值,否则你会冒逻辑循环的风险。你可以通过把下一个状态赋值给它自己来实现。任何“循环”的东西需要一个触发器,也就是上面概述的类型1或类型2的always块。

    波形上的
    CLOCK_50
    在哪里?我只看到一个名为
    CLOCK
    的信号。啊,对不起,只是从测试台到模块实例化的名称有所不同。它们是相同的信号。如果你显示实际的时钟并重置cor,我会更有信心波形(模块内部的波形)。除了时钟或复位未连接之外,我看不出任何原因,当时钟上升时,
    STATE
    不取
    NEXT_STATE
    的值。当然,我会制作一个新波形。@Tim ok在OP中创建新波形。