多个总是阻塞使用 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
是否可以在 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