这两个 verilog 语句是否等效,它们是否采用相同的循环?

Are these two verilog sentences equivalent, do they take the same cycles?

我想知道这两个代码是否会做同样的事情?它们之间的实际区别是什么?如果他们在做相同的操作,第二种情况是否比第一种情况快?

第一种情况,因为我要等到"cycle statement"出来才能识别"modi_varx_f"和"modi_vary_f"标志的上升,才能"activate" 在下一个循环中操作变量的增加,那么它比在第二种情况下立即执行要慢 "activate" 和 运行 在同一循环中的操作。

  1. 第一种情况:
always@(posedge clk or negedge rst) begin
    if (~rst) begin
        modi_varx_f = 0;
        modi_vary_f = 0;
    end
    else if (cond1) begin
        modi_varx_f = 1; // increase variable x on 1.
        modi_vary_f = 1; // add 3'd6 to variable.
    end
end

always@(posedge clk or negedge rst)
    if (~rst) 
        varx  = 0;
    else if (modi_varx_f)
        varx = varx + 1;
end  

always@(posedge clk or negedge rst)
    if (~rst) 
        vary  = 0;
    else if (modi_vary_f)
        vary = vary + 3'd6;
end
  1. 第二种情况:
always@(posedge clk or negedge rst) begin
    if (~rst) begin
        varx = 0;
        vary = 0;
    end
    else if (cond1) begin;
        varx = vary + 1; 
        vary = vary + 3'd6;
    end
end

只是为了总结评论流。通常,您可以将多个顺序的 always 块合并为一个而不会丢失功能。我猜你在第二个例子中犯了一个错误并使用了 varx = vary + 1; 而在第一个例子中你使用了 varx = varx + 1;。这有所不同。

但是,如果第二个示例使用 varx,那么两者是等价的。

由于您在示例中使用了顺序元素(带异步复位的触发器),根据行业惯例,您应该在那里使用非阻塞分配。折叠的正确答案应该是这样的:

always@(posedge clk or negedge rst) begin
    if (~rst) begin
        varx <= 0;
        vary <= 0;
    end
    else if (cond1) begin;
        varx <= varx + 1; // << varx
        vary <= vary + 3'd6;
    end
end