【问题标题】:verilog if-statement hardware translationverilog if 语句硬件翻译
【发布时间】:2015-03-15 04:51:01
【问题描述】:

我试图减少我的关键路径,发现以下令人困惑

          if(counter > 14) begin
             state <= ROUND1;
          end if(offset > message_size) begin
             state <= READ2;
          end

在Quartus中做了TimeQuest后,得到了硬件翻译

左侧的 4 个蓝色块是 offset &gt; message_size 的小于比较运算符。我想知道为什么有 4 个,为什么是“LessThanX~Y”而不是大于? offset 和 message_size 都是 32 位,它们位于 case 语句的 always@(posedge clk) 内。

有没有更优化的方法来编写这个 if 语句来减少我的关键路径?

【问题讨论】:

  • 您是否尝试使用 else if 而不是 if ? (第二个if
  • 您的原理图中缺少信号。

标签: optimization hardware verilog hdl


【解决方案1】:

使用always @*确保所有信号都在灵敏度列表中。当灵敏度列表不包含代码中使用的信号时,该代码将生成锁存器。

使用else 而不是再次使用if 语句。

【讨论】:

    【解决方案2】:

    32 位比较需要几个 6 输入 LUT 才能实现,所以逻辑量并不让我感到惊讶。您的原理图中似乎确实缺少很多信号,但这可能只是因为您只显示了关键路径。小于块与大于块相同,只是输入相反。我同意之前的 cmets 认为你的“end if”应该被替换为“else if”。

    现在减少关键路径只是流水线的问题。我要尝试的第一件事是在状态机代码中使用它们之前注册两个大于比较的结果。您还可以将较大的比较分为两个阶段——在周期 1 期间并行比较高 16 位和低 16 位,并在第二个周期中使用结果来完成 32 位比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多