多个总是阻塞使用 for 循环

Multiple always block using for loop

是否可以在 Verilog 中使用 for 循环生成多个 always 语句

举个例子。假设我们要创建一个 4 位 Ripple/Asynchronous 计数器。

我们可以这样做

always @(posedge MainClock)
begin
    Q[0] = ~Q[0];
end

always @(posedge Q[0])
begin
    Q[1] = ~Q[1];
end

always @(posedge Q[1])
begin
    Q[2] = ~Q[2];
end

always @(posedge Q[2])
begin
    Q[3] = ~Q[3];
end

是否可以改为做这样的事情:

always @(posedge MainClock)
begin
    Q[0] = ~Q[0];
end

for (i = 1; i <= 3; i = i+1)
begin
   always @(posedge Q[i-1])
   begin
       Q[i] = ~Q[i];
   end
end

我知道第一种方法有效,因为我测试过。第二种方法不行,我确实测试过。有其他方法吗?

您可以使用 generate 来做到这一点:

genvar i;
generate
    for (i = 1; i <= 3; i = i+1) begin : ripple
        always @(posedge Q[i-1])
            Q[i] = ~Q[i];
    end
endgenerate