【问题标题】:Multiple always block using for loop使用 for 循环的多个总是阻塞
【发布时间】:2020-02-25 23:10:46
【问题描述】:

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

例如。假设我们要创建一个 4 位波纹/异步计数器。

我们可以这样做

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

我知道第一种方法有效,因为我对其进行了测试。第二种方法不行,我测试了一下。有没有其他方法可以做到这一点?

【问题讨论】:

  • 如果您要为 FPGA 合成它,您可能会遇到混合逻辑和时钟这样的问题。

标签: verilog fpga


【解决方案1】:

您可以使用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

【讨论】:

  • 我隐约记得在敏感度列表中使用索引名称时收到警告消息。但这可能是特定于模拟器的......
  • 这对于学术研究来说是可以的,但是如果你在触发器中使用非时钟信号作为时钟,你可能会在模拟中得到很多惊喜。你应该改用时钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多